public async Task <OperationResultWithData <SlotDto> > RescheduleSlot([FromBody] RescheduleSlotDto dto) { var slot = await _officeHoursService.RescheduleSlot(dto.SlotId, Session.LmsUser, dto); return(slot); }
public async Task <OperationResultWithData <SlotDto> > RescheduleSlot(int slotId, LmsUser lmsUser, RescheduleSlotDto dto) { if (dto.Start < DateTime.UtcNow) { return(OperationResultWithData <SlotDto> .Error("Upcoming slots couldn't be moved for elapsed time")); } var slot = _slotModel.GetOneById(slotId).Value; //var slot = await _context.OhSlots.Include(x => x.Availability).ThenInclude(x => x.Meeting).FirstOrDefaultAsync(x => x.Id == slotId); if (slot == null) { return(OperationResultWithData <SlotDto> .Error("Slot not found")); } var currentSlots = await GetSlots(slot.Availability.Meeting.Id, lmsUser.Id, DateTime.UtcNow, DateTime.UtcNow.AddYears(1)); var busySlot = currentSlots.FirstOrDefault(x => x.Start == dto.Start); if (busySlot != null) { if (busySlot.Status == (int)OfficeHoursSlotStatus.Free) //free { if ((busySlot.End - busySlot.Start).Minutes != slot.Availability.Duration) { return(OperationResultWithData <SlotDto> .Error( "Another slot with different duration is available at the same time.")); } var slotResult = await AddSlots(slot.Availability.Meeting.Id, slot.User, new[] { new CreateSlotDto { Start = dto.Start, End = dto.Start.AddMinutes(slot.Availability.Duration), Questions = slot.Questions, Subject = slot.Subject } }); if (slotResult.IsSuccess) { var oldSlotResult = await DeleteSlot(slotId, lmsUser); return(slotResult.Data.First().ToSuccessResult()); } //todo: send email return(OperationResultWithData <SlotDto> .Error(slotResult.Message)); } else { return(OperationResultWithData <SlotDto> .Error( "Another slot has already been booked at this time or time is not available for booking.")); } } if (currentSlots.Any(cs => (cs.Start <= dto.Start && cs.End > dto.Start) || (cs.Start < dto.Start.AddMinutes(slot.Availability.Duration) && cs.End >= dto.Start.AddMinutes(slot.Availability.Duration)))) { return(OperationResultWithData <SlotDto> .Error( "Another slot with different duration is available at the same time.")); } var availabilityDto = new OfficeHoursTeacherAvailabilityDto { Intervals = new List <AvailabilityInterval> { new AvailabilityInterval { Start = dto.Start.Hour * 60 + dto.Start.Minute, End = dto.Start.Hour * 60 + dto.Start.Minute + slot.Availability.Duration } }, PeriodStart = dto.Start, PeriodEnd = dto.Start.AddMinutes(slot.Availability.Duration), Duration = slot.Availability.Duration, DaysOfWeek = new[] { (int)dto.Start.DayOfWeek } }; var availabilityResult = await AddAvailability(slot.Availability.Meeting, lmsUser, availabilityDto); if (!availabilityResult.IsSuccess) { return(OperationResultWithData <SlotDto> .Error($"Error during slot time move. {availabilityResult.Message}")); } var newSlotResult = await AddSlots(slot.Availability.Meeting.Id, slot.User, new[] { new CreateSlotDto { Start = dto.Start, End = dto.Start.AddMinutes(slot.Availability.Duration), Questions = slot.Questions, Subject = slot.Subject } }); if (newSlotResult.IsSuccess && !string.IsNullOrEmpty(dto.Message)) { //var meeting = slot.Availability.Meeting; //var details = await _meetingService.GetMeetingApiDetails(meeting); //await _notificationService.SendOHRescheduleEmail(slot.Start, newSlotResult.Data.First(), details.Topic, dto.Message); } var oldSlotResultAdd = await DeleteSlot(slotId, lmsUser); //todo: send email return(newSlotResult.IsSuccess ? newSlotResult.Data.First().ToSuccessResult() : OperationResultWithData <SlotDto> .Error(newSlotResult.Message)); }