Handler.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.MyPage.Sns.List;
  6. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. // 지원 예정 provider — 카드 UI 에 'disabled' 로 노출하기 위해 항상 응답에 포함
  9. private static readonly string[] SupportedProviders = ["Google", "Naver", "Kakao"];
  10. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  11. {
  12. var tokens = await db.MemberOAuthToken
  13. .AsNoTracking()
  14. .Where(t => t.MemberID == request.MemberID)
  15. .Select(t => new
  16. {
  17. t.Provider,
  18. t.CreatedAt,
  19. t.UpdatedAt,
  20. t.ExpiresAt
  21. })
  22. .ToListAsync(ct);
  23. var now = DateTime.UtcNow;
  24. var items = SupportedProviders.Select(provider => {
  25. var token = tokens.FirstOrDefault(t => t.Provider == provider);
  26. if (token is null)
  27. {
  28. return new SnsLinkItem(provider, false, null, null, null, false);
  29. }
  30. return new SnsLinkItem(
  31. provider,
  32. true,
  33. token.CreatedAt,
  34. token.UpdatedAt,
  35. token.ExpiresAt,
  36. now >= token.ExpiresAt
  37. );
  38. }).ToList();
  39. return Result.Success(new Response(items));
  40. }
  41. }