GetRanking.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System.Security.Claims;
  2. using Domain.Entities.Donations.ValueObject;
  3. using MediatR;
  4. using Web.Api.Common;
  5. using Web.Api.Extensions;
  6. namespace Web.Api.Endpoints.Ranking;
  7. internal sealed class GetRanking : IEndpoint
  8. {
  9. public void MapEndpoint(IEndpointRouteBuilder app)
  10. {
  11. app.MapGet("api/ranking", async (
  12. string? type,
  13. string? period,
  14. string? category,
  15. int? page,
  16. int? perPage,
  17. ClaimsPrincipal? user,
  18. ISender sender,
  19. CancellationToken ct
  20. ) => {
  21. var rankingType = ParseType(type);
  22. var rankingPeriod = ParsePeriod(period);
  23. var viewerId = user?.GetMemberID();
  24. var query = new Application.Features.Api.Ranking.GetRanking.Query(
  25. rankingType,
  26. rankingPeriod,
  27. category,
  28. page ?? 1,
  29. perPage ?? 50,
  30. viewerId
  31. );
  32. var data = await sender.Send(query, ct);
  33. return ApiResponse.Ok(data);
  34. })
  35. .WithTags("Ranking");
  36. }
  37. private static RankingType ParseType(string? type) {
  38. return type?.ToLowerInvariant() switch {
  39. "creator" => RankingType.Creator,
  40. "donor" => RankingType.Donor,
  41. _ => RankingType.Comprehensive
  42. };
  43. }
  44. private static RankingPeriod ParsePeriod(string? period) {
  45. return period?.ToLowerInvariant() switch {
  46. "today" => RankingPeriod.Today,
  47. "yesterday" => RankingPeriod.Yesterday,
  48. "week" => RankingPeriod.Week,
  49. "last-month" or "lastmonth" => RankingPeriod.LastMonth,
  50. "all" => RankingPeriod.All,
  51. _ => RankingPeriod.Month
  52. };
  53. }
  54. }