Files
vtuber-awards/Backend/Endpoints/AdminEndpointConventions.cs
T
2026-06-25 19:52:46 +02:00

62 lines
2.4 KiB
C#

using Backend.Domain;
using Backend.Security;
using Backend.Data;
namespace Backend.Endpoints;
internal static class AdminEndpointConventions
{
public static UserSession CurrentSession(HttpContext context) =>
context.GetCurrentSession() ?? throw new InvalidOperationException("Admin session missing from request context.");
public static async ValueTask<object?> RequirePermission(
EndpointFilterInvocationContext context,
EndpointFilterDelegate next,
string permissionKey)
{
var session = CurrentSession(context.HttpContext);
var db = context.HttpContext.RequestServices.GetRequiredService<AwardsDbContext>();
if (!await AdminPermissionCatalog.HasPermissionAsync(db, session.Role, permissionKey, context.HttpContext.RequestAborted))
{
return Results.Json(
new { message = $"Diese Admin-Aktion braucht die Berechtigung '{permissionKey}'." },
statusCode: StatusCodes.Status403Forbidden);
}
return await next(context);
}
public static async ValueTask<object?> RequireWritePermission(
EndpointFilterInvocationContext context,
EndpointFilterDelegate next,
string permissionKey)
{
var session = CurrentSession(context.HttpContext);
if (AdminRoles.Normalize(session.Role) == AdminRoles.OrganizationTeam)
{
return Results.Json(
new { message = "Organisation Team hat fuer diesen Bereich nur Leserechte." },
statusCode: StatusCodes.Status403Forbidden);
}
return await RequirePermission(context, next, permissionKey);
}
public static async ValueTask<object?> RequireAnyPermission(
EndpointFilterInvocationContext context,
EndpointFilterDelegate next,
string[] permissionKeys)
{
var session = CurrentSession(context.HttpContext);
var db = context.HttpContext.RequestServices.GetRequiredService<AwardsDbContext>();
if (!await AdminPermissionCatalog.HasAnyPermissionAsync(db, session.Role, permissionKeys, context.HttpContext.RequestAborted))
{
return Results.Json(
new { message = "Diese Admin-Aktion braucht eine passende Rollenberechtigung." },
statusCode: StatusCodes.Status403Forbidden);
}
return await next(context);
}
}