| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Domain.Entities.Stocks.ValueObject;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Stocks.GetInterestRates;
- /// <summary>
- /// 금리 목록 — 국제금리는 Yahoo 수집분(MarketQuoteSnapshot, Category=BondYield·GroupCode="macro")의 미국채 수익률(%)을 반환 (익명).
- /// koreaexim AP02/AP03 은 봇차단 WAF 로 이 서버망에서 수집 불가 → 이미 수집 중인 Yahoo 매크로 시세로 소스 전환 (2026-07-14).
- /// 대출금리(Loan)는 Yahoo 대응이 없어 빈 목록으로 반환한다(개요 화면은 International 만 사용). Date 파라미터는 스냅샷 특성상 무시(항상 최신).
- /// </summary>
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> Handle(Query request, CancellationToken ct)
- {
- // Yahoo 는 국제금리(미국채 수익률)만 제공 — 대출금리(Loan)는 미수집
- if (request.Type != RateType.International)
- {
- return new Response
- {
- Type = request.Type,
- Total = 0,
- TradeDate = null,
- List = []
- };
- }
- var rows = await db.MarketQuoteSnapshot.AsNoTracking()
- .Where(c => c.Category == QuoteCategory.BondYield && c.GroupCode == "macro")
- .OrderBy(c => c.Symbol)
- .Select(c => new { c.Name, c.Close, c.TradeDate })
- .ToListAsync(ct);
- if (rows.Count == 0)
- {
- return new Response
- {
- Type = request.Type,
- Total = 0,
- TradeDate = null,
- List = []
- };
- }
- var list = rows
- .Select(c => new Response.Row
- {
- ItemName = c.Name,
- Rate = c.Close
- })
- .ToList();
- return new Response
- {
- Type = request.Type,
- Total = list.Count,
- TradeDate = rows.Max(c => c.TradeDate),
- List = list
- };
- }
- }
|