ChannelsGetByIds.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using System.Security.Claims;
  2. using Web.Api.Common;
  3. using Web.Api.Extensions;
  4. using Application.Abstractions.Messaging;
  5. namespace Web.Api.Endpoints.Store;
  6. /// <summary>상점 — 최근 후원 채널 자동 검증. localStorage 의 stale ID 자동 제거용.</summary>
  7. internal sealed class ChannelsGetByIds : IEndpoint
  8. {
  9. /// <summary>최대 ID 개수 (방어적 상한).</summary>
  10. private const int MaxIDs = 10;
  11. public void MapEndpoint(IEndpointRouteBuilder app)
  12. {
  13. app.MapGet("api/store/channels/by-ids", async (
  14. string? ids,
  15. ClaimsPrincipal user,
  16. ISender sender,
  17. CancellationToken ct
  18. ) => {
  19. var memberID = user.GetRequiredMemberID();
  20. var parsed = (ids ?? "")
  21. .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
  22. .Select(s => int.TryParse(s, out var v) ? v : 0)
  23. .Where(v => v > 0)
  24. .Distinct()
  25. .Take(MaxIDs)
  26. .ToList();
  27. var data = await sender.Send(new Application.Features.Api.Channel.GetByIds.Query(memberID, parsed), ct);
  28. return ApiResponse.Ok(data);
  29. })
  30. .WithTags("Store")
  31. .RequireAuthorization();
  32. }
  33. }