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); }
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); }
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); }