using PostFundManagement.Domain; using PostFundManagement.Domain.Abstractions; using PostFundManagement.Domain.Api; using PostFundManagement.Domain.Extensions; using PostFundManagement.Infrastructure.Database; namespace PostFundManagement.Api.Endpoints.Grants; [ApiVersionTarget(1)] public class ExecuteContractEndpoint : IEndpoint { public record ExecuteContractRequest(string ExternalSignatureId, string SignedDocumentUrl); public void Map(IEndpointRouteBuilder builder) { builder.MapPost("api/grants/contracts/{id:long}/execute", async (long id, ExecuteContractRequest request, ClaimsPrincipal principal, IDbContextFactory contextFactory, CancellationToken cancellationToken = default) => { using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var contract = await context.Contracts.FirstOrDefaultAsync(c => c.Id == id, cancellationToken); if (contract == null) return Results.NotFound($"Contract with ID {id} does not exist."); contract.ExternalSignatureId = request.ExternalSignatureId; contract.SignedDocumentUrl = request.SignedDocumentUrl; contract.Status = ContractStatus.Active; context.Contracts.Update(contract); return await context.SaveChangesAsync(cancellationToken) > 0 ? Results.Ok(contract) : Results.BadRequest("Failed to execute contract"); }) .RequireAuthorization() .WithDescription("Execute the contract and lock the contractual version") .WithName(typeof(ExecuteContractEndpoint).ToEndpointName()) .MapToApiVersion(new ApiVersion(1)) .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status404NotFound) .Produces(StatusCodes.Status401Unauthorized) .WithTags(EndpointTags.Grants); } }