package az.mm.developerjobs.service; import az.mm.developerjobs.constant.ImageSource; import az.mm.developerjobs.entity.JobInfo; import az.mm.developerjobs.model.Pagination; import az.mm.developerjobs.repository.JobRepository; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; /** * * @author MM <[email protected]> */ @Service public class JobService { private final Logger logger = LoggerFactory.getLogger(JobService.class); @Autowired private JobRepository jobRepository; @Autowired private JavaMailSender javaMailSender; public List<JobInfo> getJobsWithLimit(String countryCode, int start) { List<JobInfo> jobs = new ArrayList<>(); jobRepository.getJobsWithLimit(countryCode, start, 10).forEach((j) -> { j.setImageSrc(createImageSource(j.getWebsite(), j.getJobTitle())); jobs.add(j); }); return jobs; } public List<JobInfo> getJobsWithPageRequest(String countryCode, int pageIndex) { PageRequest pageRequest = new PageRequest(pageIndex, 10, Sort.Direction.DESC, "id"); List<JobInfo> jobs = new ArrayList<>(); jobRepository.findAllByCountryCode(countryCode, pageRequest).forEach((j) -> { j.setImageSrc(createImageSource(j.getWebsite(), j.getJobTitle())); jobs.add(j); }); return jobs; } public JobInfo getJob(int id, String title) { JobInfo job = jobRepository.findByIdAndUrlSuffix(id, title); if(job != null) job.setImageSrc(createImageSource(job.getWebsite(), job.getJobTitle())); return job; } public int countOfVacancy(String countryCode){ int count = jobRepository.countByCountryCode(countryCode); return count; } public List<JobInfo> caseInsensitiveSearchResult(String searchText) { List<JobInfo> jobs = new ArrayList<>(); jobRepository.searchResult(searchText).forEach((j) -> { j.setImageSrc(createImageSource(j.getWebsite(), j.getJobTitle())); jobs.add(j); }); return jobs; } public List<JobInfo> caseSensitiveSearchResult(String searchText) { List<JobInfo> jobs = new ArrayList<>(); logger.info("Starting search... [{}]", searchText); jobRepository.findAll() .parallelStream() .filter(job -> job.getJobTitle().contains(searchText) || job.getCompany().contains(searchText) || job.getContent().contains(searchText)) .collect(Collectors.toList()) .forEach((j) -> { j.setImageSrc(createImageSource(j.getWebsite(), j.getJobTitle())); jobs.add(j); }); logger.info("Ending search..., result: {}", jobs.size()); jobs.sort((j1, j2) -> j2.getId() - j1.getId()); return jobs; } private String createImageSource(String website, String jobTitle) { ImageSource imgSource; switch (website) { case "boss.az": imgSource = ImageSource.BOSS_AZ; break; case "jobsearch.az": imgSource = ImageSource.JOBSEARCH_AZ; break; case "rabota.az": imgSource = ImageSource.RABOTA_AZ; break; case "banco.az": imgSource = ImageSource.BANCO_AZ; break; case "careerbuilder.com": case "monster.de": imgSource = getDeveloperImageUrl(jobTitle); break; default: imgSource = ImageSource.JOBSEARCH_AZ; } return imgSource.toString(); } private ImageSource getDeveloperImageUrl(String jobTitle) { ImageSource imgSource = ImageSource.DEVELOPER; if (jobTitle != null) { jobTitle = jobTitle.toLowerCase(); if (jobTitle.contains("java")) { imgSource = ImageSource.JAVA; } else if (jobTitle.contains("net")) { imgSource = ImageSource.NET; } else if (jobTitle.contains("android")) { imgSource = ImageSource.ANDROID; } else if (jobTitle.contains("sql")) { imgSource = ImageSource.SQL; } else if (jobTitle.contains("python")) { imgSource = ImageSource.PYTHON; } else if (jobTitle.contains("php")) { imgSource = ImageSource.PHP; } } return imgSource; } public Pagination createPagination(String countryCode, int page){ int vacancyCount = countOfVacancy(countryCode); int count = (int) Math.ceil(vacancyCount / 10.0); int prev = (page != 1) ? (page - 1) : 1; int next = (page != count) ? (page + 1) : count; int begin = 1, end = 10; if (page > 6) { begin = page - 5; end = page + 4; } if (end > count) { end = count; begin = count - 9; if (begin < 1) begin = 1; } Pagination pagination = new Pagination(count, begin, end, prev, next); return pagination; } public void sendMail(String from, String subject, String message) { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo("[email protected]"); //which email you want to send mailMessage.setFrom(from); mailMessage.setSubject(subject); mailMessage.setText(message); javaMailSender.send(mailMessage); logger.info("Mail sent"); } }