Пример #1
0
        public void MakeReservation_Reservation_Not_Created_Return_BadRequest()
        {
            //Arrange
            int expectedStatusCode = 400;

            CreateReservationModel createReservationModel = new CreateReservationModel
            {
                UserId       = Guid.NewGuid(),
                ProjectionId = Guid.NewGuid(),
                SeatIds      = new List <SeatDomainModel>()
            };

            ReservationResultModel reservationResultModel = new ReservationResultModel
            {
                ErrorMessage = null,
                IsSuccessful = false
            };


            _reservationService = new Mock <IReservationService>();
            _reservationService.Setup(x => x
                                      .CreateReservation(It.IsAny <CreateReservationModel>())).Returns(reservationResultModel);

            ReservationsController reservationsController = new ReservationsController(_reservationService.Object);

            //Act
            var result        = reservationsController.MakeReservation(createReservationModel).Result;
            var createdResult = ((BadRequestObjectResult)result).Value;
            var reservationResultDomainModel = (ErrorResponseModel)createdResult;

            //Assert
            Assert.IsNotNull(createdResult);
            Assert.IsInstanceOfType(result, typeof(BadRequestObjectResult));
            Assert.AreEqual(expectedStatusCode, ((BadRequestObjectResult)result).StatusCode);
        }
        public void CreateNormalReservation(CreateReservationModel model, int memberID)
        {
            if (model.PotentialReservations.Count > 4)
            {
                throw new Exception("Members should not be more than 4");
            }

            var teeTimeRepo = new TeeTimeRepository(new BAISTGolfCourseDbContext());

            var teeTime = teeTimeRepo.GetWithReservationsById(model.TeeTimeID);

            foreach (var member in model.PotentialReservations)
            {
                var reservation = new Reservations
                {
                    DateCreated = DateTime.Now,
                    TeeTimeID   = model.TeeTimeID,
                    MemberID    = member.MemberID,
                    Status      = member.Status,
                    IsApproved  = false,
                    Type        = Enums.ReservationType.Normal
                };

                teeTime.Reservations.Add(reservation);
            }

            var reservationCount = teeTime.Reservations.Count;

            if (reservationCount == 4)
            {
                teeTime.Status = Enums.TeeTimeStatus.Closed;
            }

            teeTimeRepo.SaveChanges();
        }
        public ActionResult <ReservationResultModel> MakeReservation([FromBody] CreateReservationModel model)
        {
            ReservationResultModel res;

            try
            {
                res = _reservationService.CreateReservation(model);
            }
            catch (DbUpdateException e)
            {
                ErrorResponseModel errorResponse = new ErrorResponseModel
                {
                    ErrorMessage = e.InnerException.Message ?? e.Message,
                    StatusCode   = System.Net.HttpStatusCode.BadRequest
                };

                return(BadRequest(errorResponse));
            }

            if (!res.IsSuccessful)
            {
                ErrorResponseModel errorResponse = new ErrorResponseModel
                {
                    ErrorMessage = res.ErrorMessage,
                    StatusCode   = System.Net.HttpStatusCode.BadRequest
                };

                return(BadRequest(errorResponse));
            }

            return(Created("reservations//" + res.Reservation.Id, res));
        }
 public void AddCurrentUserToReservation(CreateReservationModel model, int memberID)
 {
     model.PotentialReservations.Add(new ReservationCreateModel
     {
         MemberID = memberID, Status = ReservationStatus.Accepted
     });
 }
        public void CreateStandingReservation(CreateReservationModel model, int memberID)
        {
            var teeTimeRepo = new TeeTimeRepository(new BAISTGolfCourseDbContext());

            var teeTime = teeTimeRepo.GetWithReservationsById(model.TeeTimeID);

            foreach (var member in model.PotentialReservations)
            {
                var reservation = new Reservations
                {
                    DateCreated = DateTime.Now,
                    TeeTimeID   = model.TeeTimeID,
                    MemberID    = member.MemberID,
                    Status      = member.Status,
                    IsApproved  = false,
                    Type        = Enums.ReservationType.Standing
                };

                teeTime.Reservations.Add(reservation);
            }

            teeTime.Status = Enums.TeeTimeStatus.Closed;

            teeTimeRepo.SaveChanges();
        }
        public async Task <ActionResult <ReservationModel> > PostClientReservation(CreateReservationModel newReservation)
        {
            var reservation = await _reservationService.CreateClientReservation(newReservation);

            var mappedReservation = _mapper.Map <ReservationModel>(reservation);

            return(Ok(mappedReservation));
        }
Пример #7
0
        public async Task <IActionResult> Create(CreateReservationModel reservation)
        {
            var dbObject = await _reservationService.Create(_mapper.Map <CreateReservationModel, Reservation>(reservation));

            if (dbObject == null)
            {
                return(BadRequest());
            }
            return(Created("Created", _mapper.Map <Reservation, SuccessfulReservationModel>(dbObject)));
        }
Пример #8
0
        public IActionResult Create(CreateReservationModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var userId = HttpContext.GetUserId();
            var result = _reservationService.Create(userId, model.SessionId);

            return(Ok(result));
        }
Пример #9
0
        public ReservationModel MakeReservation(int projectionId, CreateReservationModel model)
        {
            return(this.ExecuteOperationHandleExceptions(() =>
            {
                this.ValidateEmail(model.Email);

                var context = new CinemaReserveDbContext();
                var theProjection = context.Projections.FirstOrDefault(pr => pr.Id == projectionId);
                if (theProjection == null)
                {
                    throw new ArgumentNullException("projection is either non-existant or is not available");
                }

                var reservedSeatStatus = context.SeatStatus.FirstOrDefault(st => st.Status == "reserved") ?? new SeatStatus()
                {
                    Status = "reserved"
                };

                List <Seat> reservedSeats = new List <Seat>();

                using (TransactionScope tran = new TransactionScope())
                {
                    foreach (var seat in model.Seats)
                    {
                        var dbSeat = theProjection.Seats.FirstOrDefault(s => s.Row == seat.Row && s.Column == seat.Column);
                        if (dbSeat == null || dbSeat.Status.Status == "reserved")
                        {
                            throw new InvalidOperationException("Seat is not available");
                        }
                        dbSeat.Status = reservedSeatStatus;
                        reservedSeats.Add(dbSeat);
                    }
                    tran.Complete();
                }

                var reservation = new Reservation()
                {
                    ReservedSeats = reservedSeats,
                    UserEmail = model.Email.ToLower(),
                    UserCode = this.GenerateUserCode()
                };


                //context.Reservations.Add(reservation);
                theProjection.Reservations.Add(reservation);
                context.SaveChanges();

                var reservationModel = Parser.ToReservationModel(reservation);

                return reservationModel;
            }));
        }
Пример #10
0
        internal static string ReserveCall(object seats, string email, int projectionID)
        {
            ValidateEmail(email);

            var seatsCast = seats as IEnumerable <SeatModel>;
            CreateReservationModel model = new CreateReservationModel()
            {
                Seats = seatsCast,
                Email = email,
            };

            ReservationModel code = HttpRequester.Post <ReservationModel>(BaseServicesUrl + "projections/" + projectionID, model);

            return(code.UserCode);
        }
        public void ReservationService_CreateReservation_ReturnsErrorMessage_ProjectionNotExist()
        {
            //Arrange
            List <SeatResultModel> seatResultList = new List <SeatResultModel>();
            List <Seat>            seats          = new List <Seat>();
            Seat s1 = new Seat
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 1,
                Row          = 1
            };
            Seat s2 = new Seat
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 2,
                Row          = 1
            };

            seats.Add(s1);
            seats.Add(s2);
            CreateReservationModel reservation = new CreateReservationModel()
            {
                ProjectionId = Guid.NewGuid(),
                UserId       = Guid.NewGuid(),
                SeatIds      = seats.Select(s => new SeatDomainModel
                {
                    Id           = s.Id,
                    AuditoriumId = s.AuditoriumId,
                    Number       = s.Number,
                    Row          = s.Row
                })
            };

            _mockReservationService.Setup(x => x.GetTakenSeats(It.IsAny <Guid>())).Returns(seatResultList);
            _mockSeatRepository.Setup(x => x.GetAll()).ReturnsAsync(seats);
            _mockProjectionRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>())).ReturnsAsync(null as Projection);

            //Act
            var resultAction = _reservationService.CreateReservation(reservation);

            //Assert
            Assert.IsNotNull(resultAction);
            Assert.IsFalse(resultAction.IsSuccessful);
            Assert.AreEqual(Messages.PROJECTION_DOES_NOT_EXIST, resultAction.ErrorMessage);
            Assert.IsInstanceOfType(resultAction, typeof(ReservationResultModel));
        }
        public ActionResult Create(int id, int numberOfPersons, DateTime date)
        {
            var rest        = _reservationService.GetRestaurant(id);
            var createModel = new CreateReservationModel();

            createModel.TimeSlot       = date;
            createModel.RestaurantId   = rest.Id;
            createModel.RestaurantName = rest.Name;
            createModel.Email          = "";
            createModel.AvailableTimes = _reservationService.GetAvailableTimes(rest.Id, numberOfPersons, date);
            createModel.TimeSelectList = new SelectList(createModel.AvailableTimes.Where(x => x.FreeSeats), "Hour", "Hour");
            createModel.PersonCount    = numberOfPersons;
            createModel.Date           = date;
            createModel.Name           = "";
            return(View(createModel));
        }
        public ActionResult Create(CreateReservationModel inputModel)
        {
            if (ModelState.IsValid)
            {
                var member = _memberService.GetMemberByEmail(User.Identity.Name);

                _reservationService.CreateNormalReservation(inputModel, member.ID);

                return(RedirectToAction("Index"));
            }
            else
            {
                ModelState.AddModelError("", "unable to save cha. Try again, if the problem persists email system administrator");
            }
            return(View(inputModel));
        }
Пример #14
0
        public void MakeReservation_Throw_DbUpdateException()
        {
            //Arrange
            int    expectedStatusCode = 400;
            string expectedMessage    = "Inner exception error message.";

            CreateReservationModel createReservationModel = new CreateReservationModel
            {
                UserId       = Guid.NewGuid(),
                ProjectionId = Guid.NewGuid(),
                SeatIds      = new List <SeatDomainModel>()
            };

            ReservationResultModel reservationResultModel = new ReservationResultModel
            {
                Reservation = new ReservationDomainModel
                {
                    Id           = Guid.NewGuid(),
                    ProjectionId = Guid.NewGuid(),
                    UserId       = createReservationModel.UserId
                },
                ErrorMessage = null,
                IsSuccessful = true
            };


            Exception         exception         = new Exception("Inner exception error message.");
            DbUpdateException dbUpdateException = new DbUpdateException("Error.", exception);


            _reservationService = new Mock <IReservationService>();
            _reservationService.Setup(x => x
                                      .CreateReservation(It.IsAny <CreateReservationModel>())).Throws(dbUpdateException);

            ReservationsController reservationsController = new ReservationsController(_reservationService.Object);

            //Act
            var result = reservationsController.MakeReservation(createReservationModel).Result;
            var badRequestResultValue = ((BadRequestObjectResult)result).Value;
            var errorResponse         = (ErrorResponseModel)badRequestResultValue;

            //Assert
            Assert.IsNotNull(badRequestResultValue);
            Assert.AreEqual(expectedMessage, errorResponse.ErrorMessage);
            Assert.IsInstanceOfType(result, typeof(BadRequestObjectResult));
            Assert.AreEqual(expectedStatusCode, ((BadRequestObjectResult)result).StatusCode);
        }
Пример #15
0
        public void TestInitialize()
        {
            _reservationDomainModel = new ReservationDomainModel
            {
                ProjectionId = Guid.NewGuid(),
                SeatId       = Guid.NewGuid(),
                UserId       = Guid.NewGuid()
            };

            _reservationResultModel = new CreateReservationResultModel
            {
                ErrorMessage = null,
                IsSuccessful = true,
                Reservation  = _reservationDomainModel
            };

            _failedReservationResultModel = new CreateReservationResultModel
            {
                ErrorMessage = "Error",
                IsSuccessful = false,
                Reservation  = null
            };

            _createReservationModel = new CreateReservationModel
            {
                ProjectionId = _reservationDomainModel.ProjectionId,
                SeatIds      = new List <Guid>
                {
                    _reservationDomainModel.SeatId
                },
                UserId = _reservationDomainModel.UserId
            };

            List <ReservationDomainModel> reservationList = new List <ReservationDomainModel>();

            reservationList.Add(_reservationDomainModel);
            IEnumerable <ReservationDomainModel>         reservations = reservationList;
            Task <IEnumerable <ReservationDomainModel> > responseTask = Task.FromResult(reservations);

            _mockReservationService = new Mock <IReservationService>();
            _mockUserService        = new Mock <IUserService>();
            _mockProjectionService  = new Mock <IProjectionService>();
        }
Пример #16
0
        public void MakeReservation_ReservationCreatedSuccesful_ReturnCreated()
        {
            //Arrange
            int expectedStatusCode = 201;

            CreateReservationModel createReservationModel = new CreateReservationModel
            {
                UserId       = Guid.NewGuid(),
                ProjectionId = Guid.NewGuid(),
                SeatIds      = new List <SeatDomainModel>()
            };

            ReservationResultModel reservationResultModel = new ReservationResultModel
            {
                Reservation = new ReservationDomainModel
                {
                    Id           = Guid.NewGuid(),
                    ProjectionId = Guid.NewGuid(),
                    UserId       = createReservationModel.UserId
                },
                ErrorMessage = null,
                IsSuccessful = true
            };


            _reservationService = new Mock <IReservationService>();
            _reservationService.Setup(x => x
                                      .CreateReservation(It.IsAny <CreateReservationModel>())).Returns(reservationResultModel);

            ReservationsController reservationsController = new ReservationsController(_reservationService.Object);

            //Act
            var result        = reservationsController.MakeReservation(createReservationModel).Result;
            var createdResult = ((CreatedResult)result).Value;
            var reservationResultDomainModel = (ReservationResultModel)createdResult;

            //Assert
            Assert.IsNotNull(createdResult);
            Assert.AreEqual(createReservationModel.UserId, reservationResultDomainModel.Reservation.UserId);
            Assert.IsInstanceOfType(result, typeof(CreatedResult));
            Assert.AreEqual(expectedStatusCode, ((CreatedResult)result).StatusCode);
        }
        public ActionResult Create(CreateReservationModel model)
        {
            if (ModelState.IsValid)
            {
                Reservation r = new Reservation();
                r.Name        = model.Name;
                r.Email       = model.Email;
                r.Telephone   = model.Telephone;
                r.PersonCount = model.PersonCount;
                r.Restaurant  = _reservationService.GetRestaurant(model.RestaurantId);
                r.TimeSlot    = model.Date.AddHours(model.Time);

                int reservationId = _reservationService.SaveReservation(r).Id;



                return(RedirectToAction("Details", "Reservation", new { id = reservationId }));
            }
            return(View(model));
        }
Пример #18
0
        public async Task <Reservation> CreateClientReservation(CreateReservationModel newReservation)
        {
            var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);

            var reservation = new Reservation()
            {
                UserId    = int.Parse(userId),
                CarId     = newReservation.CarId,
                StartDate = newReservation.StartDate,
                EndDate   = newReservation.EndDate
            };

            if (!await IsReservationIntervalValid(reservation))
            {
                throw new InvalidInputException("Date interval is not valid!");
            }

            _reservationRepository.Add(reservation);
            await _reservationRepository.SaveAll();

            return(reservation);
        }
Пример #19
0
        public async Task <Data.Entities.Reservation> AddReservationAsync(CreateReservationModel reservationModel)
        {
            var reservation = _mapper.Map <Data.Entities.Reservation>(reservationModel);

            return(await AddAsync(reservation));
        }
Пример #20
0
 public virtual async Task <IEnumerable <ReservationItem> > CreateOneReservation(CreateReservationModel item)
 {
     return(await _reservationService.CreateAsync(item));
 }
        public void ReservationService_CreateReservation_ReturnsErrorMessage_SeatNotExist()
        {
            //Arrange
            List <SeatDomainModel> seatDomainModels = new List <SeatDomainModel>();
            SeatDomainModel        seat1            = new SeatDomainModel
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 2,
                Row          = 1
            };
            SeatDomainModel seat2 = new SeatDomainModel
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 3,
                Row          = 1
            };

            seatDomainModels.Add(seat1);
            seatDomainModels.Add(seat2);
            List <SeatResultModel> seatsTaken = new List <SeatResultModel>();
            Seat s1 = new Seat
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 4,
                Row          = 1
            };
            Seat s2 = new Seat
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 5,
                Row          = 1
            };
            List <Seat> seats = new List <Seat>();

            seats.Add(s1);
            seats.Add(s2);
            CreateReservationModel createReservationModel = new CreateReservationModel()
            {
                ProjectionId = Guid.NewGuid(),
                UserId       = Guid.NewGuid(),
                SeatIds      = new List <SeatDomainModel>()
            };
            Projection projection = new Projection
            {
                Id           = createReservationModel.ProjectionId,
                AuditoriumId = 1,
                MovieId      = Guid.NewGuid(),
                DateTime     = DateTime.Now.AddDays(1)
            };

            createReservationModel.SeatIds = seatDomainModels;
            _mockReservationService.Setup(x => x.GetTakenSeats(createReservationModel.ProjectionId)).Returns(seatsTaken);
            _mockSeatRepository.Setup(x => x.GetAll()).ReturnsAsync(seats);
            _mockProjectionRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>())).ReturnsAsync(projection);

            //Act
            var resultAction = _reservationService.CreateReservation(createReservationModel);

            //Assert
            Assert.IsNotNull(resultAction);
            Assert.AreEqual(Messages.SEAT_SEATS_NOT_EXIST_FOR_AUDITORIUM, resultAction.ErrorMessage);
            Assert.IsNull(resultAction.Reservation);
            Assert.IsFalse(resultAction.IsSuccessful);
            Assert.IsInstanceOfType(resultAction, typeof(ReservationResultModel));
        }
        public void ReservationService_CreateReservation_ReturnsCreatedReservation()
        {
            //Arrange

            Projection projection = new Projection
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                DateTime     = DateTime.Now.AddHours(5),
                MovieId      = Guid.NewGuid()
            };
            SeatResultModel srm1 = new SeatResultModel
            {
                ErrorMessage    = null,
                IsSuccessful    = true,
                SeatDomainModel = new SeatDomainModel
                {
                    Id           = Guid.NewGuid(),
                    AuditoriumId = 1,
                    Number       = 1,
                    Row          = 1
                }
            };
            SeatResultModel srm2 = new SeatResultModel
            {
                ErrorMessage    = null,
                IsSuccessful    = true,
                SeatDomainModel = new SeatDomainModel
                {
                    Id           = Guid.NewGuid(),
                    AuditoriumId = 1,
                    Number       = 2,
                    Row          = 1
                }
            };
            List <SeatResultModel> seatResults = new List <SeatResultModel>();

            Seat s1 = new Seat
            {
                Id           = srm1.SeatDomainModel.Id,
                AuditoriumId = srm1.SeatDomainModel.AuditoriumId,
                Number       = srm1.SeatDomainModel.Number,
                Row          = srm1.SeatDomainModel.Row
            };
            Seat s2 = new Seat
            {
                Id           = srm2.SeatDomainModel.Id,
                AuditoriumId = srm2.SeatDomainModel.AuditoriumId,
                Number       = srm2.SeatDomainModel.Number,
                Row          = srm2.SeatDomainModel.Row
            };
            List <Seat> seats = new List <Seat>();

            seats.Add(s1);
            seats.Add(s2);
            CreateReservationModel reservation = new CreateReservationModel
            {
                ProjectionId = projection.Id,
                UserId       = Guid.NewGuid(),
                SeatIds      = seats.Select(s => new SeatDomainModel
                {
                    Id           = s.Id,
                    AuditoriumId = s.AuditoriumId,
                    Number       = s.Number,
                    Row          = s.Row
                })
            };
            //TO BE CONTINUED.

            Reservation reservation2 = new Reservation
            {
                Id               = Guid.NewGuid(),
                ProjectionId     = reservation.ProjectionId,
                UserId           = reservation.UserId,
                ReservationSeats = new List <ReservationSeat>()
            };
            ReservationSeat rs1 = new ReservationSeat
            {
                SeatId        = s1.Id,
                Seat          = s1,
                ReservationId = Guid.NewGuid(),
                Reservation   = reservation2
            };

            reservation2.ReservationSeats.Add(rs1);

            _mockReservationService.Setup(x => x.GetTakenSeats(It.IsAny <Guid>())).Returns(seatResults);
            _mockSeatRepository.Setup(x => x.GetAll()).ReturnsAsync(seats);
            _mockProjectionRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>())).ReturnsAsync(projection);
            _mockSeatRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>())).ReturnsAsync(s1);
            _mockReservationRepository.Setup(x => x.Insert(It.IsAny <Reservation>())).Returns(reservation2);

            //Assert
            var resultAction = _reservationService.CreateReservation(reservation);

            //Act
            Assert.IsNotNull(resultAction);
        }
Пример #23
0
        public async Task <ActionResult <ReservationDomainModel> > PostAsync([FromBody] CreateReservationModel reservationModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }
            //PaymentResponse
            List <ReservationDomainModel> reservationResultList = new List <ReservationDomainModel>();
            int bonusPointsToAdd = 0;

            foreach (Guid seatId in reservationModel.SeatIds)
            {
                bonusPointsToAdd++;
                ReservationDomainModel domainModel = new ReservationDomainModel
                {
                    ProjectionId = reservationModel.ProjectionId,
                    SeatId       = seatId,
                    UserId       = reservationModel.UserId
                };

                CreateReservationResultModel createReservationResultModel;
                try
                {
                    createReservationResultModel = await _reservationService.AddReservation(domainModel);
                }
                catch (DbUpdateException e)
                {
                    ErrorResponseModel errorResponse = new ErrorResponseModel
                    {
                        ErrorMessage = e.InnerException.Message ?? e.Message,
                        StatusCode   = System.Net.HttpStatusCode.BadRequest
                    };

                    return(BadRequest(errorResponse));
                }

                if (!createReservationResultModel.IsSuccessful)
                {
                    ErrorResponseModel errorResponse = new ErrorResponseModel
                    {
                        ErrorMessage = createReservationResultModel.ErrorMessage,
                        StatusCode   = System.Net.HttpStatusCode.BadRequest
                    };

                    return(BadRequest(errorResponse));
                }
                reservationResultList.Add(createReservationResultModel.Reservation);
            }
            try
            {
                var bonusPointsResult = _userService.AddBonusPointsByUserId(reservationModel.UserId, bonusPointsToAdd);

                if (bonusPointsResult == -1 || bonusPointsToAdd < 0)
                {
                    ErrorResponseModel errorResponse = new ErrorResponseModel
                    {
                        ErrorMessage = Messages.USER_BONUSPOINTS_ERROR,
                        StatusCode   = System.Net.HttpStatusCode.BadRequest
                    };

                    return(BadRequest(errorResponse));
                }
            }
            catch (DbUpdateException e)
            {
                ErrorResponseModel errorResponse = new ErrorResponseModel
                {
                    ErrorMessage = Messages.USER_BONUSPOINTS_ERROR,
                    StatusCode   = System.Net.HttpStatusCode.BadRequest
                };

                return(BadRequest(errorResponse));
            }
            return(Created("reservations//", reservationResultList));
        }
Пример #24
0
        public ReservationResultModel CreateReservation(CreateReservationModel reservation)
        {
            //get all taken seats for projection
            var takenSeats = GetTakenSeats(reservation.ProjectionId);

            var seats = _seatRepository.GetAll().Result;
            var projection = _projectionRepository.GetByIdAsync(reservation.ProjectionId).Result;

            if(projection == null)
            {
                return new ReservationResultModel
                {
                    IsSuccessful = false,
                    ErrorMessage = Messages.PROJECTION_DOES_NOT_EXIST
                };
            }

            //get all seats for auditorium
            seats = seats.Where(auditorium => auditorium.AuditoriumId == projection.AuditoriumId);

            //check if the requested seats exist in the auditorium
            var commonSeats = seats.Select(x => x.Id).Intersect(reservation.SeatIds.Select(s => s.Id));
            if(commonSeats.Count() != reservation.SeatIds.Count())
            {
                return new ReservationResultModel
                {
                    IsSuccessful = false,
                    ErrorMessage = Messages.SEAT_SEATS_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 reservation.SeatIds)
            {
                var reqSeat = _seatRepository.GetByIdAsync(seat.Id).Result;
                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 differentRow = seatModels.Select(x => x.Number).Distinct();
            if(differentRow.Count() < seatModels.Count)
            {
                return new ReservationResultModel
                {
                    IsSuccessful = false,
                    ErrorMessage = Messages.SEAT_SEATS_CANNOT_BE_DUPLICATES
                };
            }

            if (reservation.SeatIds.ToList().Count() > 1)
            {
                var singleSeat = seatModels[0];
        
                foreach (var x in seatModels)
                {
                    if(singleSeat.Row != x.Row)
                    {
                        return new ReservationResultModel
                        {
                            IsSuccessful = false,
                            ErrorMessage = Messages.SEAT_SEATS_NOT_IN_SAME_ROW
                        };
                    }
                }
            }

            //check if seats are not next to each other
            if(reservation.SeatIds.Count() > 1)
            {
                seatModels = seatModels.OrderByDescending(x => x.Number).ToList();

                var singleSeat2 = seatModels[0];

                var counter = 1;
                foreach (var y in seatModels.Skip(1))
                {
                    if (y.Number + counter != singleSeat2.Number)
                    {
                        return new ReservationResultModel
                        {
                            IsSuccessful = false,
                            ErrorMessage = Messages.SEAT_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 reservation.SeatIds)
                    {
                        if (takenSeat.SeatDomainModel.Id == requestedSeat.Id)
                        {
                            return new ReservationResultModel
                            {
                                IsSuccessful = false,
                                ErrorMessage = Messages.SEAT_SEATS_ALREADY_TAKEN_ERROR
                            };
                        }
                    }
                }
            }


            #region Komentar
            /*  var auditorium = _auditoriumRepository.GetByIdAsync(projection.AuditoriumId).Result;


              List<(int, int)> requestedSeatsRowsAndNumbers =
                  reservation.SeatsRequested
                  .Select(s =>
                  {
                  var seat = _seatRepository.GetByIdAsync(s.Id).Result;

                  return (seat.Row, seat.Number);
                   }).ToList();


              int rowMax = auditorium.Seats.Max(s => s.Row);
              int numberMax = auditorium.Seats.Max(s => s.Number);


              List<(int row, int number)> listOfAllSeats = new List<(int, int)>();
              for (int i = 1; i <= rowMax; i++)
              {
                  for (int j = 1; j <= numberMax; j++)
                  {
                      listOfAllSeats.Add((i, j));
                  }
              }


              List<(int row, int number)> listTakenSeats = takenSeats
                  .Select(s => (s.SeatDomainModel.Row, s.SeatDomainModel.Number))
                  .ToList();


              List<(int row, int number)> listFreeSeats = listOfAllSeats
                  .Except(listTakenSeats)
                  .ToList();
  */
            //CHECK IF listFreeSeats CONTAINS AT LEAST 1 REQUESTED
            //ROW WHICH HAS EQUAL OR MORE FREE CONTINIOUS SEATS
            //COMPARED TO NUMBER OF REQUESTED SEATS. IF SO, THROW ERROR
            //BECAUSE CLIENT COULD RESERVE ALL SEATS IN THE SAME ROW.
            // IF NOT, ALLOW CLIENT SEPARATE RESERVATIONS.



            //LASTLY, CHECK IF SEATS ARE NEXT TO EACH OTHER.
            //IF THEY ARE, PROCEED. IF NOT, CHECK IF ROW
            // CONTAINS ENOUGH CONTINIOUS SEATS. IF IT DOES, 
            // THROW ERROR BECAUSE CLIENT COULD RESERVE PROPERLY.
            // IF NOT, ALLOW SEPARATE RESERVATIONS IN SAME ROW.
            #endregion

            //improvised fake payment system
            #region Payment
            /*  Levi9PaymentService payment = new Levi9PaymentService();
              var paymentResult = payment.MakePayment().Result;

              if(paymentResult.IsSuccess == false)
              {
                  return new ReservationResultModel
                  {
                      IsSuccessful = false,
                      ErrorMessage = Messages.PAYMENT_CREATION_ERROR
                  };
              }*/
            //end of payment system
            #endregion

            //create reservation for inserting
            Reservation reservationToAdd = new Reservation
            {
                Id = Guid.NewGuid(),
                ProjectionId = reservation.ProjectionId,
                UserId = reservation.UserId
            };

            
            int countOfSeats = reservation.SeatIds.Count();
            var numOfPoints = countOfSeats * 1;

            _userRepository.AddPointsForUser(reservation.UserId, numOfPoints);




            var insertedReservation = _reservationsRepository.Insert(reservationToAdd);

            foreach(var rs in reservation.SeatIds)
            {
                reservationToAdd.ReservationSeats.Add(new ReservationSeat
                {
                    SeatId = rs.Id,
                    ReservationId = insertedReservation.Id
                });
            }

            _reservationsRepository.Save();

            return new ReservationResultModel
            {
                IsSuccessful = true,
                Reservation = new ReservationDomainModel
                {
                    Id = insertedReservation.Id,
                    ProjectionId = insertedReservation.ProjectionId,
                    UserId = insertedReservation.UserId
                }
            };
        }
        public void ReservationService_CreateReservation_ReturnsErrorMessage_SeatNotInTheSameRow()
        {
            //Arrange
            List <SeatDomainModel> seatsRequested = new List <SeatDomainModel>();
            SeatDomainModel        seat1          = new SeatDomainModel
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 2,
                Row          = 1
            };
            SeatDomainModel seat2 = new SeatDomainModel
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 3,
                Row          = 1
            };
            SeatDomainModel seat3 = new SeatDomainModel
            {
                Id           = Guid.NewGuid(),
                AuditoriumId = 1,
                Number       = 2,
                Row          = 2
            };

            seatsRequested.Add(seat1);
            seatsRequested.Add(seat2);
            seatsRequested.Add(seat3);
            List <SeatResultModel> seatsTaken = new List <SeatResultModel>();
            Seat s1 = new Seat
            {
                Id           = seat1.Id,
                AuditoriumId = seat1.AuditoriumId,
                Number       = seat1.Number,
                Row          = seat1.Row
            };
            Seat s2 = new Seat
            {
                Id           = seat2.Id,
                AuditoriumId = seat2.AuditoriumId,
                Number       = seat2.Number,
                Row          = seat2.Row
            };
            Seat s3 = new Seat
            {
                Id           = seat3.Id,
                AuditoriumId = seat3.AuditoriumId,
                Number       = seat3.Number,
                Row          = seat3.Row
            };
            List <Seat> seatsInAuditorium = new List <Seat>();

            seatsInAuditorium.Add(s1);
            seatsInAuditorium.Add(s2);
            seatsInAuditorium.Add(s3);
            CreateReservationModel createReservationModel = new CreateReservationModel()
            {
                ProjectionId = Guid.NewGuid(),
                UserId       = Guid.NewGuid(),
                SeatIds      = new List <SeatDomainModel>()
            };
            Projection projection = new Projection
            {
                Id           = createReservationModel.ProjectionId,
                AuditoriumId = 1,
                MovieId      = Guid.NewGuid(),
                DateTime     = DateTime.Now.AddDays(1)
            };

            createReservationModel.SeatIds = seatsRequested;
            _mockReservationService.Setup(x => x.GetTakenSeats(createReservationModel.ProjectionId)).Returns(seatsTaken);
            _mockSeatRepository.Setup(x => x.GetAll()).ReturnsAsync(seatsInAuditorium);
            _mockProjectionRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>())).ReturnsAsync(projection);
            _mockSeatRepository.Setup(x => x.GetByIdAsync(It.IsAny <Guid>())).ReturnsAsync(s1);

            //Act
            var resultAction = _reservationService.CreateReservation(createReservationModel);

            //Assert
            Assert.IsNotNull(resultAction);
            Assert.AreEqual(Messages.SEAT_SEATS_CANNOT_BE_DUPLICATES, resultAction.ErrorMessage);
            Assert.IsFalse(resultAction.IsSuccessful);
            Assert.IsNull(resultAction.Reservation);
            Assert.IsInstanceOfType(resultAction, typeof(ReservationResultModel));
        }
Пример #26
0
        public async Task <IEnumerable <ReservationItem> > CreateAsync(CreateReservationModel item)
        {
            var reservation = _mapper.Map <ReservationItem>(item);

            return(await _reservationDataService.CreateAsync(reservation));
        }
Пример #27
0
 public async Task <ReservationModel> Post([FromBody] CreateReservationModel reservationModel)
 {
     return(_mapper.Map <ReservationModel>(await _reservationService.AddReservationAsync(reservationModel)));
 }