using PostFundManagement.Domain; using PostFundManagement.Domain.Abstractions; using PostFundManagement.Domain.Api; using PostFundManagement.Domain.Extensions; using PostFundManagement.Infrastructure.Database; namespace PostFundManagement.Api.Endpoints.Governance; [ApiVersionTarget(1)] public class GetOrganisationsEndpoint : IEndpoint { public record CreateOrganisationRequest(string Name, string RegistrationNo, string Email, OrganisationType Type); public void Map(IEndpointRouteBuilder builder) { builder.MapGet("api/governance/organisations", async (IDbContextFactory contextFactory, int page = 1, int pageSize = 10, CancellationToken cancellationToken = default) => { if (page < 1) page = 1; if (pageSize < 1) pageSize = 10; if (pageSize > 100) pageSize = 100; using var context = await contextFactory.CreateDbContextAsync(cancellationToken); var query = context.Organisations.AsNoTracking(); var totalCount = await query.CountAsync(cancellationToken); var items = await query.OrderBy(o => o.Name) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(cancellationToken); return Results.Ok(new { Items = items, TotalCount = totalCount, Page = page, PageSize = pageSize }); }) .RequireAuthorization() .WithDescription("Get a paginated directory of organizations") .WithName(typeof(GetOrganisationsEndpoint).ToEndpointName()) .MapToApiVersion(new ApiVersion(1)) .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status401Unauthorized) .WithTags(EndpointTags.Governance); } }