using System.Security.Claims; using Domain.Entities.Donations.ValueObject; using MediatR; using Web.Api.Common; using Web.Api.Extensions; namespace Web.Api.Endpoints.Ranking; internal sealed class GetRanking : IEndpoint { public void MapEndpoint(IEndpointRouteBuilder app) { app.MapGet("api/ranking", async ( string? type, string? period, string? category, int? page, int? perPage, ClaimsPrincipal? user, ISender sender, CancellationToken ct ) => { var rankingType = ParseType(type); var rankingPeriod = ParsePeriod(period); var viewerId = user?.GetMemberID(); var query = new Application.Features.Api.Ranking.GetRanking.Query( rankingType, rankingPeriod, category, page ?? 1, perPage ?? 50, viewerId ); var data = await sender.Send(query, ct); return ApiResponse.Ok(data); }) .WithTags("Ranking"); } private static RankingType ParseType(string? type) { return type?.ToLowerInvariant() switch { "creator" => RankingType.Creator, "donor" => RankingType.Donor, _ => RankingType.Comprehensive }; } private static RankingPeriod ParsePeriod(string? period) { return period?.ToLowerInvariant() switch { "today" => RankingPeriod.Today, "yesterday" => RankingPeriod.Yesterday, "week" => RankingPeriod.Week, "last-month" or "lastmonth" => RankingPeriod.LastMonth, "all" => RankingPeriod.All, _ => RankingPeriod.Month }; } }