using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Api.MyPage.Sns.List; internal sealed class Handler(IAppDbContext db) : IQueryHandler> { // 지원 예정 provider — 카드 UI 에 'disabled' 로 노출하기 위해 항상 응답에 포함 private static readonly string[] SupportedProviders = ["Google", "Naver", "Kakao"]; public async Task> Handle(Query request, CancellationToken ct) { var tokens = await db.MemberOAuthToken .AsNoTracking() .Where(t => t.MemberID == request.MemberID) .Select(t => new { t.Provider, t.CreatedAt, t.UpdatedAt, t.ExpiresAt }) .ToListAsync(ct); var now = DateTime.UtcNow; var items = SupportedProviders.Select(provider => { var token = tokens.FirstOrDefault(t => t.Provider == provider); if (token is null) { return new SnsLinkItem(provider, false, null, null, null, false); } return new SnsLinkItem( provider, true, token.CreatedAt, token.UpdatedAt, token.ExpiresAt, now >= token.ExpiresAt ); }).ToList(); return Result.Success(new Response(items)); } }