using PostFundManagement.Domain; using PostFundManagement.Domain.Abstractions; using PostFundManagement.Domain.Api; using PostFundManagement.Domain.Extensions; using PostFundManagement.Infrastructure.Database; namespace PostFundManagement.Api.Endpoints.Projects; [ApiVersionTarget(1)] public class UpdateProjectEndpoint : IEndpoint { public record UpdateProjectStatusRequest(ApprovalStatus Status); public void Map(IEndpointRouteBuilder builder) { builder.MapPost("api/projects/{id:long}/status", async (long id, UpdateProjectStatusRequest 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 userId)) return Results.BadRequest("Missing or invalid 'sid' claim."); using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var project = await context.Projects.FirstOrDefaultAsync(p => p.Id == id, cancellationToken); if (project == null) return Results.NotFound($"Project with ID {id} does not exist."); project.Status = request.Status; project.UpdatedBy = userId; project.UpdatedAt = DateTime.UtcNow; context.Projects.Update(project); return await context.SaveChangesAsync(cancellationToken) > 0 ? Results.Ok(project) : Results.BadRequest("Failed to update project"); }) .RequireAuthorization() .WithDescription("Update project status (M04)") .WithName(typeof(UpdateProjectEndpoint).ToEndpointName()) .MapToApiVersion(new ApiVersion(1)) .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status404NotFound) .Produces(StatusCodes.Status401Unauthorized) .WithTags(EndpointTags.Projects); } }