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