using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Api.Stocks.Suggest; /// 종목 자동완성 — 이름/코드 prefix 매칭 상위 10건 (d0 §3-D, D1 소유) internal sealed class Handler(IAppDbContext db) : IQueryHandler { private const int MaxItems = 10; public async Task Handle(Query request, CancellationToken ct) { var q = request.Q?.Trim(); if (string.IsNullOrEmpty(q)) { return new Response { List = [] }; } var list = await db.Stock.AsNoTracking() .Where(c => c.IsActive && (c.Name.StartsWith(q) || c.Code.StartsWith(q))) .OrderBy(c => c.Name).ThenBy(c => c.Code) .Take(MaxItems) .Select(c => new { c.Code, c.Name, c.Market }) .ToListAsync(ct); return new Response { List = [..list.Select(c => new Response.Item { Code = c.Code, Name = c.Name, Market = c.Market.ToString() })] }; } }