Handler.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Stocks.GetMarketQuotes;
  5. /// <summary>
  6. /// 주요 종목·상품 시세 그리드 — MarketQuoteSnapshot 을 그룹(GroupCode)으로 필터하고 그룹→등락률 내림차순 정렬해 반환한다.
  7. /// Category 는 숫자값으로 노출(프론트 라벨맵). 그룹 미지정 시 전체.
  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 query = db.MarketQuoteSnapshot.AsNoTracking();
  14. if (!string.IsNullOrWhiteSpace(request.Group))
  15. {
  16. var group = request.Group.Trim().ToLowerInvariant();
  17. query = query.Where(c => c.GroupCode == group);
  18. }
  19. var rows = await query
  20. .OrderBy(c => c.GroupCode).ThenByDescending(c => c.FlucRateBp)
  21. .Select(c => new Response.Row
  22. {
  23. Symbol = c.Symbol,
  24. Name = c.Name,
  25. Category = (int)c.Category,
  26. GroupCode = c.GroupCode,
  27. CountryCode = c.CountryCode,
  28. Close = c.Close,
  29. ChangeVal = c.ChangeVal,
  30. FlucRateBp = c.FlucRateBp,
  31. Volume = c.Volume,
  32. TradeDate = c.TradeDate
  33. })
  34. .ToListAsync(ct);
  35. return new Response
  36. {
  37. List = rows
  38. };
  39. }
  40. }