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 }; } }