Skip to content

Commit

Permalink
Merge pull request #334 from PinguApps/312-delete-team-membership
Browse files Browse the repository at this point in the history
Implemented Get team membership
  • Loading branch information
pingu2k4 authored Oct 20, 2024
2 parents e12171b + 8b06832 commit d21f7a0
Show file tree
Hide file tree
Showing 13 changed files with 286 additions and 25 deletions.
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,11 +141,11 @@ string emailAddressOrErrorMessage = userResponse.Result.Match(

## ⌛ Progress
<!-- `red` for first third, `gold` for second third, `forestgreen` for final third, `blue` for 100% -->
![Server & Client - 116 / 318](https://img.shields.io/badge/Server_&_Client-116%20%2F%20318-gold?style=for-the-badge)
![Server & Client - 118 / 318](https://img.shields.io/badge/Server_&_Client-118%20%2F%20318-gold?style=for-the-badge)

![Server - 61 / 225](https://img.shields.io/badge/Server-61%20%2F%20225-red?style=for-the-badge)
![Server - 62 / 225](https://img.shields.io/badge/Server-62%20%2F%20225-red?style=for-the-badge)

![Client - 55 / 93](https://img.shields.io/badge/Client-55%20%2F%2093-gold?style=for-the-badge)
![Client - 56 / 93](https://img.shields.io/badge/Client-56%20%2F%2093-gold?style=for-the-badge)

### 🔑 Key
| Icon | Definition |
Expand Down Expand Up @@ -256,7 +256,7 @@ string emailAddressOrErrorMessage = userResponse.Result.Match(
| [Update Phone Verification](https://appwrite.io/docs/references/1.6.x/server-rest/users#updatePhoneVerification) |||

### Teams
![Teams - 16 / 26](https://img.shields.io/badge/Teams-16%20%2F%2026-gold?style=for-the-badge)
![Teams - 18 / 26](https://img.shields.io/badge/Teams-18%20%2F%2026-gold?style=for-the-badge)

| Endpoint | Client | Server |
|:-:|:-:|:-:|
Expand All @@ -267,7 +267,7 @@ string emailAddressOrErrorMessage = userResponse.Result.Match(
| [Delete Team](https://appwrite.io/docs/references/1.6.x/client-rest/teams#delete) |||
| [List Team Memberships](https://appwrite.io/docs/references/1.6.x/client-rest/teams#listMemberships) |||
| [Create Team Membership](https://appwrite.io/docs/references/1.6.x/client-rest/teams#createMembership) |||
| [Get Team Membership](https://appwrite.io/docs/references/1.6.x/client-rest/teams#getMembership) | | |
| [Get Team Membership](https://appwrite.io/docs/references/1.6.x/client-rest/teams#getMembership) | | |
| [Update Membership](https://appwrite.io/docs/references/1.6.x/client-rest/teams#updateMembership) |||
| [Delete Team Membership](https://appwrite.io/docs/references/1.6.x/client-rest/teams#deleteMembership) |||
| [Update Team Membership Status](https://appwrite.io/docs/references/1.6.x/client-rest/teams#updateMembershipStatus) |||
Expand Down
8 changes: 7 additions & 1 deletion src/PinguApps.Appwrite.Client/Clients/ITeamsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,13 @@ public interface ITeamsClient
/// <param name="request">The request content</param>
/// <returns>204 success code</returns>
Task<AppwriteResult> DeleteTeamMembership(DeleteTeamMembershipRequest request);
[Obsolete("This method hasn't yet been implemented!")]

/// <summary>
/// Get a team member by the membership unique id. All team members have read access for this resource.
/// <para><see href="https://appwrite.io/docs/references/1.6.x/client-rest/teams#getMembership">Appwrite Docs</see></para>
/// </summary>
/// <param name="request">The request content</param>
/// <returns>The membership</returns>
Task<AppwriteResult<Membership>> GetTeamMembership(GetTeamMembershipRequest request);
[Obsolete("This method hasn't yet been implemented!")]
Task<AppwriteResult<Membership>> UpdateMembership(UpdateMembershipRequest request);
Expand Down
19 changes: 17 additions & 2 deletions src/PinguApps.Appwrite.Client/Clients/TeamsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using PinguApps.Appwrite.Client.Internals;
using PinguApps.Appwrite.Client.Utils;
using PinguApps.Appwrite.Shared;
using PinguApps.Appwrite.Shared.Enums;
using PinguApps.Appwrite.Shared.Requests.Teams;
using PinguApps.Appwrite.Shared.Responses;

Expand Down Expand Up @@ -130,6 +131,7 @@ public async Task<AppwriteResult<Membership>> CreateTeamMembership(CreateTeamMem
{
try
{
request.ValidationContext = ValidationContext.Client;
request.Validate(true);

var result = await _teamsApi.CreateTeamMembership(GetCurrentSessionOrThrow(), request.TeamId, request);
Expand Down Expand Up @@ -159,9 +161,22 @@ public async Task<AppwriteResult> DeleteTeamMembership(DeleteTeamMembershipReque
}
}

[ExcludeFromCodeCoverage]
/// <inheritdoc/>
public Task<AppwriteResult<Membership>> GetTeamMembership(GetTeamMembershipRequest request) => throw new NotImplementedException();
public async Task<AppwriteResult<Membership>> GetTeamMembership(GetTeamMembershipRequest request)
{
try
{
request.Validate(true);

var result = await _teamsApi.GetTeamMembership(GetCurrentSessionOrThrow(), request.TeamId, request.MembershipId);

return result.GetApiResponse();
}
catch (Exception e)
{
return e.GetExceptionResponse<Membership>();
}
}

[ExcludeFromCodeCoverage]
/// <inheritdoc/>
Expand Down
17 changes: 9 additions & 8 deletions src/PinguApps.Appwrite.Playground/App.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,23 @@ public async Task Run(string[] args)
{
_client.SetSession(_session);

var request = new DeleteTeamMembershipRequest()
var request = new CreateTeamMembershipRequest()
{
TeamId = "67142b78001c379958cb",
MembershipId = "671448a87af3cd4babc7"
Email = "[email protected]",
Name = "Pingu"
};

//var clientResponse = await _client.Teams.CreateTeamMembership(request);
var clientResponse = await _client.Teams.CreateTeamMembership(request);

//Console.WriteLine(clientResponse.Result.Match(
// result => result.ToString(),
// appwriteError => appwriteError.Message,
// internalError => internalError.Message));
Console.WriteLine(clientResponse.Result.Match(
result => result.ToString(),
appwriteError => appwriteError.Message,
internalError => internalError.Message));

Console.WriteLine("############################################################################");

var serverResponse = await _server.Teams.DeleteTeamMembership(request);
var serverResponse = await _server.Teams.CreateTeamMembership(request);

Console.WriteLine(serverResponse.Result.Match(
result => result.ToString(),
Expand Down
8 changes: 7 additions & 1 deletion src/PinguApps.Appwrite.Server/Clients/ITeamsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,13 @@ public interface ITeamsClient
/// <param name="request">The request content</param>
/// <returns>204 success code</returns>
Task<AppwriteResult> DeleteTeamMembership(DeleteTeamMembershipRequest request);
[Obsolete("This method hasn't yet been implemented!")]

/// <summary>
/// Get a team member by the membership unique id. All team members have read access for this resource.
/// <para><see href="https://appwrite.io/docs/references/1.6.x/server-rest/teams#getMembership">Appwrite Docs</see></para>
/// </summary>
/// <param name="request">The request content</param>
/// <returns>The membership</returns>
Task<AppwriteResult<Membership>> GetTeamMembership(GetTeamMembershipRequest request);
[Obsolete("This method hasn't yet been implemented!")]
Task<AppwriteResult<Membership>> UpdateMembership(UpdateMembershipRequest request);
Expand Down
19 changes: 17 additions & 2 deletions src/PinguApps.Appwrite.Server/Clients/TeamsClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using PinguApps.Appwrite.Server.Internals;
using PinguApps.Appwrite.Server.Utils;
using PinguApps.Appwrite.Shared;
using PinguApps.Appwrite.Shared.Enums;
using PinguApps.Appwrite.Shared.Requests.Teams;
using PinguApps.Appwrite.Shared.Responses;

Expand Down Expand Up @@ -130,6 +131,7 @@ public async Task<AppwriteResult<Membership>> CreateTeamMembership(CreateTeamMem
{
try
{
request.ValidationContext = ValidationContext.Server;
request.Validate(true);

var result = await _teamsApi.CreateTeamMembership(request.TeamId, request);
Expand Down Expand Up @@ -159,9 +161,22 @@ public async Task<AppwriteResult> DeleteTeamMembership(DeleteTeamMembershipReque
}
}

[ExcludeFromCodeCoverage]
/// <inheritdoc/>
public Task<AppwriteResult<Membership>> GetTeamMembership(GetTeamMembershipRequest request) => throw new NotImplementedException();
public async Task<AppwriteResult<Membership>> GetTeamMembership(GetTeamMembershipRequest request)
{
try
{
request.Validate(true);

var result = await _teamsApi.GetTeamMembership(request.TeamId, request.MembershipId);

return result.GetApiResponse();
}
catch (Exception e)
{
return e.GetExceptionResponse<Membership>();
}
}

[ExcludeFromCodeCoverage]
/// <inheritdoc/>
Expand Down
7 changes: 7 additions & 0 deletions src/PinguApps.Appwrite.Shared/Enums/ValidationContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace PinguApps.Appwrite.Shared.Enums;
public enum ValidationContext
{
None,
Client,
Server
}
12 changes: 11 additions & 1 deletion src/PinguApps.Appwrite.Shared/Requests/BaseRequest.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
using FluentValidation;
using System.Text.Json.Serialization;
using FluentValidation;
using FluentValidation.Results;
using PinguApps.Appwrite.Shared.Attributes;
using PinguApps.Appwrite.Shared.Enums;

namespace PinguApps.Appwrite.Shared.Requests;

Expand All @@ -12,6 +15,13 @@ public abstract class BaseRequest<TRequest, TValidator>
where TRequest : class
where TValidator : IValidator<TRequest>, new()
{
/// <summary>
/// A flag to determine whether we are validating from the server or the client. Often not needed.
/// </summary>
[JsonIgnore]
[SdkExclude]
public ValidationContext ValidationContext { get; set; } = ValidationContext.None;

/// <summary>
/// True if the request object passes all validation
/// </summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using FluentValidation;
using PinguApps.Appwrite.Shared.Enums;

namespace PinguApps.Appwrite.Shared.Requests.Teams.Validators;
public class CreateTeamMembershipRequestValidator : AbstractValidator<CreateTeamMembershipRequest>
Expand Down Expand Up @@ -36,6 +37,11 @@ public CreateTeamMembershipRequestValidator()
.When(x => x.Url is not null)
.WithMessage("Invalid URL format.");

RuleFor(x => x.Url)
.NotEmpty()
.When(x => x.ValidationContext == ValidationContext.Client)
.WithMessage("Url is required.");

RuleFor(x => x.Name)
.NotEmpty()
.WithMessage("Name must either be null or a non empty string.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public async Task CreateTeamMembership_ShouldReturnSuccess_WhenApiCallSucceeds()
{
TeamId = IdUtils.GenerateUniqueId(),
Email = "[email protected]",
Roles = ["role1", "role2"]
Roles = ["role1", "role2"],
Url = "https://localhost:1234"
};

_mockHttp.Expect(HttpMethod.Post, $"{TestConstants.Endpoint}/teams/{request.TeamId}/memberships")
Expand All @@ -41,7 +42,8 @@ public async Task CreateTeamMembership_ShouldReturnError_WhenSessionIsNull()
{
TeamId = IdUtils.GenerateUniqueId(),
Email = "[email protected]",
Roles = ["role1", "role2"]
Roles = ["role1", "role2"],
Url = "https://localhost:1234"
};

// Act
Expand All @@ -61,7 +63,8 @@ public async Task CreateTeamMembership_ShouldHandleException_WhenApiCallFails()
{
TeamId = IdUtils.GenerateUniqueId(),
Email = "[email protected]",
Roles = ["role1", "role2"]
Roles = ["role1", "role2"],
Url = "https://localhost:1234"
};

_mockHttp.Expect(HttpMethod.Post, $"{TestConstants.Endpoint}/teams/{request.TeamId}/memberships")
Expand All @@ -87,7 +90,8 @@ public async Task CreateTeamMembership_ShouldReturnErrorResponse_WhenExceptionOc
{
TeamId = IdUtils.GenerateUniqueId(),
Email = "[email protected]",
Roles = ["role1", "role2"]
Roles = ["role1", "role2"],
Url = "https://localhost:1234"
};

_mockHttp.Expect(HttpMethod.Post, $"{TestConstants.Endpoint}/teams/{request.TeamId}/memberships")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
using System.Net;
using PinguApps.Appwrite.Client.Clients;
using PinguApps.Appwrite.Shared.Requests.Teams;
using PinguApps.Appwrite.Shared.Tests;
using PinguApps.Appwrite.Shared.Utils;
using RichardSzalay.MockHttp;

namespace PinguApps.Appwrite.Client.Tests.Clients.Teams;
public partial class TeamsClientTests
{
[Fact]
public async Task GetTeamMembership_ShouldReturnSuccess_WhenApiCallSucceeds()
{
// Arrange
var request = new GetTeamMembershipRequest
{
TeamId = IdUtils.GenerateUniqueId(),
MembershipId = IdUtils.GenerateUniqueId()
};

_mockHttp.Expect(HttpMethod.Get, $"{TestConstants.Endpoint}/teams/{request.TeamId}/memberships/{request.MembershipId}")
.ExpectedHeaders(true)
.Respond(TestConstants.AppJson, TestConstants.MembershipResponse);

_appwriteClient.SetSession(TestConstants.Session);

// Act
var result = await _appwriteClient.Teams.GetTeamMembership(request);

// Assert
Assert.True(result.Success);
}

[Fact]
public async Task GetTeamMembership_ShouldReturnError_WhenSessionIsNull()
{
// Arrange
var request = new GetTeamMembershipRequest
{
TeamId = IdUtils.GenerateUniqueId(),
MembershipId = IdUtils.GenerateUniqueId()
};

// Act
var result = await _appwriteClient.Teams.GetTeamMembership(request);

// Assert
Assert.True(result.IsError);
Assert.True(result.IsInternalError);
Assert.Equal(ISessionAware.SessionExceptionMessage, result.Result.AsT2.Message);
}

[Fact]
public async Task GetTeamMembership_ShouldHandleException_WhenApiCallFails()
{
// Arrange
var request = new GetTeamMembershipRequest
{
TeamId = IdUtils.GenerateUniqueId(),
MembershipId = IdUtils.GenerateUniqueId()
};

_mockHttp.Expect(HttpMethod.Get, $"{TestConstants.Endpoint}/teams/{request.TeamId}/memberships/{request.MembershipId}")
.ExpectedHeaders(true)
.Respond(HttpStatusCode.BadRequest, TestConstants.AppJson, TestConstants.AppwriteError);

_appwriteClient.SetSession(TestConstants.Session);

// Act
var result = await _appwriteClient.Teams.GetTeamMembership(request);

// Assert
Assert.True(result.IsError);
Assert.True(result.IsAppwriteError);
}

[Fact]
public async Task GetTeamMembership_ShouldReturnErrorResponse_WhenExceptionOccurs()
{
// Arrange
var request = new GetTeamMembershipRequest
{
TeamId = IdUtils.GenerateUniqueId(),
MembershipId = IdUtils.GenerateUniqueId()
};

_mockHttp.Expect(HttpMethod.Get, $"{TestConstants.Endpoint}/teams/{request.TeamId}/memberships/{request.MembershipId}")
.ExpectedHeaders(true)
.Throw(new HttpRequestException("An error occurred"));

_appwriteClient.SetSession(TestConstants.Session);

// Act
var result = await _appwriteClient.Teams.GetTeamMembership(request);

// Assert
Assert.False(result.Success);
Assert.True(result.IsInternalError);
Assert.Equal("An error occurred", result.Result.AsT2.Message);
}
}
Loading

0 comments on commit d21f7a0

Please sign in to comment.