using Data.SeaHavenIndustries; using Data.SeaHavenIndustries.Enums; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SeaHaven.Services.DTOs; using SeaHaven.Services.Interfaces; namespace Api.SeaHavenIndustries.Controllers; [Authorize] [ApiController] [Route("api/User/{userId}/Permissions")] public sealed class TeamPermissionController : ControllerBase { private readonly ITeamPermissionService _permissionService; public TeamPermissionController(ITeamPermissionService permissionService) { _permissionService = permissionService; } [HttpGet] public async Task GetProfile( string userId, CancellationToken cancellationToken) { var result = await _permissionService.GetProfileAsync(userId, User, cancellationToken); return ToActionResult(result); } [HttpPut("{permissionKey}")] public async Task SetOverride( string userId, string permissionKey, [FromBody] SetTeamPermissionOverrideDTO request, CancellationToken cancellationToken) { if (!Enum.IsDefined(request.State)) return BadRequest(new Response { Status = "Error", Message = "Invalid permission state." }); var result = await _permissionService.SetOverrideAsync( userId, permissionKey, request.State, User, cancellationToken); return ToActionResult(result); } private static IActionResult ToActionResult( TeamPermissionResult result) { return result.Status switch { TeamPermissionResultStatus.Success => new OkObjectResult(result.Value), TeamPermissionResultStatus.Unauthorized => new UnauthorizedResult(), TeamPermissionResultStatus.Forbidden => new ForbidResult(), TeamPermissionResultStatus.NotFound => new NotFoundObjectResult( new Response { Status = "Error", Message = "User not found." }), TeamPermissionResultStatus.InvalidPermissionKey => new BadRequestObjectResult( new Response { Status = "Error", Message = "Unknown permission key." }), _ => new BadRequestObjectResult( new Response { Status = "Error", Message = "Unable to update permissions." }) }; } }