- Added new configuration options for user plans in `.env.example`, including `Plans__MaxCustomConfigCount` and `Plans__MinCustomConfigCount`. - Introduced `MapPlanEndpoints` in `Program.cs` to handle plan-related API routes. - Implemented `SetUserPlan` endpoint in `RoleEndpoints` to allow admins to assign plans to users. - Removed deprecated role request approval endpoints from `AdminSupportEndpoints`. - Updated `ITelegramNotifier` and related classes to reflect changes in role request handling and payment notifications. - Refactored role management commands to remove `MaxConfigs` and focus on `MaxIpLimit` and billing settings. - Enhanced billing request handling to accommodate plan changes instead of role changes. - Updated various interfaces and command handlers to support new plan management features.
70 lines
2.2 KiB
C#
70 lines
2.2 KiB
C#
using PnvPanel.Api.Common;
|
|
using PnvPanel.Application.Admin.Plans;
|
|
using PnvPanel.Application.Common.Messaging;
|
|
using PnvPanel.Infrastructure.Identity;
|
|
|
|
namespace PnvPanel.Api.Endpoints;
|
|
|
|
public static class AdminPlanEndpoints
|
|
{
|
|
public static IEndpointRouteBuilder MapAdminPlanEndpoints(this IEndpointRouteBuilder app)
|
|
{
|
|
var admin = app.MapGroup("/api/admin/plans")
|
|
.WithTags("Admin.Plans")
|
|
.RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin));
|
|
|
|
admin.MapGet("", ListPlans).Produces<IReadOnlyList<AdminPlanDto>>();
|
|
admin.MapPost("", CreatePlan).Produces<AdminPlanDto>();
|
|
admin.MapPut("/{id:guid}", UpdatePlan).Produces<AdminPlanDto>();
|
|
admin.MapDelete("/{id:guid}", DeletePlan).Produces(StatusCodes.Status204NoContent);
|
|
|
|
return app;
|
|
}
|
|
|
|
private static async Task<IResult> ListPlans(ISender sender, CancellationToken cancellationToken)
|
|
{
|
|
var result = await sender.Send(new ListAdminPlansQuery(), cancellationToken);
|
|
return result.ToHttpResult();
|
|
}
|
|
|
|
private static async Task<IResult> CreatePlan(
|
|
CreatePlanCommand command,
|
|
ISender sender,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
var result = await sender.Send(command, cancellationToken);
|
|
return result.ToHttpResult();
|
|
}
|
|
|
|
private static async Task<IResult> UpdatePlan(
|
|
Guid id,
|
|
UpdatePlanBody body,
|
|
ISender sender,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
var command = new UpdatePlanCommand(
|
|
id,
|
|
body.Name,
|
|
body.ConfigCount,
|
|
body.SortOrder,
|
|
body.IsEnabled
|
|
);
|
|
var result = await sender.Send(command, cancellationToken);
|
|
return result.ToHttpResult();
|
|
}
|
|
|
|
private static async Task<IResult> DeletePlan(
|
|
Guid id,
|
|
ISender sender,
|
|
CancellationToken cancellationToken
|
|
)
|
|
{
|
|
var result = await sender.Send(new DeletePlanCommand(id), cancellationToken);
|
|
return result.ToHttpResult();
|
|
}
|
|
}
|
|
|
|
public sealed record UpdatePlanBody(string Name, int ConfigCount, int SortOrder, bool IsEnabled);
|