using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.Stocks.Watch.List; /// /// 회원 관심종목 목록 — StockWatch(회원) 최근 등록순으로 Stock 을 Code 조인, 종목명·시장·최근 종가/등락률(denorm) 반환. /// enum→문자열 변환은 EF 번역 불가라 조회 후 메모리에서 매핑(GetList 패턴). /// internal sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task Handle(Query request, CancellationToken ct) { var raw = await db.StockWatch.AsNoTracking() .Where(w => w.MemberID == request.MemberID) .OrderByDescending(w => w.CreatedAt) .Join(db.Stock.AsNoTracking(), w => w.StockCode, s => s.Code, (w, s) => new { s.Code, s.Name, s.Market, s.LastClosePrice, s.LastChangeRate }) .ToListAsync(ct); return new Response { List = [..raw.Select(c => new Response.Row { Code = c.Code, Name = c.Name, Market = c.Market.ToString(), ClosePrice = c.LastClosePrice, ChangeRate = c.LastChangeRate })] }; } }