/// <summary>
        /// Метод отображает необходимые вакансии для различных ролей
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="options"></param>
        /// <returns></returns>
        public ActionResult ShowVacancies(VacancyFilter filter, FetchOptions options)
        {
            var model = new VacancyListViewModel
            {
                Role = CurrentUser.Role
            };

            switch (CurrentUser.Role)
            {
            case Models.Role.Employer:
            {
                model.Vacancies = employerRepository.ShowMyVacancies(CurrentUser.Id, filter, options);
                return(View(model));
            }

            case Models.Role.Admin:
            {
                model.Vacancies = employerRepository.GetAllWithSort(options);
                return(View(model));
            }

            case Role.Jobseeker:
            {
                model.Vacancies = employerRepository.GetAllWithSort(options);
                return(View(model));
            }
            }
            return(View());
        }
        public async Task <ActionResult <DataPage <Vacancy> > > Index([FromQuery] VacancyFilter filter)
        {
            var result = await _vacancyService.GetFilteredAsync(filter);

            if (result.Objects.Any(w => w.Id == 0))
            {
                var vacancies = result.Objects.GroupBy(v => v.ExternalId).Select(vg => vg.FirstOrDefault()).ToList();

                var departments = vacancies.Where(v => v.Department != null).Select(v => v.Department).GroupBy(d => d.ExternalId).Select(dg => dg.FirstOrDefault()).ToList();
                foreach (var department in departments)
                {
                    _departmentService.Save(department);
                }

                var employers = vacancies.Where(v => v.Employer != null).Select(v => v.Employer).GroupBy(e => e.ExternalId).Select(eg => eg.FirstOrDefault()).ToList();
                foreach (var employer in employers)
                {
                    _employerService.Save(employer);
                }

                foreach (var vacancy in vacancies)
                {
                    _vacancyService.Save(vacancy);
                }
            }

            return(result);
        }
        /// <summary>
        /// метод для получения вакансий, соответствующих критериям поиска
        /// </summary>
        /// <param name="selectedCompany"></param>
        /// <param name="selectedExperience"></param>
        /// <param name="name"></param>
        /// <returns></returns>
        public ActionResult GetSelectedItems(string selectedCompany, string selectedExperience, string name)
        {
            if (long.TryParse(selectedCompany, out long company) != true)
            {
                company = 0;
            }
            else
            {
                company = long.Parse(selectedCompany);
            }
            List <Experience> experiences = new List <Experience>();

            if (long.TryParse(selectedExperience, out long experience) != true)
            {
                experiences = null;
            }
            else
            {
                experiences.Add(experienceRepository.Load(long.Parse(selectedExperience)));
            }
            VacancyFilter filter = new VacancyFilter
            {
                CompanyName  = companyRepository.Load(company),
                Experience   = experiences,
                SearchString = name
            };
            IList <Vacancy> vacancies = employerRepository.GetVacanciesFiltered(filter);
            var             model     = new VacancyListViewModel
            {
                Vacancies = vacancies,
                Role      = CurrentUser.Role
            };

            return(PartialView("VacanciesTable", model));
        }
Example #4
0
        public ICollection <Vacancy> SelectFilteredOrdered(VacancyFilter filter,
                                                           VacancyOrdering ordering)
        {
            using (ISession session = NHibernateHelper.OpenSession())
            {
                var criteria = session.CreateCriteria <Vacancy>();

                Util.AddStringRestrictions(criteria, filter.TitleWords, "Title");
                Util.AddStringRestrictions(criteria, filter.DescriptionWords, "Descriptions");

                criteria.Add(Restrictions.Between
                                 ("Salary", filter.SalaryLowerBound, filter.SalaryUpperBound));

                if (filter.Company != null)
                {
                    criteria.Add(Restrictions
                                 .Where <Vacancy>(v => v.Employee.Company == filter.Company));
                }

                if (!ordering.Salary)
                {
                    criteria.AddOrder(Order.Desc("Salary"));
                }
                if (!ordering.Company)
                {
                    criteria.AddOrder(Order.Desc("Company"));
                }

                return(criteria.List <Vacancy>());
            }
        }
        public async Task <DataPage <Vacancy> > GetFilteredAsync(VacancyFilter filter)
        {
            try
            {
                return(await TryGetFilteredFromHeadHunter(filter));
            }
            catch (HttpRequestException e)
            {
                _logger.LogWarning($"HeadHunter.ru недоступен {e.Message}");
            }

            return(await GetFilteredFromDatabase(filter));
        }
Example #6
0
 public HeadHunterFilterJsonModel(VacancyFilter filter)
 {
     Text                      = filter.Text;
     SearchFields              = filter.SearchFields.Select(sf => sf.ToHeadHunterFormat()).ToList();
     AreaExternalId            = filter.AreaExternalId;
     Experience                = filter.Experience.ToHeadHunterFormat();
     ScheduleTypes             = filter.ScheduleTypes.Select(st => st.ToHeadHunterFormat()).ToList();
     MetroExternalId           = filter.MetroExternalId;
     SpecializationsExternalId = filter.SpecializationExternalIds;
     EmployerExternalId        = filter.EmployerExternalId;
     CurrencyCode              = filter.SalaryFilter?.CurrencyCode;
     Salary                    = filter.SalaryFilter?.Salary;
     OnlyWithSalary            = filter.SalaryFilter?.OnlyWithSalary ?? false;
     Period                    = filter.Period;
     DateFrom                  = filter.DateFrom;
     DateTo                    = filter.DateTo;
     Page                      = filter.Page;
     PageSize                  = filter.PageSize;
 }
        private async Task <DataPage <Vacancy> > TryGetFilteredFromHeadHunter(VacancyFilter filter)
        {
            var vacanciesDataPage = new DataPage <Vacancy>();

            var headHunterFilter = new HeadHunterFilterJsonModel(filter);
            var queryString      = await UrlHelper.ToQueryStringAsync(headHunterFilter);

            var httpResponse = await _httpClient.GetAsync($"{_settings.EndpointUrl}?{queryString}");

            httpResponse.EnsureSuccessStatusCode();

            var sResult = await httpResponse.Content.ReadAsStringAsync();

            if (_jsonDeserializer.TryDeserializeContent(sResult, out var deserializedVacancies))
            {
                vacanciesDataPage = deserializedVacancies;
            }

            return(vacanciesDataPage);
        }
        private async Task <DataPage <Vacancy> > GetFilteredFromDatabase(VacancyFilter filter)
        {
            var query = _context.Vacancies.Include(v => v.Employer).AsNoTracking().AsQueryable();

            if (!String.IsNullOrWhiteSpace(filter.Text))
            {
                var predicate = PredicateBuilder.False <Vacancy>();

                if (!filter.SearchFields.Any() || filter.SearchFields.Contains(SearchField.CompanyName))
                {
                    predicate = predicate.Or(v => v.Employer.Name.Contains(filter.Text));
                }

                if (!filter.SearchFields.Any() || filter.SearchFields.Contains(SearchField.Name))
                {
                    predicate = predicate.Or(v => v.Name.Contains(filter.Text));
                }

                if (!filter.SearchFields.Any() || filter.SearchFields.Contains(SearchField.Description))
                {
                    predicate = predicate.Or(v => v.Description.Contains(filter.Text));
                }

                query = query.Where(predicate);
            }

            if (filter.EmploymentTypes.Any())
            {
                query = query.Where(v => filter.EmploymentTypes.Contains(v.Employment.Value));
            }

            if (filter.ScheduleTypes.Any())
            {
                query = query.Where(v => filter.ScheduleTypes.Contains(v.Schedule.Value));
            }

            if (filter.Experience.HasValue)
            {
                query = query.Where(v => v.Experience.Equals(filter.Experience));
            }

            if (filter.SpecializationExternalIds.Any())
            {
                foreach (var specialization in filter.SpecializationExternalIds)
                {
                    query = query.Where(v => v.VacancySpecializationLinks.Select(vsl => vsl.Specialization.ExternalId).Contains(specialization));
                }
            }

            if (filter.SalaryFilter != null)
            {
                if (filter.SalaryFilter.OnlyWithSalary)
                {
                    query = query.Where(v => v.Salary.From.HasValue || v.Salary.To.HasValue);
                }

                if (filter.SalaryFilter.Salary.HasValue)
                {
                    query = query.Where(v =>
                                        (!v.Salary.From.HasValue || v.Salary.From.HasValue && ApplicationContext.ConvertToCurrency(v.Salary.From, filter.SalaryFilter.CurrencyCode) <= filter.SalaryFilter.Salary) &&
                                        (!v.Salary.To.HasValue || v.Salary.To.HasValue && ApplicationContext.ConvertToCurrency(v.Salary.To, filter.SalaryFilter.CurrencyCode) >= filter.SalaryFilter.Salary));
                }
            }

            if (filter.DateFrom.HasValue)
            {
                query = query.Where(v => v.PublishedAt >= filter.DateFrom);
            }

            if (filter.DateTo.HasValue)
            {
                query = query.Where(v => v.PublishedAt <= filter.DateTo);
            }

            query = query.OrderBy(v => v.Id);

            var skip = filter.Page <= 1 ? 0 : (filter.Page - 1) * filter.PageSize;

            return(new DataPage <Vacancy>
            {
                Count = await query.CountAsync(),
                Objects = await query.GetPaged(skip, filter.PageSize).ToListAsync(),
            });
        }