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