public async Task <TheatreDomainModel> Delete(int id) { var theatre = await _theatreRepository.GetByIdAsync(id); if (theatre == null) { return(null); } var allAuditoriums = await _auditoriumsRepository.GetAllAsync(); if (allAuditoriums == null) { return(null); } var auditoriumsInTheatre = allAuditoriums.Where(x => x.TheatreId == id); var seats = await _seatsRepository.GetAllAsync(); foreach (var auditorium in auditoriumsInTheatre) { seats = seats.Where(x => x.AuditoriumId == auditorium.Id); foreach (var seat in seats) { if (seat.ReservationSeats.Any()) { return(null); } //dodat await await _seatsRepository.Delete(seat.Id); } //dodat await await _auditoriumsRepository.Delete(auditorium.Id); } TheatreDomainModel theatreModel = new TheatreDomainModel { Id = theatre.Id, Name = theatre.Name, AddressId = theatre.AddressId, AuditoriumsList = theatre.Auditoriums.Select(x => new AuditoriumDomainModel { Id = x.Id, TheatreId = x.TheatreId, Name = x.Name, SeatsList = x.Seats.Select(x => new SeatDomainModel { Id = x.Id, AuditoriumId = x.AuditoriumId, Number = x.Number, Row = x.Row }) .ToList() }) .ToList() }; //dodat await await _theatreRepository.Delete(theatre.Id); _theatreRepository.Save(); return(theatreModel); }
public async Task <ReservationResultModel> CreateReservation(ReservationDomainModel requestedReservation) { // get taken seats for show var takenSeats = await GetTakenSeats(requestedReservation.ShowId); var seats = await _seatRepository.GetAllAsync(); // check if show id is valid var show = await _showRepository.GetByIdAsync(requestedReservation.ShowId); if (show == null) { return(new ReservationResultModel { isSuccessful = false, ErrorMessage = Messages.SHOW_DOES_NOT_EXIST_FOR_RESERVATION }); } // check if user id is valid var user = await _userRepository.GetByIdAsync(requestedReservation.UserId); if (user == null) { return(new ReservationResultModel { isSuccessful = false, ErrorMessage = Messages.USER_FOR_RESERVATION_DOES_NOT_EXIST }); } // get all seats for auditorium seats = seats.Where(seat => seat.AuditoriumId == show.AuditoriumId); //check if requested seats exist in the auditorium var duplicateSeats = seats .Select(x => x.Id) .Intersect(requestedReservation.SeatsList .Select(x => x.Id)); if (duplicateSeats.Count() != requestedReservation.SeatsList.Count()) { return(new ReservationResultModel { isSuccessful = false, ErrorMessage = Messages.SEAT_DOES_NOT_EXIST_FOR_AUDITORIUM }); } // check if requested seats are more than 1 and in the same row List <SeatDomainModel> seatModels = new List <SeatDomainModel>(); foreach (var seat in requestedReservation.SeatsList) { var reqSeat = await _seatRepository.GetByIdAsync(seat.Id); SeatDomainModel seatDomain = new SeatDomainModel { Id = reqSeat.Id, Number = reqSeat.Number, Row = reqSeat.Row, AuditoriumId = reqSeat.AuditoriumId }; seatModels.Add(seatDomain); } // check if seats are duplicates var row = seatModels[0].Number; var differentRows = seatModels.Select(x => x.Number).Distinct(); if (differentRows.Count() < seatModels.Count) { return(new ReservationResultModel { isSuccessful = false, ErrorMessage = Messages.SEATS_CANNOT_BE_DUPLICATES }); } // check if seats are in the same row if (requestedReservation.SeatsList.Count() > 1) { var singleSeat = seatModels[0]; foreach (var x in seatModels) { if (singleSeat.Row != x.Row) { return(new ReservationResultModel { isSuccessful = false, ErrorMessage = Messages.SEATS_NOT_IN_THE_SAME_ROW }); } } } // check if seats are next to each other if (requestedReservation.SeatsList.Count() > 1) { seatModels = seatModels.OrderByDescending(x => x.Number).ToList(); var singleSeat2 = seatModels[0]; var counter = 1; foreach (var x in seatModels.Skip(1)) { if (x.Number + counter != singleSeat2.Number) { return(new ReservationResultModel { isSuccessful = false, ErrorMessage = Messages.SEATS_MUST_BE_NEXT_TO_EACH_OTHER }); } else { counter++; } } } // check if requested seats are already taken if (takenSeats != null) { foreach (var takenSeat in takenSeats) { foreach (var requestedSeat in requestedReservation.SeatsList) { if (takenSeat.Id == requestedSeat.Id) { return(new ReservationResultModel { isSuccessful = false, ErrorMessage = Messages.SEATS_ALREADY_TAKEN_ERROR }); } } } } // insert in database Reservation reservationToInsert = new Reservation { ShowId = requestedReservation.ShowId, UserId = requestedReservation.UserId, ReservationSeats = new List <ReservationSeat>() }; var insertedReservation = _reservationsRepository.Insert(reservationToInsert); foreach (var rs in requestedReservation.SeatsList) { reservationToInsert.ReservationSeats.Add(new ReservationSeat { SeatId = rs.Id, ReservationId = insertedReservation.Id }); } _reservationsRepository.Save(); return(new ReservationResultModel { isSuccessful = true, ReservationDomainModel = new ReservationDomainModel { Id = insertedReservation.Id, ShowId = insertedReservation.ShowId, UserId = insertedReservation.UserId } }); }