using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SeaHaven.Services.DTOs; using SeaHaven.Services.Interfaces; namespace Api.SeaHavenIndustries.Controllers; [Authorize] [ApiController] [Route("api/team-members")] public sealed class TeamMemberController : ControllerBase { private readonly ITeamMemberService _teamMemberService; private readonly ITeamPermissionService _permissionService; public TeamMemberController( ITeamMemberService teamMemberService, ITeamPermissionService permissionService) { _teamMemberService = teamMemberService; _permissionService = permissionService; } [HttpGet("me/permissions")] public async Task GetMyPermissions(CancellationToken cancellationToken) { var result = await _permissionService.GetEffectivePermissionsAsync(User, cancellationToken); return result.IsSuccess ? Ok(result.Value) : Unauthorized(); } [HttpPost] public async Task Create( CreateTeamMemberRequestDTO request, CancellationToken cancellationToken) { var outcome = await _teamMemberService.CreateAsync(request, User, cancellationToken); if (!outcome.Success) { if (string.Equals(outcome.Error, "Forbidden", StringComparison.Ordinal)) return Forbid(); return BadRequest(new { message = outcome.Error }); } return Ok(outcome.Member); } [HttpGet("{userId}")] public async Task Get(string userId, CancellationToken cancellationToken) { var outcome = await _teamMemberService.GetAsync(userId, User, cancellationToken); return ToActionResult(outcome); } [HttpPut("{userId}")] public async Task Update( string userId, UpdateTeamMemberRequestDTO request, CancellationToken cancellationToken) { var outcome = await _teamMemberService.UpdateAsync(userId, request, User, cancellationToken); return ToActionResult(outcome); } private IActionResult ToActionResult(TeamMemberOperationOutcomeDTO outcome) { if (outcome.Success) return Ok(outcome.Member); if (string.Equals(outcome.Error, "Forbidden", StringComparison.Ordinal)) return Forbid(); if (string.Equals(outcome.Error, "Team member not found.", StringComparison.Ordinal)) return NotFound(new { message = outcome.Error }); return BadRequest(new { message = outcome.Error }); } }