コード例 #1
0
        public async Task <OperationResultWithData <SlotDto> > RescheduleSlot([FromBody] RescheduleSlotDto dto)
        {
            var slot = await _officeHoursService.RescheduleSlot(dto.SlotId, Session.LmsUser, dto);

            return(slot);
        }
コード例 #2
0
        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));
        }