Handler.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Stocks.GetLendingHistory;
  6. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. private const ushort MaxPerPage = 500;
  9. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  10. {
  11. var input = request.CodeOrIsin?.Trim();
  12. if (string.IsNullOrEmpty(input))
  13. {
  14. return Result.Failure<Response>(Error.Problem("Stock.CodeRequired", "종목 코드가 필요합니다."));
  15. }
  16. // 단축코드(6자리)면 Stock 조인으로 ISIN 확보, 아니면 입력을 ISIN 으로 간주.
  17. var isin = await db.Stock.AsNoTracking().Where(c => c.Code == input && c.ISIN != null).Select(c => c.ISIN!).FirstOrDefaultAsync(ct) ?? input;
  18. var page = request.Page < 1 ? 1 : request.Page;
  19. var perPage = request.PerPage is 0 or > MaxPerPage ? (ushort)90 : request.PerPage;
  20. var query = db.SecuritiesLending.AsNoTracking().Where(c => c.Isin == isin);
  21. if (request.From.HasValue)
  22. {
  23. query = query.Where(c => c.StdDt >= request.From.Value);
  24. }
  25. if (request.To.HasValue)
  26. {
  27. query = query.Where(c => c.StdDt <= request.To.Value);
  28. }
  29. var total = await query.CountAsync(ct);
  30. var list = await query
  31. .OrderByDescending(c => c.StdDt)
  32. .Skip((page - 1) * perPage)
  33. .Take(perPage)
  34. .Select(c => new Response.Row
  35. {
  36. StdDt = c.StdDt,
  37. LendingBalanceQty = c.SlbTrRemQty,
  38. MatchedQty = c.MatcQty,
  39. RedeemedQty = c.RedQty,
  40. TradeQty = c.TrQty,
  41. ForeignLendRatio = c.FrinerLendRemRatio,
  42. NativeLendRatio = c.NativeLendRemRatio,
  43. ForeignBorrowRatio = c.FrinerBrwRemRatio,
  44. NativeBorrowRatio = c.NativeBrwRemRatio
  45. })
  46. .ToListAsync(ct);
  47. return new Response
  48. {
  49. Isin = isin,
  50. Total = total,
  51. List = list
  52. };
  53. }
  54. }