Handler.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Stocks.GetCbExercises;
  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 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)30 : request.PerPage;
  20. // 행사주식(기본) 또는 채권 기준 조회
  21. var query = request.ByBond
  22. ? db.ConvertibleExercise.AsNoTracking().Where(c => c.BondIsin == isin)
  23. : db.ConvertibleExercise.AsNoTracking().Where(c => c.XrcStkIsin == isin);
  24. var total = await query.CountAsync(ct);
  25. var list = await query
  26. .OrderByDescending(c => c.RgtStdDt)
  27. .ThenBy(c => c.BondIsin)
  28. .Skip((page - 1) * perPage)
  29. .Take(perPage)
  30. .Select(c => new Response.Row
  31. {
  32. BondIsin = c.BondIsin,
  33. BondName = c.BondKorSecnNm,
  34. BondKind = c.BondKindNm,
  35. ExerciseStockIsin = c.XrcStkIsin,
  36. ExerciseStockName = c.StkKorSecnNm,
  37. RgtStdDt = c.RgtStdDt,
  38. ExercisePrice = c.XrcPrice,
  39. ExerciseQty = c.XrcQty,
  40. ExerciseAmt = c.XrcAmt,
  41. ListDt = c.ListDt
  42. })
  43. .ToListAsync(ct);
  44. return new Response
  45. {
  46. Isin = isin,
  47. Total = total,
  48. List = list
  49. };
  50. }
  51. }