diff --git a/PostFundManagement.Api/Endpoints/Users/SyncUserEndpoint.cs b/PostFundManagement.Api/Endpoints/Users/SyncUserEndpoint.cs index 6d30e80..cc0efa1 100644 --- a/PostFundManagement.Api/Endpoints/Users/SyncUserEndpoint.cs +++ b/PostFundManagement.Api/Endpoints/Users/SyncUserEndpoint.cs @@ -29,6 +29,6 @@ public class SyncUserEndpoint : IEndpoint .MapToApiVersion(new ApiVersion(1)) .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status401Unauthorized) - .WithTags(EndpointTags.Communications); + .WithTags(EndpointTags.Users); } } diff --git a/PostFundManagement.Api/Endpoints/Users/UpdateUserStatusEndpoint.cs b/PostFundManagement.Api/Endpoints/Users/UpdateUserStatusEndpoint.cs new file mode 100644 index 0000000..4eee9d1 --- /dev/null +++ b/PostFundManagement.Api/Endpoints/Users/UpdateUserStatusEndpoint.cs @@ -0,0 +1,32 @@ +using PostFundManagement.Application.Extensions; +using PostFundManagement.Application.Services.Users; +using PostFundManagement.Domain; +using PostFundManagement.Domain.Abstractions; +using PostFundManagement.Domain.Extensions; +using PostFundManagement.Domain.Security; + +namespace PostFundManagement.Api.Endpoints.Users; + +[ApiVersionTarget(1)] +public sealed class UpdateUserStatusEndpoint : IEndpoint +{ + public void Map(IEndpointRouteBuilder builder) + { + builder.MapGet("api/users/{userId:Guid}/status/{status:int}", async (Guid userId, ActivityStatus status, + UserService service, CancellationToken cancellationToken = default) => + { + var result = await service.UpdateUserStatusAsync(userId, status, cancellationToken); + + return result.IsSuccess + ? Results.Ok() + : Results.NotFound(); + }) + .WithDescription("Changes the Activity status of the user in the system") + .WithName(typeof(UpdateUserStatusEndpoint).ToEndpointName()) + .MapToApiVersion(new ApiVersion(1)) + .Produces(StatusCodes.Status200OK) + .Produces(StatusCodes.Status404NotFound) + .Produces(StatusCodes.Status401Unauthorized) + .WithTags(EndpointTags.Users); + } +} diff --git a/PostFundManagement.Application/Services/Users/UserService.cs b/PostFundManagement.Application/Services/Users/UserService.cs index 8f3a65e..2eac0cb 100644 --- a/PostFundManagement.Application/Services/Users/UserService.cs +++ b/PostFundManagement.Application/Services/Users/UserService.cs @@ -8,7 +8,7 @@ namespace PostFundManagement.Application.Services.Users; public sealed class UserService(IDbContextFactory contextFactory) : IService { - public async ValueTask SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) + public async ValueTask SyncUserAsync(Guid userId, string email, CancellationToken cancellationToken = default) { try { @@ -28,7 +28,7 @@ public sealed class UserService(IDbContextFactory contextF { user!.Email = email; user.LastLoginAt = DateTime.UtcNow; - + context.Users.Update(user); } @@ -44,8 +44,8 @@ public sealed class UserService(IDbContextFactory contextF public async ValueTask> GetUsersAsync(Pagination pagination, UserFilterRequest request, CancellationToken cancellationToken = default) { - try - { + try + { using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var query = context.Users.AsNoTracking(); @@ -74,9 +74,29 @@ public sealed class UserService(IDbContextFactory contextF return Result.Ok(users?.Select(u => u.Map()).ToArray() ?? []); } - catch (Exception ex) - { - return Result.Fail(new Error(ex.Message).CausedBy(ex)); - } + catch (Exception ex) + { + return Result.Fail(new Error(ex.Message).CausedBy(ex)); + } + } + + public async ValueTask UpdateUserStatusAsync(Guid userId, ActivityStatus status, CancellationToken cancellationToken = default) + { + try + { + using var context = await contextFactory.CreateDbContextAsync(cancellationToken); + + var changedTotal = await context.Users + .Where(f => f.Id == userId) + .ExecuteUpdateAsync(f => f.SetProperty(u => u.Status, status), cancellationToken); + + return changedTotal > 0 + ? Result.Ok() + : Result.Fail("Failed to update user activity status."); + } + catch (Exception ex) + { + return Result.Fail(new Error(ex.Message).CausedBy(ex)); + } } }