using PnvPanel.Api.Common; using PnvPanel.Application.Admin.Configs; using PnvPanel.Application.Admin.Users; using PnvPanel.Application.Common.Interfaces; using LiteCqrs; using PnvPanel.Application.Common.Models; using PnvPanel.Application.Configs; using PnvPanel.Domain.Configs; using PnvPanel.Domain.Inbounds; using PnvPanel.Infrastructure.Identity; namespace PnvPanel.Api.Endpoints; public static class AdminUserEndpoints { public static IEndpointRouteBuilder MapAdminUserEndpoints(this IEndpointRouteBuilder app) { var admin = app.MapGroup("/api/admin") .WithTags("Admin.Users") .RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin)); admin.MapGet("/users", ListUsers).Produces>(); admin .MapPatch("/users/{id:guid}/block", BlockUser) .Produces(StatusCodes.Status204NoContent); admin .MapPatch("/users/{id:guid}/unblock", UnblockUser) .Produces(StatusCodes.Status204NoContent); admin .MapPost("/users/{id:guid}/reset-password", ResetPassword) .Produces(StatusCodes.Status204NoContent); admin.MapDelete("/users/{id:guid}", DeleteUser).Produces(StatusCodes.Status204NoContent); admin .MapGet("/users/{id:guid}/configs", GetUserConfigs) .Produces>(); admin.MapGet("/configs", ListAllConfigs).Produces>(); admin .MapDelete("/configs/{id:guid}", ForceRevokeConfig) .Produces(StatusCodes.Status204NoContent); return app; } private static async Task ListUsers( int page, int pageSize, string? search, Guid? roleId, bool? isActivated, bool? isBlocked, bool? billingExpired, ISender sender, CancellationToken cancellationToken ) { var query = new ListUsersQuery( page <= 0 ? 1 : page, pageSize <= 0 ? 20 : pageSize, search, roleId, isActivated, isBlocked, billingExpired ); var result = await sender.Send(query, 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 ResetPassword( Guid id, ResetPasswordBody body, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send( new ResetUserPasswordCommand(id, body.NewPassword), 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(); } private static async Task GetUserConfigs( Guid id, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new GetUserConfigsQuery(id), cancellationToken); return result.ToHttpResult(); } private static async Task ListAllConfigs( int page, int pageSize, string? search, ConfigStatus? status, VpnProtocol? protocol, Guid? nodeId, ISender sender, CancellationToken cancellationToken ) { var query = new ListAllConfigsQuery( page <= 0 ? 1 : page, pageSize <= 0 ? 20 : pageSize, search, status, protocol, nodeId ); var result = await sender.Send(query, cancellationToken); return result.ToHttpResult(); } private static async Task ForceRevokeConfig( Guid id, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new ForceRevokeConfigCommand(id), cancellationToken); return result.ToHttpResult(); } } public sealed record ResetPasswordBody(string NewPassword);