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