using Microsoft.AspNetCore.Mvc; namespace Distribution.Infra.Authorization; [ApiController] [Route("api/authorization")] public class AuthorizationController( IPermissionService permissionService, IScopeAccessService scopeAccessService, ICurrentUserService currentUser) : ControllerBase { [HttpGet("permissions/{permissionCode}")] public async Task CheckPermission(string permissionCode) { if (currentUser.RoleId is not { } roleId) return Unauthorized(); var result = await permissionService.HasPermissionAsync(roleId, permissionCode); return Ok(new PermissionCheckResponse(result)); } [HttpGet("my-permissions")] public async Task GetMyPermissions() { if (currentUser.RoleId is not { } roleId) return Unauthorized(); var permissions = await permissionService.GetRolePermissionsAsync(roleId); return Ok(new RolePermissionsResponse(permissions)); } [HttpGet("scopes/stores/{storeId:guid}")] public async Task CheckStoreScope(Guid storeId) { if (currentUser.UserId is not { } userId) return Unauthorized(); var result = await scopeAccessService.HasStoreScopeAsync(userId, storeId); return Ok(new StoreScopeCheckResponse(result)); } [HttpGet("scopes/routes/{routeId:guid}")] public async Task CheckRouteScope(Guid routeId) { if (currentUser.UserId is not { } userId) return Unauthorized(); var result = await scopeAccessService.HasRouteScopeAsync(userId, routeId); return Ok(new RouteScopeCheckResponse(result)); } [HttpGet("scopes/regions/{regionId:guid}")] public async Task CheckRegionScope(Guid regionId) { if (currentUser.UserId is not { } userId) return Unauthorized(); var result = await scopeAccessService.HasRegionScopeAsync(userId, regionId); return Ok(new RegionScopeCheckResponse(result)); } [HttpGet("scopes/stores")] public async Task GetAccessibleStores() { if (currentUser.UserId is not { } userId) return Unauthorized(); var result = await scopeAccessService.GetAccessibleStoreIdsAsync(userId); return Ok(new AccessibleStoresResponse(result)); } } [ApiController] [Route("api/permissions")] public class PermissionController(IPermissionService permissionService) : ControllerBase { [HttpGet] public async Task GetAll() { var permissions = await permissionService.GetAllAsync(); return Ok(permissions.Select(p => new { permissionId = p.Id, p.Code, p.Description })); } }