mirror of
https://github.com/Sea-Haven-Industries/shoc-backend.git
synced 2026-09-30 09:33:13 +00:00
GET api/team-members/me/permissions returns the keys the signed-in user holds after role defaults and their own overrides, evaluated by the same policy that guards writes. The user comes from the token; a missing or unknown identity gets 401.
78 lines
2.5 KiB
C#
78 lines
2.5 KiB
C#
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<IActionResult> GetMyPermissions(CancellationToken cancellationToken)
|
|
{
|
|
var result = await _permissionService.GetEffectivePermissionsAsync(User, cancellationToken);
|
|
return result.IsSuccess ? Ok(result.Value) : Unauthorized();
|
|
}
|
|
|
|
[HttpPost]
|
|
public async Task<IActionResult> 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<IActionResult> Get(string userId, CancellationToken cancellationToken)
|
|
{
|
|
var outcome = await _teamMemberService.GetAsync(userId, User, cancellationToken);
|
|
return ToActionResult(outcome);
|
|
}
|
|
|
|
[HttpPut("{userId}")]
|
|
public async Task<IActionResult> 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 });
|
|
}
|
|
}
|