Handler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Stocks.GetStockDisclosures;
  5. /// <summary>
  6. /// 특정 종목(6자리 StockCode)의 전자공시(DART) 목록 — 접수일(RceptDt) 내림차순, 동일자는 접수번호 내림차순 페이징 (익명).
  7. /// 공시가 없는 종목은 빈 목록 반환 (NotFound 아님 — Disclosure 는 종목 마스터와 독립 피드).
  8. /// </summary>
  9. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  10. {
  11. private const ushort MaxPerPage = 100;
  12. public async Task<Response> Handle(Query request, CancellationToken ct)
  13. {
  14. var page = request.Page < 1 ? 1 : request.Page;
  15. var perPage = request.PerPage is 0 or > MaxPerPage ? (ushort)20 : request.PerPage;
  16. var query = db.Disclosure.AsNoTracking().Where(c => c.StockCode == request.Code);
  17. var total = await query.CountAsync(ct);
  18. var list = await query
  19. .OrderByDescending(c => c.RceptDt).ThenByDescending(c => c.RceptNo)
  20. .Skip((page - 1) * perPage)
  21. .Take(perPage)
  22. .Select(c => new Response.Row
  23. {
  24. RceptNo = c.RceptNo,
  25. CorpCode = c.CorpCode,
  26. CorpName = c.CorpName,
  27. CorpCls = c.CorpCls,
  28. ReportNm = c.ReportNm,
  29. FlrNm = c.FlrNm,
  30. RceptDt = c.RceptDt,
  31. Rm = c.Rm
  32. })
  33. .ToListAsync(ct);
  34. return new Response
  35. {
  36. Total = total,
  37. List = list
  38. };
  39. }
  40. }