GetMyRank.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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 GetMyRank : IEndpoint
  8. {
  9. public void MapEndpoint(IEndpointRouteBuilder app)
  10. {
  11. app.MapGet("api/ranking/my-rank", async (
  12. string? type,
  13. string? period,
  14. string? category,
  15. ClaimsPrincipal user,
  16. ISender sender,
  17. CancellationToken ct
  18. ) => {
  19. var memberID = user.GetMemberID();
  20. if (memberID is null)
  21. {
  22. return ApiResponse.Fail(StatusCodes.Status401Unauthorized, "Invalid token");
  23. }
  24. var rankingType = type?.ToLowerInvariant() switch {
  25. "creator" => RankingType.Creator,
  26. "donor" => RankingType.Donor,
  27. _ => RankingType.Comprehensive
  28. };
  29. var rankingPeriod = period?.ToLowerInvariant() switch {
  30. "today" => RankingPeriod.Today,
  31. "yesterday" => RankingPeriod.Yesterday,
  32. "week" => RankingPeriod.Week,
  33. "last-month" or "lastmonth" => RankingPeriod.LastMonth,
  34. "all" => RankingPeriod.All,
  35. _ => RankingPeriod.Month
  36. };
  37. var query = new Application.Features.Api.Ranking.GetMyRank.Query(memberID.Value, rankingType, rankingPeriod, category);
  38. var data = await sender.Send(query, ct);
  39. return ApiResponse.Ok(data);
  40. })
  41. .WithTags("Ranking")
  42. .RequireAuthorization();
  43. }
  44. }