Handler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Stocks.GetExchangeRates;
  5. /// <summary>
  6. /// 환율 목록 — 지정일(미지정 시 최신 TradeDate)의 전 통화 환율을 통화코드 오름차순으로 반환 (수출입은행 AP01 수집, 익명).
  7. /// </summary>
  8. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  9. {
  10. public async Task<Response> Handle(Query request, CancellationToken ct)
  11. {
  12. var targetDate = request.Date;
  13. if (targetDate is null)
  14. {
  15. targetDate = await db.ExchangeRate.AsNoTracking()
  16. .OrderByDescending(c => c.TradeDate)
  17. .Select(c => (DateOnly?)c.TradeDate)
  18. .FirstOrDefaultAsync(ct);
  19. }
  20. if (targetDate is null)
  21. {
  22. return new Response
  23. {
  24. Total = 0,
  25. TradeDate = null,
  26. List = []
  27. };
  28. }
  29. var list = await db.ExchangeRate.AsNoTracking()
  30. .Where(c => c.TradeDate == targetDate.Value)
  31. .OrderBy(c => c.CurrencyUnit)
  32. .Select(c => new Response.Row
  33. {
  34. CurrencyUnit = c.CurrencyUnit,
  35. CurrencyName = c.CurrencyName,
  36. DealBasRate = c.DealBasRate,
  37. Ttb = c.Ttb,
  38. Tts = c.Tts
  39. })
  40. .ToListAsync(ct);
  41. return new Response
  42. {
  43. Total = list.Count,
  44. TradeDate = targetDate.Value,
  45. List = list
  46. };
  47. }
  48. }