| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- namespace Application.Features.Api.Stocks.GetMarketQuotes;
- /// <summary>
- /// 주요 종목·상품 시세 그리드 — MarketQuoteSnapshot 을 그룹(GroupCode)으로 필터하고 그룹→등락률 내림차순 정렬해 반환한다.
- /// Category 는 숫자값으로 노출(프론트 라벨맵). 그룹 미지정 시 전체.
- /// </summary>
- internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
- {
- public async Task<Response> 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
- };
- }
- }
|