using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using ROLAC.API.Authorization; using ROLAC.API.DTOs.Invitations; using ROLAC.API.Services; namespace ROLAC.API.Controllers; /// /// Admin endpoints for generating and e-mailing first-login invitation links. /// The public consume/validate endpoints live on so they can set the /// refresh-token cookie and stay anonymous. /// [ApiController] [Route("api/invitations")] [Authorize] public class InvitationsController : ControllerBase { private readonly IInvitationService _invitations; public InvitationsController(IInvitationService invitations) => _invitations = invitations; /// POST /api/invitations — generate a link for a member; returns { token, expiresAt }. [HttpPost] [HasPermission(Modules.Users, PermissionActions.Write)] public async Task Create([FromBody] CreateInvitationRequest request) { try { return Ok(await _invitations.CreateAsync(request)); } catch (InvalidOperationException ex) { return BadRequest(new { message = ex.Message }); } } /// POST /api/invitations/send — e-mail an already-generated link to the member. [HttpPost("send")] [HasPermission(Modules.Users, PermissionActions.Write)] public async Task Send([FromBody] SendInvitationRequest request) { try { await _invitations.SendEmailAsync(request.MemberId, request.Link); return NoContent(); } catch (InvalidOperationException ex) { return BadRequest(new { message = ex.Message }); } } }