Handler.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Stocks.GetDividendCalendar;
  6. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. private const ushort MaxPerPage = 200;
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var page = request.Page < 1 ? 1 : request.Page;
  12. var perPage = request.PerPage is 0 or > MaxPerPage ? (ushort)30 : request.PerPage;
  13. var query = db.DividendSchedule.AsNoTracking();
  14. if (request.From.HasValue)
  15. {
  16. query = query.Where(c => c.RgtStdDt >= request.From.Value);
  17. }
  18. if (request.To.HasValue)
  19. {
  20. query = query.Where(c => c.RgtStdDt <= request.To.Value);
  21. }
  22. var total = await query.CountAsync(ct);
  23. var list = await query
  24. .OrderByDescending(c => c.RgtStdDt)
  25. .ThenBy(c => c.IssucoCustno)
  26. .ThenBy(c => c.RgtRsnDetailSortCd)
  27. .Skip((page - 1) * perPage)
  28. .Take(perPage)
  29. .Select(c => new Response.Row
  30. {
  31. IssucoCustno = c.IssucoCustno,
  32. Name = c.RepSecnNm,
  33. RgtStdDt = c.RgtStdDt,
  34. XrgtDt = c.XrgtDt,
  35. SortCode = c.RgtRsnDetailSortCd,
  36. FixType = c.FixTpcd,
  37. SettleType = c.SetaccTpcd
  38. })
  39. .ToListAsync(ct);
  40. return new Response
  41. {
  42. Total = total,
  43. List = list
  44. };
  45. }
  46. }