Handler.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Stocks.GetInterestRates;
  5. /// <summary>
  6. /// 금리 목록 — 종류(대출/국제)별, 지정일(미지정 시 최신 TradeDate)의 항목별 금리를 항목명 오름차순으로 반환
  7. /// (수출입은행 AP02/AP03 수집, 익명).
  8. /// </summary>
  9. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  10. {
  11. public async Task<Response> Handle(Query request, CancellationToken ct)
  12. {
  13. var targetDate = request.Date;
  14. if (targetDate is null)
  15. {
  16. targetDate = await db.InterestRate.AsNoTracking()
  17. .Where(c => c.RateType == request.Type)
  18. .OrderByDescending(c => c.TradeDate)
  19. .Select(c => (DateOnly?)c.TradeDate)
  20. .FirstOrDefaultAsync(ct);
  21. }
  22. if (targetDate is null)
  23. {
  24. return new Response
  25. {
  26. Type = request.Type,
  27. Total = 0,
  28. TradeDate = null,
  29. List = []
  30. };
  31. }
  32. var list = await db.InterestRate.AsNoTracking()
  33. .Where(c => c.RateType == request.Type && c.TradeDate == targetDate.Value)
  34. .OrderBy(c => c.ItemName)
  35. .Select(c => new Response.Row
  36. {
  37. ItemName = c.ItemName,
  38. Rate = c.Rate
  39. })
  40. .ToListAsync(ct);
  41. return new Response
  42. {
  43. Type = request.Type,
  44. Total = list.Count,
  45. TradeDate = targetDate.Value,
  46. List = list
  47. };
  48. }
  49. }