using PnvPanel.Api.Common; using PnvPanel.Application.Admin.Roles; using PnvPanel.Application.Admin.Users; using PnvPanel.Application.Common.Interfaces; using PnvPanel.Application.Common.Messaging; using PnvPanel.Infrastructure.Identity; namespace PnvPanel.Api.Endpoints; public static class RoleEndpoints { public static IEndpointRouteBuilder MapRoleEndpoints(this IEndpointRouteBuilder app) { var admin = app.MapGroup("/api/admin") .WithTags("Admin.Roles") .RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin)); admin.MapGet("/roles", ListRoles).Produces>(); admin.MapPost("/roles", CreateRole).Produces(); admin.MapPut("/roles/{id:guid}", UpdateRole).Produces(); admin.MapDelete("/roles/{id:guid}", DeleteRole).Produces(StatusCodes.Status204NoContent); admin .MapPatch("/users/{id:guid}/role", ChangeUserRole) .Produces(StatusCodes.Status204NoContent); return app; } private static async Task ListRoles( ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new ListRolesQuery(), cancellationToken); return result.ToHttpResult(); } private static async Task CreateRole( CreateRoleCommand command, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(command, cancellationToken); return result.ToHttpResult(); } private static async Task UpdateRole( Guid id, UpdateRoleBody body, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send( new UpdateRoleCommand(id, body.MaxConfigs, body.MaxIpLimit, body.BillingEnabled), cancellationToken ); return result.ToHttpResult(); } private static async Task DeleteRole( Guid id, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send(new DeleteRoleCommand(id), cancellationToken); return result.ToHttpResult(); } private static async Task ChangeUserRole( Guid id, ChangeUserRoleBody body, ISender sender, CancellationToken cancellationToken ) { var result = await sender.Send( new ChangeUserRoleCommand(id, body.RoleId), cancellationToken ); return result.ToHttpResult(); } } public sealed record UpdateRoleBody(int MaxConfigs, int MaxIpLimit, bool BillingEnabled); public sealed record ChangeUserRoleBody(Guid RoleId);