Handler.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Stocks.GetElsRiskBoard;
  6. internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  9. {
  10. var query = db.ElsUnredeemedScale.AsNoTracking();
  11. var bassetCd = request.BassetCd?.Trim();
  12. if (!string.IsNullOrEmpty(bassetCd))
  13. {
  14. query = query.Where(c => c.StndBassetCd == bassetCd);
  15. }
  16. var secnTpcd = request.SecnTpcd?.Trim();
  17. if (!string.IsNullOrEmpty(secnTpcd))
  18. {
  19. query = query.Where(c => c.SecnTpcd == secnTpcd);
  20. }
  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. // 기초자산코드 × 종목구분별로 그룹화하고, 각 그룹 안에서 기준일 오름차순 시계열을 만든다.
  30. var rows = await query
  31. .OrderBy(c => c.StndBassetCd).ThenBy(c => c.SecnTpcd).ThenBy(c => c.StdDt)
  32. .Select(c => new
  33. {
  34. c.StndBassetCd,
  35. c.SecnTpcd,
  36. c.BassetContent,
  37. c.StdDt,
  38. c.UnredSecncnt,
  39. c.UnredRema
  40. })
  41. .ToListAsync(ct);
  42. var series = rows
  43. .GroupBy(c => new { c.StndBassetCd, c.SecnTpcd })
  44. .Select(g => new Response.Series
  45. {
  46. BassetCd = g.Key.StndBassetCd,
  47. SecnTpcd = g.Key.SecnTpcd,
  48. BassetContent = g.Select(c => c.BassetContent).FirstOrDefault(c => c != null),
  49. Points = g.Select(c => new Response.Point
  50. {
  51. StdDt = c.StdDt,
  52. UnredeemedCount = c.UnredSecncnt,
  53. UnredeemedRemaining = c.UnredRema
  54. }).ToList()
  55. })
  56. .ToList();
  57. return new Response { Assets = series };
  58. }
  59. }