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 GetBudgetsEndpoint : IEndpoint { public void Map(IEndpointRouteBuilder builder) { builder.MapGet("api/grants/budgets", 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.Budgets.AsNoTracking(); var totalCount = await query.CountAsync(cancellationToken); var items = await query.OrderByDescending(b => b.CreatedAt) .Skip((page - 1) * pageSize) .Take(pageSize) .ToListAsync(cancellationToken); return Results.Ok(new { Items = items, TotalCount = totalCount, Page = page, PageSize = pageSize }); }) .RequireAuthorization() .WithDescription("Get all budgets") .WithName(typeof(GetBudgetsEndpoint).ToEndpointName()) .MapToApiVersion(new ApiVersion(1)) .Produces(StatusCodes.Status200OK) .Produces(StatusCodes.Status401Unauthorized) .WithTags(EndpointTags.Grants); } }