using Application.Abstractions.Data;
using Application.Abstractions.Messaging;
using Microsoft.EntityFrameworkCore;
namespace Application.Features.Api.Stocks.GetMarketQuotes;
///
/// 주요 종목·상품 시세 그리드 — MarketQuoteSnapshot 을 그룹(GroupCode)으로 필터하고 그룹→등락률 내림차순 정렬해 반환한다.
/// Category 는 숫자값으로 노출(프론트 라벨맵). 그룹 미지정 시 전체.
///
internal sealed class Handler(IAppDbContext db) : IQueryHandler
{
public async Task Handle(Query request, CancellationToken ct)
{
var query = db.MarketQuoteSnapshot.AsNoTracking();
if (!string.IsNullOrWhiteSpace(request.Group))
{
var group = request.Group.Trim().ToLowerInvariant();
query = query.Where(c => c.GroupCode == group);
}
var rows = await query
.OrderBy(c => c.GroupCode).ThenByDescending(c => c.FlucRateBp)
.Select(c => new Response.Row
{
Symbol = c.Symbol,
Name = c.Name,
Category = (int)c.Category,
GroupCode = c.GroupCode,
CountryCode = c.CountryCode,
Close = c.Close,
ChangeVal = c.ChangeVal,
FlucRateBp = c.FlucRateBp,
Volume = c.Volume,
TradeDate = c.TradeDate
})
.ToListAsync(ct);
return new Response
{
List = rows
};
}
}