using PostFundManagement.Domain; using PostFundManagement.Domain.Abstractions; using PostFundManagement.Domain.Api; using PostFundManagement.Domain.Extensions; using PostFundManagement.Infrastructure.Database; namespace PostFundManagement.Api.Endpoints.Communications; [ApiVersionTarget(1)] public class SendInviteEndpoint : IEndpoint { public record InviteRequest(long OrganisationId, long InvitedOrganisationId, long AwardId, long ContractId, Guid Recipient, string Message, NotificationPlatform Platform); public void Map(IEndpointRouteBuilder builder) { builder.MapPost("api/communications/invite", async (InviteRequest request, ClaimsPrincipal principal, IDbContextFactory contextFactory, CancellationToken cancellationToken = default) => { var sidClaim = principal.FindFirst("sid")?.Value ?? principal.FindFirst(ClaimTypes.Sid)?.Value; if (!Guid.TryParse(sidClaim, out var currentUserId)) return Results.BadRequest("Missing or invalid 'sid' claim."); using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var invite = new Domain.Entities.Invite { OrganisationId = request.OrganisationId, InvitedOrganisationId = request.InvitedOrganisationId, AwardId = request.AwardId, ContractId = request.ContractId, Recipient = request.Recipient, CreatedBy = currentUserId, CreatedAt = DateTime.UtcNow }; context.Invites.Add(invite); context.Notifications.Add(new Domain.Entities.Notification { OrganisationId = request.OrganisationId, Recipient = request.Recipient, Platform = request.Platform, Status = NotificationStatus.Pending, Subject = "Invitation to Onboard", Message = request.Message, CreatedAt = DateTime.UtcNow }); return await context.SaveChangesAsync(cancellationToken) > 0 ? Results.Ok(invite) : Results.BadRequest("Failed to create invite"); }) .RequireAuthorization() .WithDescription("Trigger an invite to an organization or candidate (specifying NotificationPlatform)") .WithName(typeof(SendInviteEndpoint).ToEndpointName()) .MapToApiVersion(new ApiVersion(1)) .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status400BadRequest) .Produces(StatusCodes.Status401Unauthorized) .WithTags(EndpointTags.Communications); } }