using Microsoft.AspNetCore.Authorization;
namespace ROLAC.API.Authorization;
///
/// Gates an action/controller on a configurable permission. Usage:
/// [HasPermission(Modules.Members, PermissionActions.Write)].
/// Encodes the policy name PERM:<module>:<action>, which
/// turns into a .
///
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class HasPermissionAttribute : AuthorizeAttribute
{
public const string PolicyPrefix = "PERM:";
public HasPermissionAttribute(string module, string action)
=> Policy = $"{PolicyPrefix}{module}:{action}";
/// Parses a policy name back into (module, action), or null if not a PERM policy.
public static (string Module, string Action)? Parse(string policyName)
{
if (!policyName.StartsWith(PolicyPrefix, StringComparison.Ordinal))
return null;
var body = policyName[PolicyPrefix.Length..];
var split = body.IndexOf(':');
if (split <= 0 || split == body.Length - 1)
return null;
return (body[..split], body[(split + 1)..]);
}
}