示例#1
0
        private async Task <bool> StartLikibuSearch(Models.Find.SearchVM searchVM)
        {
            try
            {
                InitSearchVM4Search(searchVM);
                string searchID = await Likibu.LikibuAccess.StartSearchSession(searchVM);

                if (searchID == null)
                {
                    throw new Exception("No SearchID returned by Likibu request");
                }
                PopulateSearchSession(searchVM, searchID);
                return(true);
            }
            catch (Exception e)
            {
                NotificationManager.AddException(e);
                if (e.GetType() == typeof(WebException))
                {
                    NotificationManager.AddNotification(NotificationType.Warning, "Internal Server Error! Please be patient, we are working on it...");
                }
            }

            return(false);
        }
        public ActionResult Index(Models.Find.SearchVM searchVM) //public search
        {
            searchVM.Currency = "usd";
            searchVM.Language = "en";



            return(View(searchVM));
        }
示例#3
0
 private void InitSearchVM4Search(Models.Find.SearchVM searchVM)
 {
     searchVM.Search.FilterProps             = new Models.Find.FilterProperties();
     searchVM.Search.FilterProps.PerPage     = "10";
     searchVM.Search.FilterProps.Page        = "1";
     searchVM.Search.FilterProps.Sort        = "reco";// Models.Find.Likibu.Sort.Reco;
     searchVM.Search.FilterProps.AcomType    = "";
     searchVM.Search.FilterProps.PartnerID   = "";
     searchVM.Search.FilterProps.PrivacyType = "";
     searchVM.Search.FilterProps.Amenities   = "";
     searchVM.Search.FilterProps.PriceMin    = "";
     searchVM.Search.FilterProps.PriceMax    = "";
 }
示例#4
0
        private IQueryable <Models.Request.Request> FilterCheckTimeRequests(Models.Find.SearchVM searchVM, IQueryable <Models.Request.Request> retQ, float checkOffset)
        {
            DateTime chckIn = DateTime.Parse(searchVM.Search.CheckIn);

            chckIn.AddDays(checkOffset);
            DateTime chckOut = DateTime.Parse(searchVM.Search.CheckOut);

            chckOut.AddDays(-checkOffset);

            if (searchVM.Search.CheckIn != null && searchVM.Search.CheckOut != null)
            {
                IQueryable <Models.Request.Request> excludeBefore = retQ.Where(p => p.CheckIn > chckOut);
                IQueryable <Models.Request.Request> excludeAfter  = retQ.Where(p => p.CheckOut < chckIn);

                retQ = retQ.Except(excludeBefore);
                retQ = retQ.Except(excludeAfter);
            }
            return(retQ);
        }
示例#5
0
        /// <summary>
        /// Save Results to SearchVM
        /// Save SearchSession to db if user is registered -->needed to Create Request
        /// </summary>
        /// <param name="searchVM"></param>
        /// <returns></returns>
        private async Task <bool> GetSearchResults(Models.Find.SearchVM searchVM)
        {
            try
            {
                searchVM.LikibuResults = new Models.Accommodation.Likibu.SearchRequestResults();
                searchVM.LikibuResults = await Likibu.LikibuAccess.RequestSearchResults(searchVM);

                if (Request.IsAuthenticated)
                {
                    await UpdateSearchSession(searchVM);
                }
                return(true);
            }
            catch (Exception e)
            {
                NotificationManager.AddException(e);
                return(false);
            }
        }
        public static async Task <string> StartSearchSession(Models.Find.SearchVM searchVM)
        {
            try
            {
                webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
                string webrq = SearchSessionString + ApiKey;

                Models.Accommodation.Likibu.StartSearchSessionBody Param = new Models.Accommodation.Likibu.StartSearchSessionBody(searchVM);
                string retStr = await webClient.UploadStringTaskAsync(webrq, "POST", Param.Body);

                Models.Accommodation.Likibu.StartSearchSessionReturnObject SssRObj = ParseSSSResponse(retStr);
                return(SssRObj.ID);
            }
            catch (WebException e)
            {
                NotificationManager.AddException(e);
            }
            return(null);
        }
示例#7
0
        private async Task <Models.Find.RequestResults> GetRequestSearchResults(Models.Find.SearchVM searchVM)
        {
            string destination = searchVM.Search.Location;

            Models.Accommodation.Likibu.Destination dest = (await GetGeolocationString(destination, searchVM.Language, "1")).FirstOrDefault();

            string destID = dest.ID;

            using (var db = new ApplicationDbContext())
            {
                IQueryable <Models.Request.Request> retQ = db.Requests.Where(p => p.Accommodation.AccomProfile.DestinationIDs.Contains(destID)).Include(p => p.Accommodation).Include(p => p.Accommodation.AccomProfile); /// Destination Ids have to be updated
                //retQ = FilterCheckTimeRequests(searchVM, retQ, 3.0f);
                retQ = retQ.Where(p => p.objState == BaseDataObject.ObjectState.Valid);
                int totalres = retQ.Count();
                int page     = int.Parse(searchVM.Search.FilterProps.Page);
                int perpage  = int.Parse(searchVM.Search.FilterProps.PerPage);
                IEnumerable <Models.Request.Request> retList = await retQ.ToListAsync();

                if (page > 1)
                {
                    retList = retList.Skip(perpage * (page - 1));
                }
                retList = retList.Take(perpage);


                List <Models.Request.RequestVMListing> retListFiltered = new List <Models.Request.RequestVMListing>();

                foreach (var rq in retList) //Filter invalid requests
                {
                    if (rq.IsValid())
                    {
                        Models.VM.ProfilePreviewVM host = await ProfilesController.ProfilePreviewVM(rq.RequestOwner_ID);

                        retListFiltered.Add(new Models.Request.RequestVMListing(rq, "", host)); //stats
                    }
                }

                searchVM.RequestResults = new Models.Find.RequestResults(retListFiltered, page, perpage, totalres); //int.Parse(searchVM.Search.FilterProps.Page), int.Parse(searchVM.Search.FilterProps.PerPage)
                return(searchVM.RequestResults);
            }
        }
示例#8
0
        //Poll Status until server is ready to get Results
        private async Task <bool> WaitForResults(Models.Find.SearchVM searchVM)
        {
            try
            {
                while (true)
                {
                    await Task.Delay(1000);
                    await PollSearchStatus(searchVM);

                    if (searchVM.Search.SessionStatus)
                    {
                        return(true);
                    }
                    await Task.Delay(100);
                }
            }
            catch (Exception e)
            {
                NotificationManager.AddException(e);
                return(false);
            }
        }
示例#9
0
        [HttpGet] ///Todo load old Search
        public async Task <ActionResult> Search()
        {
            try
            {
                if (Request.IsAuthenticated)
                {
                    TravelerProfile travelerProfile = await ProfileManager.LoadUserAndTravelerProfile(User);

                    if (!Check.IsNull(travelerProfile, "Search"))
                    {
                        travelerProfile.SearchSession = await db.LikibuSearchSession.FindAsync(travelerProfile.TravelerSearchID);

                        if (!Check.IsNull(travelerProfile.SearchSession, "Search"))
                        {
                            TimeSpan lastSearch = DateTime.Now - travelerProfile.SearchSession.TimeStamp;
                            TimeSpan oneDay     = TimeSpan.FromDays(1);
                            if (lastSearch < oneDay)
                            {
                                Models.Find.SearchVM searchVM = new Models.Find.SearchVM();
                                searchVM.Search             = new Models.Find.Search();
                                searchVM.Search.CheckIn     = travelerProfile.SearchSession.CheckIn;
                                searchVM.Search.CheckOut    = travelerProfile.SearchSession.CheckOut;
                                searchVM.Search.Location    = travelerProfile.SearchSession.Location;
                                searchVM.Search.BedRooms    = travelerProfile.SearchSession.BedRooms;
                                searchVM.Search.FilterProps = travelerProfile.SearchSession.Filter;
                                return(await Search(searchVM));
                            }
                        }
                    }
                }

                return(View());
            }
            catch (Exception e) {
                NotificationManager.AddException(e);
                return(RedirectToAction("Index", "Home"));
            }
        }
示例#10
0
        public async Task <JsonResult> FetchSearchResults(Models.Find.SearchVM searchVM)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    JsonResult res = new JsonResult();

                    searchVM.LikibuResults = await Likibu.LikibuAccess.RequestSearchResults(searchVM);

                    searchVM.RequestResults = await GetRequestSearchResults(searchVM);

                    res.Data = searchVM;
                    return(res);
                }
                catch (Exception e)
                {
                    NotificationManager.AddException(e);
                    NotificationManager.AddNotification(NotificationType.Error, "Oops, something went wrong!");
                }
            }
            return(null);
        }
示例#11
0
        private async Task <bool> UpdateSearchSession(Models.Find.SearchVM searchVM)
        {
            try
            {
                TravelerProfile tp = await ProfileManager.LoadUserAndTravelerProfile(User);

                using (var db = new ApplicationDbContext())
                {
                    TravelerProfile travelerDB    = db.TravelerProfile.Find(tp.ID);
                    var             trackedSearch = db.LikibuSearchSession.Find(travelerDB.TravelerSearchID);

                    tp.SearchSession.UpdateSearchSession(searchVM.Search);
                    db.Entry(trackedSearch).CurrentValues.SetValues(tp.SearchSession);
                    db.Entry(trackedSearch.Filter).CurrentValues.SetValues(tp.SearchSession.Filter);
                    await db.SaveChangesAsync();
                }
                return(true);
            }
            catch (Exception e)
            {
                NotificationManager.AddException(e);
                return(false);
            }
        }
示例#12
0
 private void PopulateSearchSession(Models.Find.SearchVM searchVM, string searchID)
 {
     searchVM.Search.LikibuSessionID = searchID;
     searchVM.Search.TimeStamp       = DateTime.Now;
 }
        public static async Task <Models.Accommodation.Likibu.SearchRequestResults> RequestSearchResults(Models.Find.SearchVM searchVM)
        {
            string webrq = SearchSessionString + searchVM.Search.LikibuSessionID + ApiKey;

            Models.Accommodation.Likibu.SearchResultsRequestBody SRP = new Models.Accommodation.Likibu.SearchResultsRequestBody(searchVM.Search.FilterProps.PerPage, searchVM.Search.FilterProps.Page, searchVM.Search.FilterProps.Sort, searchVM.Search.FilterProps.PrivacyType, searchVM.Search.FilterProps.AcomType, searchVM.Search.FilterProps.Amenities, searchVM.Search.FilterProps.PartnerID, searchVM.Search.BedRooms.ToString(), searchVM.Search.FilterProps.PriceMin, searchVM.Search.FilterProps.PriceMax);
            string retStr = await webClient.DownloadStringTaskAsync(webrq + SRP.Body);

            Models.Accommodation.Likibu.SearchRequestResults resultsFinal = new Models.Accommodation.Likibu.SearchRequestResults();
            resultsFinal = ParseSearchResultResponse(retStr);
            return(resultsFinal);
        }
示例#14
0
        public async Task <ActionResult> Search(Models.Find.SearchVM searchVM)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    if (searchVM.Search.nav == null)
                    {
                        if (Request.IsAuthenticated)
                        {
                            TravelerProfile tp = await ProfileManager.LoadUserAndTravelerProfile(User);

                            tp.Attributes = await db.TravelerProfileAttributes.FindAsync(tp.TravelerAttributesID);

                            searchVM.Currency = tp.Attributes.Currency;
                            searchVM.Language = tp.Attributes.Language;
                        }
                        else
                        {
                            Models.Find.Search search = searchVM.Search;
                            searchVM          = new Models.Find.SearchVM();
                            searchVM.Search   = search;
                            searchVM.Currency = "usd";
                            searchVM.Language = "en";
                        }

                        await StartLikibuSearch(searchVM); /// if ret == null Show internal Server Error, try again later
                        await WaitForResults(searchVM);
                        await GetSearchResults(searchVM);

                        await GetRequestSearchResults(searchVM);
                    }
                    else
                    {
                        int page = int.Parse(searchVM.Search.FilterProps.Page);
                        switch (searchVM.Search.nav)
                        {
                        case "p":
                        {
                            if (page > 1)
                            {
                                page--;
                            }
                            break;
                        }

                        case "n":
                        {
                            if (page < searchVM.LikibuResults.TotalPages)
                            {
                                page++;
                            }
                            break;
                        }

                        default:
                            break;
                        }
                        searchVM.Search.FilterProps.Page = page.ToString();



                        await GetRequestSearchResults(searchVM);
                        await GetSearchResults(searchVM);
                    }
                }
                catch (Exception e)
                {
                    NotificationManager.AddException(e);
                    NotificationManager.AddNotification(NotificationType.Error, "Oops, something went wrong!");
                }
                return(View(searchVM));
            }//ModelState not valid

            return(View(searchVM));
        }
示例#15
0
        /// <summary>
        /// filters number of bedrooms according to search in searchVM.Search(SearchMask) and AccommodationProfile
        /// </summary>
        /// <param name="searchVM"></param>
        /// <param name="retQ"></param>
        /// <returns>Iqueryable with filtered results</returns>

        private IQueryable <Models.Request.Request> FilterBedRooms(Models.Find.SearchVM searchVM, IQueryable <Models.Request.Request> retQ)
        {
            retQ = retQ.Where(p => p.Accommodation.AccomProfile.BedRooms >= searchVM.Search.BedRooms);
            return(retQ);
        }
示例#16
0
        private async Task <Models.Accommodation.Likibu.AccomodationDetails> GetAcomodationDetails(Models.Find.SearchVM searchVM, string roomID)
        {
            Models.Accommodation.Likibu.AccomodationDetailsParam reqParam = new Models.Accommodation.Likibu.AccomodationDetailsParam(searchVM.Language, searchVM.Currency, searchVM.Search.CheckIn, searchVM.Search.CheckOut);
            Models.Accommodation.Likibu.AccomodationDetails      result   = await Likibu.LikibuAccess.RequestAccomodationDetails(reqParam, roomID);

            return(result);
        }
示例#17
0
        //SearchStatus to SearchVM
        private async Task <Models.Accommodation.Likibu.PollSearchSessionResponse> PollSearchStatus(Models.Find.SearchVM searchVM)
        {
            Models.Accommodation.Likibu.PollSearchSessionResponse response = await Likibu.LikibuAccess.PollSearchStatus(searchVM.Search.LikibuSessionID);

            searchVM.Search.SessionStatus = bool.Parse(response.Status);

            return(response);
        }