private ISearchJobsResponse GetJobSearchResultsResponse(JobSearchResultsFilterModel filterModel) { if (!this.PageSize.HasValue || this.PageSize.Value <= 0) { this.PageSize = PageSizeDefaultValue; } JXTNext_SearchJobsRequest request = JobSearchResultsFilterModel.ProcessInputToSearchRequest(filterModel, this.PageSize, PageSizeDefaultValue); string sortingBy = this.Sorting; if (filterModel != null && !filterModel.SortBy.IsNullOrEmpty()) { sortingBy = filterModel.SortBy; } request.SortBy = JobSearchResultsFilterModel.GetSortEnumFromString(sortingBy); ViewBag.SortOrder = JobSearchResultsFilterModel.GetSortStringFromEnum(request.SortBy); ISearchJobsResponse response = _BLConnector.SearchJobs(request); JXTNext_SearchJobsResponse jobResultsList = response as JXTNext_SearchJobsResponse; ViewBag.Request = JsonConvert.SerializeObject(filterModel); ViewBag.FilterModel = JsonConvert.SerializeObject(filterModel); ViewBag.PageSize = (int)this.PageSize; ViewBag.CssClass = this.CssClass; if (jobResultsList != null) { ViewBag.TotalCount = jobResultsList.Total; } ViewBag.JobResultsPageUrl = SfPageHelper.GetPageUrlById(ResultsPageId.IsNullOrWhitespace() ? Guid.Empty : new Guid(ResultsPageId)); ViewBag.CurrentPageUrl = SfPageHelper.GetPageUrlById(SiteMapBase.GetActualCurrentNode().Id); ViewBag.JobDetailsPageUrl = SfPageHelper.GetPageUrlById(DetailsPageId.IsNullOrWhitespace() ? Guid.Empty : new Guid(DetailsPageId)); ViewBag.EmailJobPageUrl = SfPageHelper.GetPageUrlById(EmailJobPageId.IsNullOrWhitespace() ? Guid.Empty : new Guid(EmailJobPageId)); ViewBag.HidePushStateUrl = this.HidePushStateUrl; ViewBag.PageFullUrl = SfPageHelper.GetPageUrlById(SiteMapBase.GetActualCurrentNode().Id); ViewBag.IsMember = SitefinityHelper.IsUserLoggedIn("Member"); var currentIdentity = ClaimsManager.GetCurrentIdentity(); if (currentIdentity.IsAuthenticated) { var currUser = SitefinityHelper.GetUserById(currentIdentity.UserId); if (currUser != null) { ViewBag.Email = currUser.Email; } } return(response); }
private List <JobFilterRoot> GetJobSearchResultsFilters(JobSearchResultsFilterModel filterModel) { JXTNext_SearchJobsRequest request = JobSearchResultsFilterModel.ProcessInputToSearchRequest(filterModel, 10); request.SortBy = JobSearchResultsFilterModel.GetSortEnumFromString(filterModel.SortBy); ISearchJobsResponse response = _BLConnector.SearchJobs(request); JXTNext_SearchJobsResponse jobResultsList = response as JXTNext_SearchJobsResponse; if (jobResultsList != null) { return(jobResultsList.SearchResultsFilters); } else { return(null); } }
public List <JobViewModel> GetListViewModel() { var vmList = new List <JobViewModel>(); ISearchJobsRequest jobListingRequest = new JXTNext_SearchJobsRequest { PageSize = 10 }; JXTNext_SearchJobsResponse jobListingResponse = (JXTNext_SearchJobsResponse)_jxtBLConnector.SearchJobs(jobListingRequest); if (jobListingResponse.Success) { foreach (var jl in jobListingResponse.SearchResults) { vmList.Add(this.GetVM(jl)); } } return(vmList); }
public static JXTNext_SearchJobsRequest ProcessInputToSearchRequest(JobSearchResultsFilterModel filterModel, int?pageSize, int pageSizeDefaultValue = 5) { JXTNext_SearchJobsRequest request = new JXTNext_SearchJobsRequest(); if (filterModel != null) { if (!string.IsNullOrEmpty(filterModel.Keywords)) { request.KeywordsSearchCriteria = new List <KeywordSearch> { new KeywordSearch { Keyword = filterModel.Keywords } } } ; if (filterModel.ConsultantSearch != null && (!string.IsNullOrEmpty(filterModel.ConsultantSearch.Email) || !string.IsNullOrEmpty(filterModel.ConsultantSearch.FirstName) || !string.IsNullOrEmpty(filterModel.ConsultantSearch.LastName))) { request.ConsultantSearchCriteria = new ConsultantSearch() { Email = filterModel.ConsultantSearch.Email, FirstName = filterModel.ConsultantSearch.FirstName, LastName = filterModel.ConsultantSearch.LastName } } ; List <IClassificationSearch> classificationSearches = new List <IClassificationSearch>(); bool isFiltersExists = false; if (filterModel.Salary != null) { isFiltersExists = true; Classification_RangeSearch cateRangeSearch = new Classification_RangeSearch() { ClassificationRootName = filterModel.Salary.RootName, TargetValue = filterModel.Salary.TargetValue, UpperRange = filterModel.Salary.UpperRange, LowerRange = filterModel.Salary.LowerRange }; classificationSearches.Add(cateRangeSearch); } if (filterModel.Filters != null && filterModel.Filters.Count() > 0) { isFiltersExists = true; for (int i = 0; i < filterModel.Filters.Count(); i++) { var filter = filterModel.Filters[i]; if (filter != null && filter.values != null && filter.values.Count > 0) { if (filter.rootId == "CompanyName") { dynamic fieldSearch = new ExpandoObject(); fieldSearch.Status = 1; if (int.TryParse(filter.values[0].ItemID, out int num)) { fieldSearch.CompanyId = int.Parse(filter.values[0].ItemID); } request.FieldSearches = fieldSearch; } else { Classification_CategorySearch cateSearch = new Classification_CategorySearch { ClassificationRootName = filter.rootId, TargetClassifications = new List <Classification_CategorySearchTarget>() }; foreach (var filterItem in filter.values) { var targetCategory = new Classification_CategorySearchTarget() { SubTargets = new List <Classification_CategorySearchTarget>() }; ProcessFilterLevels(targetCategory, filterItem); cateSearch.TargetClassifications.Add(targetCategory); } classificationSearches.Add(cateSearch); } } } } if (isFiltersExists) { request.ClassificationsSearchCriteria = classificationSearches; } if (pageSize.HasValue && pageSize.Value > 0) { request.PageSize = pageSize.Value; } else { request.PageSize = pageSizeDefaultValue; } if (filterModel.Page <= 0) { filterModel.Page = 1; } request.PageNumber = filterModel.Page - 1; } return(request); }
public ISearchJobsResponse SearchJobs(ISearchJobsRequest search) { JXTNext_SearchJobsRequest jobSearch = search as JXTNext_SearchJobsRequest; if (jobSearch.FieldSearches == null) { dynamic fieldSearch = new ExpandoObject(); fieldSearch.Status = 1; jobSearch.FieldSearches = fieldSearch; } jobSearch.FieldRanges = new RangeSearch() { ExpiryDate = new DateRange() { LowerRange = (long)DateTime.Now.ToUniversalTime().Subtract(UnixEpoch).TotalMilliseconds } }; //An extra logic layer should be added to handle this model conversion dynamic searchAPIModel = new { search = jobSearch, legacyJobSource = Settings_LegacyJobSource }; ConnectorPostRequest connectorRequest = new ConnectorPostRequest(HTTP_Requests_MaxWaitTime) { HeaderValues = HTTP_Request_HeaderValues, TargetUri = new Uri(CONFIG_DataAccessTarget + $"/api/guest/job/search"), Data = searchAPIModel }; ConnectorResponse response = JXTNext.Common.API.Connector.Post(connectorRequest); //parse the response bool actionSuccessful = response.Success; if (actionSuccessful) { dynamic responseObj = JsonConvert.DeserializeObject <dynamic>(response.Response); dynamic responseObjData = JsonConvert.DeserializeObject <dynamic>(responseObj.data.ToString()); dynamic responseObjDataSearchResults = JsonConvert.DeserializeObject <dynamic>(responseObjData.jobsearchresults.ToString()); dynamic responseObjDataSearchResultsFilters = JsonConvert.DeserializeObject <dynamic>(responseObjData.SearchResultsFilters.ToString()); if (responseObj["status"] == 200) { return new JXTNext_SearchJobsResponse { Success = true, Total = responseObjDataSearchResults.total, SearchResults = _jobMapper.ConvertSearchResultsToLocal <JobDetailsFullModel>(responseObjDataSearchResults.searchResults), SearchResultsFilters = _jobMapper.ConvertSearchResultsFiltersToLocal <JobFilterRoot>(responseObjDataSearchResultsFilters.Data) } } ; else { return new JXTNext_SearchJobsResponse { Success = false, Errors = responseObj.errors } }; } else { return new JXTNext_SearchJobsResponse { Success = false, Errors = new List <string> { response.Response } } }; }
public ActionResult Details(Telerik.Sitefinity.DynamicModules.Model.DynamicContent item) { dynamic dynamicJobResultsList = null; string location = string.Empty; Dictionary <string, List <string> > locationDict = new Dictionary <string, List <string> >(); if (!string.IsNullOrWhiteSpace(Request.QueryString["location"])) { location = Request.QueryString["location"]; string[] locArr = location.Split(','); for (int i = 0; i < locArr.Length; i++) { var locationDetails = GetLocationGuid(locArr[i].Trim(new char[] { ' ' })); if (locationDetails.Key != null) { if (locationDict.ContainsKey(locationDetails.Key)) { locationDict[locationDetails.Key].Add(locationDetails.Value); } else { locationDict[locationDetails.Key] = new List <string>(); locationDict[locationDetails.Key].Add(locationDetails.Value); } } } } JXTNext_SearchJobsRequest request = new JXTNext_SearchJobsRequest(); JobSearchResultsFilterModel filterModelNew = new JobSearchResultsFilterModel(); if (item.DoesFieldExist("ConsultantName")) { string consultantFullName = item.GetString("ConsultantName"); if (!string.IsNullOrEmpty(consultantFullName)) { ViewBag.ConsultantName = consultantFullName; List <string> consultantNameList = consultantFullName.Split(new char[] { ' ' }).ToList(); filterModelNew.ConsultantSearch = new Consultant(); filterModelNew.ConsultantSearch.Email = null; filterModelNew.ConsultantSearch.FirstName = consultantNameList.First(); if (consultantNameList.Count > 1) { filterModelNew.ConsultantSearch.LastName = consultantNameList.Last(); } if (!this.PageSize.HasValue || this.PageSize.Value <= 0) { this.PageSize = PageSizeDefaultValue; } request = JobSearchResultsFilterModel.ProcessInputToSearchRequest(filterModelNew, this.PageSize, PageSizeDefaultValue); string sortingBy = this.Sorting; if (filterModelNew != null && !filterModelNew.SortBy.IsNullOrEmpty()) { sortingBy = filterModelNew.SortBy; } request.SortBy = JobSearchResultsFilterModel.GetSortEnumFromString(sortingBy); ViewBag.SortOrder = JobSearchResultsFilterModel.GetSortStringFromEnum(request.SortBy); Log.Write($"Job Search by Consultant name request json : " + JsonConvert.SerializeObject(request), ConfigurationPolicy.ErrorLog); ISearchJobsResponse response = _BLConnector.SearchJobs(request); JXTNext_SearchJobsResponse jobResultsList = response as JXTNext_SearchJobsResponse; dynamicJobResultsList = jobResultsList as dynamic; } } else if (item.DoesFieldExist("Email")) { var email = item.GetString("Email"); if (!string.IsNullOrEmpty(email)) { filterModelNew = new JobSearchResultsFilterModel() { ConsultantSearch = new Consultant() { Email = email } }; if (!this.PageSize.HasValue || this.PageSize.Value <= 0) { this.PageSize = PageSizeDefaultValue; } request = JobSearchResultsFilterModel.ProcessInputToSearchRequest(filterModelNew, this.PageSize, PageSizeDefaultValue); string sortingBy = this.Sorting; if (filterModelNew != null && !filterModelNew.SortBy.IsNullOrEmpty()) { sortingBy = filterModelNew.SortBy; } request.SortBy = JobSearchResultsFilterModel.GetSortEnumFromString(sortingBy); ViewBag.SortOrder = JobSearchResultsFilterModel.GetSortStringFromEnum(request.SortBy); Log.Write($"Job Search by Consultant Email request json : " + JsonConvert.SerializeObject(request), ConfigurationPolicy.ErrorLog); ISearchJobsResponse response = _BLConnector.SearchJobs(request); JXTNext_SearchJobsResponse jobResultsList = response as JXTNext_SearchJobsResponse; dynamicJobResultsList = jobResultsList as dynamic; } } filterModelNew.ConsultantSearch = null; filterModelNew.Filters = new List <JobSearchFilterReceiver>(); if (dynamicJobResultsList.Total == 0) { if (item.DoesFieldExist("Category")) { JobSearchFilterReceiver classificationSearch = new JobSearchFilterReceiver(); classificationSearch.rootId = "Classifications"; classificationSearch.searchTarget = "Categories"; classificationSearch.values = new List <JobSearchFilterReceiverItem>(); TrackedList <Guid> classIds = (TrackedList <Guid>)item.GetValue("Category"); if (classIds != null && classIds.Count > 0) { foreach (var id in classIds) { JobSearchFilterReceiverItem filterItem = new JobSearchFilterReceiverItem(); filterItem.ItemID = id.ToString().ToUpper(); filterItem.SubTargets = null; classificationSearch.values.Add(filterItem); } } filterModelNew.Filters.Add(classificationSearch); } if (locationDict.Count > 0) { JobSearchFilterReceiver locationSearch = new JobSearchFilterReceiver(); locationSearch.rootId = "CountryLocationArea"; locationSearch.searchTarget = "Categories"; locationSearch.values = new List <JobSearchFilterReceiverItem>(); foreach (var cnsltLocation in locationDict) { JobSearchFilterReceiverItem filterItem = new JobSearchFilterReceiverItem(); filterItem.ItemID = cnsltLocation.Key.ToString().ToUpper(); filterItem.SubTargets = new List <JobSearchFilterReceiverItem>(); var subLocations = cnsltLocation.Value; foreach (string subLocation in subLocations) { JobSearchFilterReceiverItem jobSearchFilterReceiverItem = new JobSearchFilterReceiverItem(); jobSearchFilterReceiverItem.ItemID = subLocation; jobSearchFilterReceiverItem.SubTargets = null; filterItem.SubTargets.Add(jobSearchFilterReceiverItem); } locationSearch.values.Add(filterItem); } filterModelNew.Filters.Add(locationSearch); } request = JobSearchResultsFilterModel.ProcessInputToSearchRequest(filterModelNew, this.PageSize, PageSizeDefaultValue); string sortBy = this.Sorting; if (filterModelNew != null && !filterModelNew.SortBy.IsNullOrEmpty()) { sortBy = filterModelNew.SortBy; } request.SortBy = JobSearchResultsFilterModel.GetSortEnumFromString(sortBy); ViewBag.SortOrder = JobSearchResultsFilterModel.GetSortStringFromEnum(request.SortBy); Log.Write($"Job Search by Consultant related classification and location request json : " + JsonConvert.SerializeObject(request), ConfigurationPolicy.ErrorLog); ISearchJobsResponse searchResponse = _BLConnector.SearchJobs(request); JXTNext_SearchJobsResponse relatedJobResultsList = searchResponse as JXTNext_SearchJobsResponse; dynamicJobResultsList = relatedJobResultsList as dynamic; } ViewBag.PageSize = (int)this.PageSize; ViewBag.CssClass = this.CssClass; ViewBag.JobResultsPageUrl = SfPageHelper.GetPageUrlById(ResultsPageId.IsNullOrWhitespace() ? Guid.Empty : new Guid(ResultsPageId)); ViewBag.CurrentPageUrl = SfPageHelper.GetPageUrlById(SiteMapBase.GetActualCurrentNode().Id); ViewBag.JobDetailsPageUrl = SfPageHelper.GetPageUrlById(DetailsPageId.IsNullOrWhitespace() ? Guid.Empty : new Guid(DetailsPageId)); return(this.View(this.templateNamePrefix + this.TemplateName, dynamicJobResultsList)); }
public JsonResult GetSearchResults_WithLeftFiltersSelected(string jobRequest, int pageNumber, string sortBy) { //Use preconfigured search config from widget settings if available JobSearchResultsFilterModel searchInputs; if (SearchConfig != null) { searchInputs = JsonConvert.DeserializeObject <JobSearchResultsFilterModel>(SearchConfig); } else { searchInputs = JsonConvert.DeserializeObject <JobSearchResultsFilterModel>(jobRequest); } if (this.UseConfigFilters) { var jobFilterComponents = this.SerializedJobSearchParams == null ? null : JsonConvert.DeserializeObject <List <JobSearchModel> >(this.SerializedJobSearchParams); if (jobFilterComponents != null) { searchInputs = new JobSearchResultsFilterModel() { Keywords = this.KeywordsSelectedJobs, Filters = new List <JobSearchFilterReceiver>() }; foreach (JobSearchModel item in jobFilterComponents) { FilterData(item.Filters); item.Filters = item.Filters.Where(d => d.Show == true || d.Filters?.Count > 0).ToList(); } foreach (var configItem in jobFilterComponents) { var rootFilterItem = new JobSearchFilterReceiver() { values = new List <JobSearchFilterReceiverItem>() }; rootFilterItem.rootId = configItem.FilterType; foreach (var subFilItem in configItem.Filters) { var targetFilterItem = new JobSearchFilterReceiverItem() { SubTargets = new List <JobSearchFilterReceiverItem>() }; ProcessConfigFilterItems(targetFilterItem, subFilItem); rootFilterItem.values.Add(targetFilterItem); } searchInputs.Filters.Add(rootFilterItem); } } } searchInputs.Page = pageNumber; searchInputs.SortBy = sortBy; if (!this.PageSize.HasValue || this.PageSize.Value <= 0) { this.PageSize = PageSizeDefaultValue; } JXTNext_SearchJobsRequest searchRequest = JobSearchResultsFilterModel.ProcessInputToSearchRequest(searchInputs, this.PageSize, PageSizeDefaultValue); #region Filter Logic List <string> selectedFilterID = new List <string>(); List <JobSearchFilterReceiver> selectedFilters = searchInputs.Filters; if (selectedFilters != null) { foreach (var filter in selectedFilters) { if (filter != null) { foreach (var value in filter.values) { if (value != null) { selectedFilterID.Add(value.ItemID); if (value.SubTargets != null) { foreach (var subTarget in value.SubTargets) { selectedFilterID.Add(value.ItemID + "_" + subTarget.ItemID); } } } } } } } #endregion string sortingBy = this.Sorting; if (searchInputs != null && !searchInputs.SortBy.IsNullOrEmpty()) { sortingBy = searchInputs.SortBy; } searchRequest.SortBy = JobSearchResultsFilterModel.GetSortEnumFromString(sortingBy); ViewBag.SortOrder = JobSearchResultsFilterModel.GetSortStringFromEnum(searchRequest.SortBy); JXTNext_SearchJobsResponse jobResponse = (JXTNext_SearchJobsResponse)_BLConnector.SearchJobs(searchRequest); foreach (var item in jobResponse.SearchResults) { List <OrderedDictionary> classificationItemsList = new List <OrderedDictionary>(); item.ClassificationsRootName = "Classifications"; // Assuming the maximum ten parents the job will be posted for (int i = 0; i < 10; i++) { string key = "Classifications[0].Filters[" + i + "].ExternalReference"; string value = "Classifications[0].Filters[" + i + "].Value"; string parentClassificationsKey = "Classifications[0].Filters[" + i + "].SubLevel[0]"; if (item.CustomData.ContainsKey(key)) { OrderedDictionary classifOrdDict = new OrderedDictionary(); classifOrdDict.Add(item.CustomData[key], item.CustomData[value]); JobDetailsViewModel.ProcessCustomData(parentClassificationsKey, item.CustomData, classifOrdDict); OrderedDictionary classifParentIdsOrdDict = new OrderedDictionary(); JobDetailsViewModel.AppendParentIds(classifOrdDict, classifParentIdsOrdDict); classificationItemsList.Add(classifParentIdsOrdDict); item.Classifications = classificationItemsList; } } // Take the first item in the list as SEO route for Job Details page if (item.ClassificationURL != null) { item.ClassificationsSEORouteName = item.ClassificationURL; } else if (item.Classifications.Count > 0) { List <string> seoString = new List <string>(); foreach (var key in item.Classifications[0].Keys) { string value = item.Classifications[0][key].ToString(); string SEOString = Regex.Replace(value, @"([^\w]+)", "-"); seoString.Add(SEOString + "-jobs"); } seoString.Add(Regex.Replace(item.Title + "-job", @"([^\w]+)", "-")); item.ClassificationsSEORouteName = String.Join("/", seoString); } } jobResponse.SelectedFilters = selectedFilterID; return(new JsonResult { Data = jobResponse }); }