Handler.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Stocks.Watch.List;
  5. /// <summary>
  6. /// 회원 관심종목 목록 — StockWatch(회원) 최근 등록순으로 Stock 을 Code 조인, 종목명·시장·최근 종가/등락률(denorm) 반환.
  7. /// enum→문자열 변환은 EF 번역 불가라 조회 후 메모리에서 매핑(GetList 패턴).
  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 raw = await db.StockWatch.AsNoTracking()
  14. .Where(w => w.MemberID == request.MemberID)
  15. .OrderByDescending(w => w.CreatedAt)
  16. .Join(db.Stock.AsNoTracking(), w => w.StockCode, s => s.Code, (w, s) => new
  17. {
  18. s.Code,
  19. s.Name,
  20. s.Market,
  21. s.LastClosePrice,
  22. s.LastChangeRate
  23. })
  24. .ToListAsync(ct);
  25. return new Response
  26. {
  27. List = [..raw.Select(c => new Response.Row
  28. {
  29. Code = c.Code,
  30. Name = c.Name,
  31. Market = c.Market.ToString(),
  32. ClosePrice = c.LastClosePrice,
  33. ChangeRate = c.LastChangeRate
  34. })]
  35. };
  36. }
  37. }