Beispiel #1
0
        public async Task AddAsync(int userId, AddReservation addReservation)
        {
            if (addReservation.NumberOfConcessionaryTickets + addReservation.NumberOfNormalTickets !=
                addReservation.SeatsToReserve.Count())
            {
                throw new Exception("Number of tickets is not equal to number of choosen seats");
            }

            Seance seance = await _dbContext.Seances
                            .Include(x => x.Room).ThenInclude(x => x.Seats)
                            .Include(x => x.Reservations).ThenInclude(x => x.ReservedSeats)
                            .FirstOrDefaultAsync(x => x.Id == addReservation.SeanceId);

            if (seance == null)
            {
                throw new Exception("Seance doesn't exist");
            }

            Reservation reservation = new Reservation(addReservation.SeanceId, userId, addReservation.NumberOfNormalTickets, addReservation.NumberOfConcessionaryTickets);

            foreach (var seatToReserve in addReservation.SeatsToReserve)
            {
                var seat = await _dbContext.Seats.SingleOrDefaultAsync(x => x.RoomId == seance.RoomId && x.Number == seatToReserve.Number && x.Row == seatToReserve.Row);

                if (seat == null)
                {
                    throw new Exception("Seat with given row and numer doesn't exist in seance room.");
                }
                if (seance.Reservations.Any(r => r.ReservedSeats.Any(rs => rs.SeatId == seat.Id)))
                {
                    throw new Exception($"Seat {seat.Row}|{seat.Number} already reserved");
                }
                reservation.AddReservedSeat(seat.Id, _dbContext);
            }
            await _dbContext.Reservations.AddAsync(reservation);

            await _dbContext.SaveChangesAsync();

            var user = await _dbContext.Users.FirstOrDefaultAsync(x => x.Id == userId);

            await _emailSender.SendEmailAsync(user.Email, "Potwierdzenie rezerwacji", "Twoja rezerwacja zakończyła się powodzeniem");
        }