using Microsoft.AspNetCore.Authorization;

namespace foodmarket.Api.Infrastructure.Authorization;

/// <summary>Гейтит endpoint на конкретное право роли. Имя права = имя
/// boolean-свойства <c>RolePermissions</c>. Реализовано поверх policy-механизма:
/// атрибут выставляет policy <c>perm:&lt;Permission&gt;</c>, которую
/// разворачивает <see cref="PermissionAuthorizationPolicyProvider"/> в
/// <see cref="PermissionRequirement"/>, а проверяет
/// <see cref="PermissionAuthorizationHandler"/>.
///
/// Пример: <c>[RequiresPermission("ProductsEdit")]</c>. Заменяет грубое
/// <c>[Authorize(Roles="Admin,Storekeeper")]</c> — теперь доступ определяют
/// флаги роли организации, а не зашитый список Identity-ролей.</summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public sealed class RequiresPermissionAttribute : AuthorizeAttribute
{
    public const string PolicyPrefix = "perm:";

    public RequiresPermissionAttribute(string permission)
        => Policy = $"{PolicyPrefix}{permission}";
}
