using Brizco.Domain.Entities.Shift; namespace Brizco.Repository.Handlers.Shift; public class UpdatePositionCommandHandler : IRequestHandler { private readonly IRepositoryWrapper _repositoryWrapper; private readonly ICurrentUserService _currentUserService; public UpdatePositionCommandHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService) { _repositoryWrapper = repositoryWrapper; _currentUserService = currentUserService; } public async Task Handle(UpdateShiftCommand request, CancellationToken cancellationToken) { var shift = await _repositoryWrapper.SetRepository() .TableNoTracking.FirstOrDefaultAsync(s => s.Id == request.Id, cancellationToken); if (shift == null) throw new AppException("Shift not found", ApiResultStatusCode.NotFound); if (_currentUserService.ComplexId == null) throw new AppException("ComplexId is null", ApiResultStatusCode.NotFound); if (!Guid.TryParse(_currentUserService.ComplexId, out Guid complexId)) throw new AppException("ComplexId is wrong", ApiResultStatusCode.NotFound); var newShift = Domain.Entities.Shift.Shift.Create(request.Title, request.Description, request.StartAt, request.EndAt, complexId); newShift.Id = request.Id; if (request.DayOfWeeks.Count == 0) throw new AppException("روزهای شیفت را انتخاب کنید"); var shiftDays = await _repositoryWrapper.SetRepository() .TableNoTracking.Where(sd => sd.ShiftId == request.Id) .ToListAsync(cancellationToken); foreach (var shiftDay in shiftDays.Where(shiftDay => !request.DayOfWeeks.Contains(shiftDay.DayOfWeek))) { _repositoryWrapper.SetRepository() .Delete(shiftDay); await _repositoryWrapper.SaveChangesAsync(cancellationToken); } foreach (var dayOfWeek in from dayOfWeek in request.DayOfWeeks let findDay = shiftDays.FirstOrDefault(sf => sf.DayOfWeek == dayOfWeek) where findDay == null select dayOfWeek) { newShift.SetDay(dayOfWeek); } if (request.Routines.Count == 0) throw new AppException("روتین شیفت را انتخاب کنید"); var shiftRoutines = await _repositoryWrapper.SetRepository() .TableNoTracking.Where(sd => sd.ShiftId == request.Id) .ToListAsync(cancellationToken); foreach (var shiftRoutine in shiftRoutines.Where(shiftRoutine => !request.Routines.Contains(shiftRoutine.RoutineId))) { _repositoryWrapper.SetRepository() .Delete(shiftRoutine); await _repositoryWrapper.SaveChangesAsync(cancellationToken); } foreach (var routine in request.Routines.Where(r=>!shiftRoutines.Exists(routine=>routine.RoutineId==r))) { newShift.AddRoutine(routine); } _repositoryWrapper.SetRepository() .Update(newShift); await _repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } }