- Updated various API endpoints to include response type annotations using .Produces<T>() for better documentation and type safety. - Enhanced activation, admin, user, config, and other endpoints to specify response types, improving clarity for frontend integration. - Added new DTOs for structured responses in authentication and Telegram-related endpoints. - Improved overall API schema generation to reflect these changes, ensuring consistency between backend and frontend types.
67 lines
2.8 KiB
C#
67 lines
2.8 KiB
C#
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<ActivationStatusDto>();
|
|
user.MapPost("/request", RequestActivation).Produces<ActivationRequestDto>();
|
|
|
|
var admin = app.MapGroup("/api/admin/activation-requests")
|
|
.WithTags("Admin.Activation")
|
|
.RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin));
|
|
|
|
admin.MapGet("", ListRequests).Produces<PagedList<ActivationRequestAdminDto>>();
|
|
admin.MapPost("/{id:guid}/approve", Approve).Produces(StatusCodes.Status204NoContent);
|
|
admin.MapPost("/{id:guid}/reject", Reject).Produces(StatusCodes.Status204NoContent);
|
|
|
|
return app;
|
|
}
|
|
|
|
private static async Task<IResult> GetStatus(ISender sender, CancellationToken cancellationToken)
|
|
{
|
|
var result = await sender.Send(new GetActivationStatusQuery(), cancellationToken);
|
|
return result.ToHttpResult();
|
|
}
|
|
|
|
private static async Task<IResult> RequestActivation(RequestActivationCommand command, ISender sender, CancellationToken cancellationToken)
|
|
{
|
|
var result = await sender.Send(command, cancellationToken);
|
|
return result.ToHttpResult();
|
|
}
|
|
|
|
private static async Task<IResult> 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<IResult> Approve(Guid id, ISender sender, CancellationToken cancellationToken)
|
|
{
|
|
var result = await sender.Send(new ApproveActivationCommand(id), cancellationToken);
|
|
return result.ToHttpResult();
|
|
}
|
|
|
|
private static async Task<IResult> 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);
|