namespace Brizco.Repository.Handlers.ShiftPlan; public class CreateShiftPlanCommandHandler : IRequestHandler { private readonly IRepositoryWrapper _repositoryWrapper; public CreateShiftPlanCommandHandler(IRepositoryWrapper repositoryWrapper) { _repositoryWrapper = repositoryWrapper; } public async Task Handle(CreateShiftPlanCommand request, CancellationToken cancellationToken) { var shift = await _repositoryWrapper.SetRepository() .TableNoTracking .FirstOrDefaultAsync(s => s.Id == request.ShiftId, cancellationToken); if (shift == null) throw new AppException("Shift not found", ApiResultStatusCode.NotFound); try { await _repositoryWrapper.BeginTransaction(cancellationToken); var shiftPlan = shift.AddPlan(DateTimeExtensions.UnixTimeStampToDateTime(request.PlanDate),request.RoutineId); if (request.UserAndPositionIds.Count == 0) throw new AppException("شیفت بندی مورد نظر باید حداقل متشکل از یک فرد باشد", ApiResultStatusCode.BadRequest); foreach (var userAndPositionId in request.UserAndPositionIds) { shiftPlan.AddUser(userAndPositionId.Key, userAndPositionId.Value); } _repositoryWrapper.SetRepository().Add(shiftPlan); await _repositoryWrapper.SaveChangesAsync(cancellationToken); await _repositoryWrapper.CommitAsync(cancellationToken); return shiftPlan.AdaptToLDto(); } catch (Exception ) { await _repositoryWrapper.RollBackAsync(cancellationToken); throw; } } }