using LiteCqrs; using TeleWave.Api.Common; using TeleWave.Application.Admin.Users.BlockUser; using TeleWave.Application.Admin.Users.CreateUser; using TeleWave.Application.Admin.Users.DeleteUser; using TeleWave.Application.Admin.Users.GetUser; using TeleWave.Application.Admin.Users.ListUsers; using TeleWave.Application.Admin.Users.UnblockUser; using TeleWave.Application.Common.Interfaces; using TeleWave.Application.Common.Models; using TeleWave.Infrastructure.Identity; namespace TeleWave.Api.Endpoints; public static class AdminUserEndpoints { public static IEndpointRouteBuilder MapAdminUserEndpoints(this IEndpointRouteBuilder app) { var admin = app.MapGroup("/api/admin/users") .WithTags("Admin.Users") .RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin)); admin.MapGet("", ListUsers).Produces>(); admin.MapPost("", CreateUser).Produces(StatusCodes.Status201Created); admin.MapGet("/{id:guid}", GetUser).Produces(); admin .MapPost("/{id:guid}/block", BlockUser) .Produces(StatusCodes.Status204NoContent); admin .MapPost("/{id:guid}/unblock", UnblockUser) .Produces(StatusCodes.Status204NoContent); admin.MapDelete("/{id:guid}", DeleteUser).Produces(StatusCodes.Status204NoContent); return app; } private static async Task ListUsers( int page, int pageSize, string? search, Guid? roleId, bool? isBlocked, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send( new ListUsersQuery(page <= 0 ? 1 : page, pageSize <= 0 ? 20 : pageSize, search, roleId, isBlocked), cancellationToken ); return Results.Ok(result); } private static async Task CreateUser( CreateUserBody body, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send( new CreateUserCommand(body.UserName, body.Password, body.RoleId), cancellationToken ); return result.IsSuccess ? Results.Created($"/api/admin/users/{result.Value}", new CreatedIdResponse(result.Value)) : result.ToHttpResult(); } private static async Task GetUser( Guid id, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new GetUserQuery(id), cancellationToken); return result.ToHttpResult(); } private static async Task BlockUser( Guid id, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new BlockUserCommand(id), cancellationToken); return result.ToHttpResult(); } private static async Task UnblockUser( Guid id, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new UnblockUserCommand(id), cancellationToken); return result.ToHttpResult(); } private static async Task DeleteUser( Guid id, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new DeleteUserCommand(id), cancellationToken); return result.ToHttpResult(); } } public sealed record CreateUserBody(string UserName, string Password, Guid RoleId);