Handler.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Admin.Stocks.MarketHolidays.Add;
  6. /// <summary>
  7. /// 휴장일 등록. 거래일을 휴장일로 잘못 등록하면 수집 배치가 그 날짜를 건너뛰어 데이터가 영구 결손되므로
  8. /// 주말(불필요)·중복만 막고 나머지 검증은 운영자 판단에 맡긴다 (연 1회 KRX 휴장일 공시 기준 등록).
  9. /// </summary>
  10. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
  11. {
  12. public async Task<Result> Handle(Command request, CancellationToken ct)
  13. {
  14. if (string.IsNullOrWhiteSpace(request.Name))
  15. {
  16. return Result.Failure(Error.Problem("MarketHoliday.NameRequired", "휴장일 명칭을 입력하세요."));
  17. }
  18. if (request.Date.DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday)
  19. {
  20. return Result.Failure(Error.Problem("MarketHoliday.Weekend", "주말(토·일)은 수집 배치가 자동 제외하므로 등록할 필요가 없습니다."));
  21. }
  22. if (await db.MarketHoliday.AsNoTracking().AnyAsync(c => c.Date == request.Date, ct))
  23. {
  24. return Result.Failure(Error.Conflict("MarketHoliday.Duplicate", $"{request.Date:yyyy-MM-dd} 은(는) 이미 등록된 휴장일입니다."));
  25. }
  26. db.MarketHoliday.Add(Domain.Entities.Stocks.MarketHoliday.Create(request.Date, request.Name));
  27. await db.SaveChangesAsync(ct);
  28. return Result.Success();
  29. }
  30. }