source: jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java@ 28b3398

main
Last change on this file since 28b3398 was 28b3398, checked in by 223021 <daniel.ilievski.2@…>, 2 weeks ago

Implemented job application functionality, added job advertisement filtering and replaced text areas with editors

  • Property mode set to 100644
File size: 7.2 KB
Line 
1package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl;
2
3import lombok.RequiredArgsConstructor;
4import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.EmploymentStatus;
5import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.enumerations.JobType;
6import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdDetailsDTO;
7import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdFilterDTO;
8import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.DTO.JobAdvertisementDTO;
9import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.job_advertisements.JobAdvertisement;
10import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.Recruiter;
11import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.models.users.User;
12import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.JobAdvertisementRepository;
13import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.RecruiterRepository;
14import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.repositories.UserRepository;
15import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JobAdvertisementService;
16import org.springframework.stereotype.Service;
17
18import java.time.LocalDate;
19import java.time.LocalDateTime;
20import java.util.Comparator;
21import java.util.List;
22
23@Service
24@RequiredArgsConstructor
25public class JobAdvertisementServiceImpl implements JobAdvertisementService {
26 private final UserRepository userRepository;
27 private final JobAdvertisementRepository jobAdvertisementRepository;
28 private final RecruiterRepository recruiterRepository;
29
30 @Override
31 public JobAdDetailsDTO addJobAdvertisement(JobAdvertisementDTO jobAdvertisementDTO) {
32 Recruiter recruiter = recruiterRepository.findRecruiterByEmail(jobAdvertisementDTO.getEmail()).orElseThrow(() -> new IllegalArgumentException("User not found"));
33 JobAdvertisement jobAdvertisement = new JobAdvertisement(
34 recruiter,
35 jobAdvertisementDTO.getTitle(),
36 jobAdvertisementDTO.getDescription(),
37 jobAdvertisementDTO.getIndustry(),
38 jobAdvertisementDTO.getStartingSalary(),
39 LocalDate.parse(jobAdvertisementDTO.getActiveUntil()),
40 JobType.valueOf(jobAdvertisementDTO.getJobType()),
41 EmploymentStatus.valueOf(jobAdvertisementDTO.getEmploymentStatus())
42 );
43 jobAdvertisementRepository.save(jobAdvertisement);
44 return JobAdvertisement.mapToJobAdDetailsDTO(jobAdvertisement);
45 }
46
47 @Override
48 public JobAdDetailsDTO editJobAdvertisement(Long id, JobAdvertisementDTO jobAdvertisementDTO) {
49 JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Job Advertisement not found"));
50 jobAdvertisement.setTitle(jobAdvertisementDTO.getTitle());
51 jobAdvertisement.setDescription(jobAdvertisementDTO.getDescription());
52 jobAdvertisement.setIndustry(jobAdvertisementDTO.getIndustry());
53 jobAdvertisement.setStartingSalary(jobAdvertisementDTO.getStartingSalary());
54 jobAdvertisement.setActiveUntil(LocalDate.parse(jobAdvertisementDTO.getActiveUntil()));
55 jobAdvertisement.setActive(jobAdvertisement.isJobAdActive());
56 jobAdvertisement.setJobType(JobType.valueOf(jobAdvertisementDTO.getJobType()));
57 jobAdvertisement.setEmploymentStatus(EmploymentStatus.valueOf(jobAdvertisementDTO.getEmploymentStatus()));
58 jobAdvertisementRepository.save(jobAdvertisement);
59 return JobAdvertisement.mapToJobAdDetailsDTO(jobAdvertisement);
60 }
61
62 @Override
63 public void deleteJobAdvertisement(Long jobAdvertisementId) {
64 jobAdvertisementRepository.deleteById(jobAdvertisementId);
65 }
66
67 @Override
68 public List<JobAdDetailsDTO> findAllJobAdvertisements() {
69 List<JobAdvertisement> jobAdvertisementList = jobAdvertisementRepository.findAll();
70 jobAdvertisementList.forEach(jobAdvertisement -> {
71 if (!jobAdvertisement.isJobAdActive() && jobAdvertisement.isActive()) {
72 jobAdvertisement.setActive(false);
73 jobAdvertisementRepository.save(jobAdvertisement);
74 } else if (jobAdvertisement.isJobAdActive() && !jobAdvertisement.isActive()) {
75 jobAdvertisement.setActive(true);
76 jobAdvertisementRepository.save(jobAdvertisement);
77 }
78 });
79
80 return jobAdvertisementList.stream()
81 .map(JobAdvertisement::mapToJobAdDetailsDTO)
82 .toList();
83 }
84
85 @Override
86 public List<JobAdDetailsDTO> filterJobAdvertisements(JobAdFilterDTO jobAdFilterDTO) {
87 List<JobAdvertisement> filteredJobAds = jobAdvertisementRepository.findAll();
88 filteredJobAds = filter(filteredJobAds, jobAdFilterDTO);
89
90 return filteredJobAds.stream()
91 .map(JobAdvertisement::mapToJobAdDetailsDTO)
92 .toList();
93 }
94
95 private List<JobAdvertisement> filter(List<JobAdvertisement> filteredJobAdvertisements, JobAdFilterDTO jobAdFilterDTO) {
96 return filteredJobAdvertisements.stream()
97 .filter(jobAd -> jobAd.getTitle().toLowerCase().contains(jobAdFilterDTO.getSearchTerm().toLowerCase()))
98 .filter(jobAd -> jobAdFilterDTO.getIndustry().equals("all") || jobAd.getIndustry().equals(jobAdFilterDTO.getIndustry()))
99 .sorted(getComparator(jobAdFilterDTO.getSortOrder()))
100 .toList();
101 }
102
103 private Comparator<JobAdvertisement> getComparator(String sortOrder) {
104 return switch (sortOrder) {
105 case "date_newest" -> Comparator.comparing(JobAdvertisement::getPostedOn).reversed();
106 case "date_oldest" -> Comparator.comparing(JobAdvertisement::getPostedOn);
107 case "salary_highest" -> Comparator.comparing(JobAdvertisement::getStartingSalary).reversed();
108 case "salary_lowest" -> Comparator.comparing(JobAdvertisement::getStartingSalary);
109 default -> Comparator.comparing(JobAdvertisement::getPostedOn); // Default sorting order
110 };
111 }
112
113
114 @Override
115 public List<JobAdDetailsDTO> findAllJobAdvertisementsByRecruiterId(Long recruiterId) {
116 List<JobAdvertisement> jobAdvertisementList = jobAdvertisementRepository.findAllByRecruiterId(recruiterId);
117
118 return jobAdvertisementList.stream()
119 .map(JobAdvertisement::mapToJobAdDetailsDTO)
120 .toList();
121 }
122
123 @Override
124 public List<JobAdDetailsDTO> filterJobAdvertisementsByRecruiterId(Long recruiterId, JobAdFilterDTO jobAdFilterDTO) {
125 List<JobAdvertisement> filteredJobAds = jobAdvertisementRepository.findAllByRecruiterId(recruiterId);
126 filteredJobAds = filter(filteredJobAds, jobAdFilterDTO);
127 return filteredJobAds.stream()
128 .map(JobAdvertisement::mapToJobAdDetailsDTO)
129 .toList();
130 }
131
132 @Override
133 public JobAdDetailsDTO findJobAdvertisementById(Long id) {
134 JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(id).orElse(null);
135 return JobAdvertisement.mapToJobAdDetailsDTO(jobAdvertisement);
136 }
137}
Note: See TracBrowser for help on using the repository browser.