Handler.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Stocks.Suggest;
  5. /// <summary>종목 자동완성 — 이름/코드 prefix 매칭 상위 10건 (d0 §3-D, D1 소유)</summary>
  6. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  7. {
  8. private const int MaxItems = 10;
  9. public async Task<Response> Handle(Query request, CancellationToken ct)
  10. {
  11. var q = request.Q?.Trim();
  12. if (string.IsNullOrEmpty(q))
  13. {
  14. return new Response
  15. {
  16. List = []
  17. };
  18. }
  19. var list = await db.Stock.AsNoTracking()
  20. .Where(c => c.IsActive && (c.Name.StartsWith(q) || c.Code.StartsWith(q)))
  21. .OrderBy(c => c.Name).ThenBy(c => c.Code)
  22. .Take(MaxItems)
  23. .Select(c => new
  24. {
  25. c.Code,
  26. c.Name,
  27. c.Market
  28. })
  29. .ToListAsync(ct);
  30. return new Response
  31. {
  32. List = [..list.Select(c => new Response.Item
  33. {
  34. Code = c.Code,
  35. Name = c.Name,
  36. Market = c.Market.ToString()
  37. })]
  38. };
  39. }
  40. }