Beispiel #1
0
        public async Task <TimetableDto> Handle(AddTimetableCommand request, CancellationToken cancellationToken)
        {
            var timetableEntity = request.NewTimetableDto.Adapt <Timetable>();

            _ = await _dbContext.AddAsync(timetableEntity, cancellationToken);

            _ = await _dbContext.SaveChangesAsync(cancellationToken);

            var newTimetable = _dbContext
                               .Timetables
                               .Where(m => m.ClassTypeId == request.NewTimetableDto.ClassTypeId)
                               .AsEnumerable()
                               .LastOrDefault();

            if (newTimetable is null)
            {
                throw new NullReferenceException("Failed to add timetable. Try again");
            }

            var classGenerator = new ClassGenerator(_dbContext);
            await classGenerator.AddClassesForTimetableAsync(timetableEntity, cancellationToken);

            var newTimetableDto = newTimetable.Adapt <TimetableDto>();

            return(newTimetableDto);
        }
Beispiel #2
0
        public async Task <ReservationDtoSetter> Handle(SignUpForClassCommand request, CancellationToken cancellationToken)
        {
            var reservationEntity = request.Reservation.Adapt <Reservation>();

            if (await IsLimitExceeded(reservationEntity, cancellationToken))
            {
                throw new ArgumentException(
                          $"Limit of participants for this classes has been exceeded [Limit: {_classTypeParticipantsLimit}]");
            }

            _ = await _dbContext.AddAsync(reservationEntity, cancellationToken);

            _ = await _dbContext.SaveChangesAsync(cancellationToken);

            var newReservation = await _dbContext
                                 .Reservations
                                 .SingleOrDefaultAsync(
                m => m.ClassId == reservationEntity.ClassId && m.MemberId == reservationEntity.MemberId,
                cancellationToken);

            if (newReservation is null)
            {
                throw new NullReferenceException("Failed to sign in for classes. Try again");
            }

            _signUpForClassSender.AddReservation(newReservation);

            var newReservationDto = newReservation.Adapt <ReservationDtoSetter>();

            return(newReservationDto);
        }
Beispiel #3
0
        public async Task <ClassTypeDto> Handle(AddClassTypeCommand request, CancellationToken cancellationToken)
        {
            var name            = request.NewClassType.Name;
            var classTypeEntity = request.NewClassType.Adapt <ClassType>();

            _ = await _dbContext.AddAsync(classTypeEntity, cancellationToken);

            _ = await _dbContext.SaveChangesAsync(cancellationToken);

            var newClassTypeEntity = await _dbContext
                                     .ClassTypes
                                     .SingleOrDefaultAsync(m => m.Name == name, cancellationToken);

            if (newClassTypeEntity is null)
            {
                throw new NullReferenceException("Failed to add class type. Try again");
            }

            var newClassTypeDto = newClassTypeEntity.Adapt <ClassTypeDto>();

            return(newClassTypeDto);
        }
        public async Task AddClassesForTimetableAsync(Timetable timetable, CancellationToken cancellationToken = default)
        {
            var timetableStartingDate = timetable.StartingDate;

            var classTypeEntity = await _dbContext
                                  .ClassTypes
                                  .SingleOrDefaultAsync(m => m.ClassTypeId == timetable.ClassTypeId, cancellationToken);

            var classesStartingTime = timetable.ClassesStartingTime;
            var classDate           = timetableStartingDate;

            var classesDto = new CalendarClassDto {
                Date = classDate
            };

            while (classDate >= timetableStartingDate && classDate <= timetable.EndingDate)
            {
                if (classDate == timetableStartingDate)
                {
                    classesDto.ClassName    = classTypeEntity.Name;
                    classesDto.ClassTypeId  = timetable.ClassTypeId;
                    classesDto.StartingTime = classesStartingTime;
                    classesDto.EndingTime   = classesStartingTime.AddMinutes(classTypeEntity.Duration);
                    classesDto.TimetableId  = timetable.TimetableId;
                }
                else
                {
                    classesDto.Date = classDate;
                }

                var classEntity = classesDto.Adapt <CalendarClass>();
                _ = await _dbContext.AddAsync(classEntity, cancellationToken);

                classDate = CalculateNextClassDate(classDate, timetable);
            }

            _ = await _dbContext.SaveChangesAsync(cancellationToken);
        }