using PnvPanel.Api.Common; using PnvPanel.Application.Activation; using PnvPanel.Application.Admin.Activation; using PnvPanel.Application.Common.Messaging; using PnvPanel.Application.Common.Models; using PnvPanel.Domain.Activation; using PnvPanel.Infrastructure.Identity; namespace PnvPanel.Api.Endpoints; public static class ActivationEndpoints { public static IEndpointRouteBuilder MapActivationEndpoints(this IEndpointRouteBuilder app) { var user = app.MapGroup("/api/activation").WithTags("Activation").RequireAuthorization(); user.MapGet("/status", GetStatus).Produces(); user.MapPost("/request", RequestActivation).Produces(); var admin = app.MapGroup("/api/admin/activation-requests") .WithTags("Admin.Activation") .RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin)); admin.MapGet("", ListRequests).Produces>(); admin.MapPost("/{id:guid}/approve", Approve).Produces(StatusCodes.Status204NoContent); admin.MapPost("/{id:guid}/reject", Reject).Produces(StatusCodes.Status204NoContent); return app; } private static async Task GetStatus(ISender sender, CancellationToken cancellationToken) { var result = await sender.Send(new GetActivationStatusQuery(), cancellationToken); return result.ToHttpResult(); } private static async Task RequestActivation(RequestActivationCommand command, ISender sender, CancellationToken cancellationToken) { var result = await sender.Send(command, cancellationToken); return result.ToHttpResult(); } private static async Task ListRequests( [AsParameters] ListActivationRequestsRequest request, ISender sender, CancellationToken cancellationToken) { var query = new ListActivationRequestsQuery(request.StatusFilter, request.Page, request.PageSize); var result = await sender.Send(query, cancellationToken); return result.ToHttpResult(); } private static async Task Approve(Guid id, ISender sender, CancellationToken cancellationToken) { var result = await sender.Send(new ApproveActivationCommand(id), cancellationToken); return result.ToHttpResult(); } private static async Task Reject( Guid id, RejectActivationBody body, ISender sender, CancellationToken cancellationToken) { var result = await sender.Send(new RejectActivationCommand(id, body.Reason), cancellationToken); return result.ToHttpResult(); } } public sealed record ListActivationRequestsRequest(ActivationStatus? StatusFilter, int Page = 1, int PageSize = 20); public sealed record RejectActivationBody(string? Reason);