示例#1
0
        public async Task <IActionResult> Add(AddReservationDTO reservationDTO)
        {
            var reservation = _mapper.Map <Reservation>(reservationDTO);

            reservation.UserId = GetUserId();

            var rese = await _reservationService.AddReservation(reservation);

            return(Ok(rese));
        }
示例#2
0
        public async Task <IActionResult> Add([FromBody] AddReservationDTO addedReservation)
        {
            // check if requester is trying to add a reservation for someone else
            if (HttpContext.GetUserIdFromToken() != addedReservation.UserId)
            {
                return(Forbid());
            }

            // check if requester has reached the maximum number of reservations
            if (await _permissionService.MaxDailyReservationsReached(addedReservation.UserId, addedReservation.MarketId, addedReservation.SellerId, addedReservation.Pickup))
            {
                return(Forbid());
            }

            return(Ok(await _reservationService.AddReservation(await HttpContext.GetTokenAsync("access_token"), addedReservation)));
        }
示例#3
0
        public async Task <ServiceResponse <GetReservationDTO> > AddReservation(string userToken, AddReservationDTO newReservation)
        {
            ServiceResponse <GetReservationDTO> serviceResponse = new ServiceResponse <GetReservationDTO>();

            try
            {
                var user = await _context.Users.FindAsync(newReservation.UserId);

                if (user == null)
                {
                    var userInformation = await _auth0Service.GetUserInfo(userToken);

                    // check if user is verified
                    if (userInformation.ContainsKey("email_verified") && !Convert.ToBoolean(userInformation["email_verified"].ToString()))
                    {
                        serviceResponse.Success = false;
                        serviceResponse.Message = $"User email is not verified.";
                        return(serviceResponse);
                    }

                    // check if data from auth0 are valid
                    if (!userInformation.ContainsKey("sub") || !userInformation.ContainsKey("name") || !userInformation.ContainsKey("email"))
                    {
                        serviceResponse.Success = false;
                        serviceResponse.Message = $"Could not get all needed user information from auth0.";
                        return(serviceResponse);
                    }

                    user           = new User();
                    user.Id        = userInformation["sub"].ToString();
                    user.Name      = userInformation["name"].ToString();
                    user.Mail      = userInformation["email"].ToString();
                    user.CreatedAt = DateTime.Now.ToUniversalTime();

                    // user is added to context, but NOT saved to db at this point
                    await _context.Users.AddAsync(user);
                }

                var marketSeller = await _context.MarketSellers.Include(x => x.Market).Include(x => x.Seller).FirstOrDefaultAsync(x => x.SellerId == newReservation.SellerId && x.MarketId == newReservation.MarketId);

                if (marketSeller != null)
                {
                    // get next market day
                    var next = DateTime.Now.GetNextDate((DayOfWeek)marketSeller.Market.DayOfWeek);
                    // get start and end time on the next market day
                    var nextStart = next.SetTime(marketSeller.Market.StartTime, DateTimeKind.Local);
                    var nextEnd   = next.SetTime(marketSeller.Market.EndTime, DateTimeKind.Local);
                    // get the time until the seller will accepted reservations
                    var lastReservation = nextStart.AddHours(marketSeller.LastReservationOffset ?? 0);
                    // check if seller is still accepting reservations
                    if (DateTime.Now <= lastReservation)
                    {
                        if (newReservation.Pickup >= nextStart.ToUniversalTime() && newReservation.Pickup <= nextEnd.ToUniversalTime())
                        {
                            Reservation reservation = _mapper.Map <Reservation>(newReservation);
                            reservation.MarketSellerId = marketSeller.Id;
                            reservation.CreatedAt      = DateTime.Now.ToUniversalTime();

                            // add information to user obj if user would be rembered
                            if (newReservation.RememberMe)
                            {
                                user.Firstname = newReservation.Firstname;
                                user.Lastname  = newReservation.Lastname;
                                user.Phone     = newReservation.Phone;
                            }

                            // add and save reservation (this also saves the user created above)
                            await _context.Reservations.AddAsync(reservation);

                            await _context.SaveChangesAsync();

                            // load references to return a complete reservation object
                            _context.Entry(reservation).Reference(x => x.MarketSeller).Load();
                            _context.Entry(reservation.MarketSeller).Reference(x => x.Market).Load();
                            _context.Entry(reservation.MarketSeller).Reference(x => x.Seller).Load();

                            // send user mail
                            await _mailService.SendReservationConfirmation(user.Mail, CreatePlaceholders(reservation, marketSeller.Market, marketSeller.Seller));

                            // send seller mail
                            // TODO: add seller mail

                            serviceResponse.Data = _mapper.Map <GetReservationDTO>(reservation);
                        }
                        else
                        {
                            serviceResponse.Success = false;
                            serviceResponse.Message = $"Pickup invalid! It is only possible to create reservations for the next market day (Start: {nextStart.ToString()}, End: {nextEnd.ToString()}).";
                        }
                    }
                    else
                    {
                        serviceResponse.Success = false;
                        serviceResponse.Message = $"Reservation time limit exceeded for seller (id: '{newReservation.SellerId}') at market (id: '{newReservation.MarketId}'. The seller allows reservations only until {marketSeller.LastReservationOffset} minutes before market starts.";
                    }
                }
                else
                {
                    serviceResponse.Success = false;
                    serviceResponse.Message = $"Could not found combination of marketId '{newReservation.MarketId}' and sellerId '{newReservation.SellerId}'";
                }
            }
            catch (Exception ex)
            {
                serviceResponse.Success   = false;
                serviceResponse.Exception = ex.Message;
            }
            return(serviceResponse);
        }
示例#4
0
        public async Task <ServiceResponse <GetReservationDTO> > AddReservation(AddReservationDTO newReservation)
        {
            ServiceResponse <GetReservationDTO> serviceResponse = new ServiceResponse <GetReservationDTO>();

            try
            {
                var marketSeller = await _context.MarketSellers.Include(x => x.Market).Include(x => x.Seller).FirstOrDefaultAsync(x => x.SellerId == newReservation.SellerId && x.MarketId == newReservation.MarketId);

                if (marketSeller != null)
                {
                    var next            = DateTime.Now.GetNextDate((DayOfWeek)marketSeller.Market.DayOfWeek);
                    var lastReservation = next.AddHours(marketSeller.LastReservationOffset ?? 0);
                    if (DateTime.Now <= lastReservation)
                    {
                        var nextStart = next.SetTime(marketSeller.Market.StartTime, DateTimeKind.Local);
                        var nextEnd   = next.SetTime(marketSeller.Market.EndTime, DateTimeKind.Local);
                        if (newReservation.Pickup >= nextStart.ToUniversalTime() && newReservation.Pickup <= nextEnd.ToUniversalTime())
                        {
                            Reservation reservation = _mapper.Map <Reservation>(newReservation);
                            reservation.MarketSellerId = marketSeller.Id;
                            reservation.CreatedAt      = DateTime.Now.ToUniversalTime();

                            // add and save reservation
                            await _context.Reservations.AddAsync(reservation);

                            await _context.SaveChangesAsync();

                            // load references to return a complete reservation object
                            _context.Entry(reservation).Reference(x => x.MarketSeller).Load();
                            _context.Entry(reservation.MarketSeller).Reference(x => x.Market).Load();
                            _context.Entry(reservation.MarketSeller).Reference(x => x.Seller).Load();

                            // collect information for mail (no need for a null check -> db constraint would fail if reservation has invalid user id)
                            var user = await _context.Users.FindAsync(newReservation.UserId);

                            // send user mail
                            await _mailService.SendReservationConfirmation(user.Mail, CreatePlaceholders(reservation, marketSeller.Market, marketSeller.Seller, user));

                            // send seller mail
                            // TODO: add seller mail

                            serviceResponse.Data = _mapper.Map <GetReservationDTO>(reservation);
                        }
                        else
                        {
                            serviceResponse.Success = false;
                            serviceResponse.Message = $"Pickup invalid! It is only possible to create reservations for the next market day (Start: {nextStart.ToString()}, End: {nextEnd.ToString()}).";
                        }
                    }
                    else
                    {
                        serviceResponse.Success = false;
                        serviceResponse.Message = $"Reservation time limit exceeded for seller (id: '{newReservation.SellerId}') at market (id: '{newReservation.MarketId}'. The seller allows reservations only until {marketSeller.LastReservationOffset} minutes before market starts.";
                    }
                }
                else
                {
                    serviceResponse.Success = false;
                    serviceResponse.Message = $"Could not found combination of marketId '{newReservation.MarketId}' and sellerId '{newReservation.SellerId}'";
                }
            }
            catch (Exception ex)
            {
                serviceResponse.Success   = false;
                serviceResponse.Exception = ex.Message;
            }
            return(serviceResponse);
        }