Changeset 08f82ec for jobvista-backend/src/main/java/mk/ukim/finki/predmeti
- Timestamp:
- 06/20/24 11:57:13 (5 months ago)
- Branches:
- main
- Children:
- 0f0add0
- Parents:
- befb988
- Location:
- jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend
- Files:
-
- 5 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/config/SecurityConfiguration.java
rbefb988 r08f82ec 31 31 http.csrf(AbstractHttpConfigurer::disable) 32 32 .authorizeHttpRequests(request -> request 33 // TO DO: FIX PERMISSIONS 34 .requestMatchers("/api/job-advertisements/**", 35 "/api/job-advertisements/view/**", 33 .requestMatchers( 34 "/api/auth/**", 35 "/api/job-advertisements/**", 36 "/api/applications/**", 36 37 "/api/recruiter/**", 37 "/api/job-seeker/**", 38 "/api/recruiter/{id}/info", 39 "/api/recruiter/{id}/edit-info", 40 "/api/job-advertisements/apply/**", 41 "/api/auth/**", 42 "/api/resume/**", 43 "/api/my-applications/**", 44 "/api/applications/{id}/update", 45 "/api/admin/**").permitAll() 46 // .requestMatchers("/api/recruiter").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 38 "/api/job-seeker/**" 39 ).permitAll() 40 .requestMatchers("/api/admin/**").hasAnyAuthority(Role.ROLE_ADMIN.name()) 41 .requestMatchers("/api/recruiter/{id}/edit-info").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 42 .requestMatchers("/api/recruiter/submit-logo").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 43 .requestMatchers("/api/job-seeker/{id}/edit-info").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 44 .requestMatchers("/api/job-seeker/submit-profile-pic").hasAnyAuthority(Role.ROLE_JOBSEEKER.name()) 45 .requestMatchers("/api/job-advertisements/add").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 46 .requestMatchers("/api/job-advertisements/edit/{id}").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 47 .requestMatchers("/api/job-advertisements/delete/{id}").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 48 .requestMatchers("/api/applications/{id}/update").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 49 .requestMatchers("/api/job-advertisements/{advertisement_id}/applications").hasAnyAuthority(Role.ROLE_RECRUITER.name()) 50 .requestMatchers("/api/applications/submit").hasAnyAuthority(Role.ROLE_JOBSEEKER.name()) 51 .requestMatchers("/api/my-applications/{id}").hasAnyAuthority(Role.ROLE_JOBSEEKER.name()) 47 52 .anyRequest().authenticated()) 48 53 .sessionManagement(manager -> manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) -
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/ApplicationController.java
rbefb988 r08f82ec 42 42 } 43 43 44 @GetMapping("/ resume/{fileName:.+}")45 public ResponseEntity<Resource> downloadResume(@PathVariable(" fileName") String fileName) {46 Resource resource = applicationService.loadResumeAsResource( fileName);44 @GetMapping("/applications/{id}/download-resume") 45 public ResponseEntity<Resource> downloadResume(@PathVariable("id") Long applicationId) { 46 Resource resource = applicationService.loadResumeAsResource(applicationId); 47 47 return ResponseEntity.ok() 48 48 .contentType(MediaType.APPLICATION_PDF) … … 51 51 } 52 52 53 @PostMapping("/ job-advertisements/apply")53 @PostMapping("/applications/submit") 54 54 public ResponseEntity<ApplicationDetailsDTO> submitApplication( 55 55 @RequestParam("jobSeekerId") Long jobSeekerId, … … 61 61 @RequestParam("messageToRecruiter") String messageToRecruiter) { 62 62 63 ApplicationDTO applicationDTO = new ApplicationDTO(jobSeekerId, jobAdId, resumeFile, answerOne, answerTwo, answerThree, messageToRecruiter); 63 ApplicationDTO applicationDTO = new ApplicationDTO(jobSeekerId, jobAdId, 64 resumeFile, answerOne, answerTwo, answerThree, messageToRecruiter); 64 65 ApplicationDetailsDTO applicationDetailsDTO = applicationService.submitApplication(applicationDTO); 65 66 return new ResponseEntity<>(applicationDetailsDTO, HttpStatus.OK); 66 67 } 67 68 68 } -
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/controllers/JobAdvertisementController.java
rbefb988 r08f82ec 46 46 47 47 @GetMapping("/recruiter/{id}") 48 public ResponseEntity<?> findA LlJobAdvertisementsByRecruiterId(@PathVariable Long id) {48 public ResponseEntity<?> findAllJobAdvertisementsByRecruiterId(@PathVariable Long id) { 49 49 List<JobAdDetailsDTO> jobAdDetailsDTOS = jobAdvertisementService.findAllJobAdvertisementsByRecruiterId(id); 50 50 return new ResponseEntity<>(jobAdDetailsDTOS, HttpStatus.OK); -
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/models/applications/Application.java
rbefb988 r08f82ec 32 32 private JobAdvertisement jobAdvertisement; 33 33 34 @Column(name = "resume_file_name", nullable = false)35 private String resumeFile Name;34 @Column(name = "resume_file_name", nullable = true) 35 private String resumeFilePath; 36 36 37 37 @ElementCollection … … 45 45 private ApplicationStatus status; 46 46 47 public Application(JobSeeker jobSeeker, JobAdvertisement jobAdvertisement, String resumeFileName,List<String> answers, String message) {47 public Application(JobSeeker jobSeeker, JobAdvertisement jobAdvertisement, List<String> answers, String message) { 48 48 this.jobSeeker = jobSeeker; 49 49 this.jobAdvertisement = jobAdvertisement; 50 this.resumeFile Name = resumeFileName;50 this.resumeFilePath = ""; 51 51 this.questionAnswers = answers; 52 52 this.message = message; … … 69 69 application.getJobAdvertisement().getTitle(), 70 70 application.getQuestionAnswers(), 71 application.getResumeFile Name(),71 application.getResumeFilePath(), 72 72 application.getMessage(), 73 73 application.getSubmittedOn(), -
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/ApplicationServiceImpl.java
rbefb988 r08f82ec 41 41 public ApplicationServiceImpl(@Value("${file.upload-dir}") String uploadDir, UserRepository userRepository, ApplicationRepository applicationRepository, JobAdvertisementRepository jobAdvertisementRepository, 42 42 JobSeekerRepository jobSeekerRepository) { 43 this.fileStorageLocation = Paths.get(uploadDir ).toAbsolutePath().normalize();43 this.fileStorageLocation = Paths.get(uploadDir + "/applications").toAbsolutePath().normalize(); 44 44 45 45 try { … … 58 58 public ApplicationDetailsDTO submitApplication(ApplicationDTO applicationDTO) { 59 59 60 JobSeeker jobSeeker = jobSeekerRepository.findById(applicationDTO.getJobSeekerId()) 61 .orElseThrow(() -> new IllegalArgumentException("User not found.")); 62 JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(applicationDTO.getJobAdId()) 63 .orElseThrow(() -> new IllegalArgumentException("Job advertisement not found.")); 64 60 65 if (applicationDTO.getResumeFile().isEmpty()) { 61 66 throw new RuntimeException("Failed to store empty file."); 62 67 } 63 64 Path targetLocation = this.fileStorageLocation.resolve(applicationDTO.getResumeFile().getOriginalFilename());65 try {66 Files.copy(applicationDTO.getResumeFile().getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);67 } catch (IOException e) {68 throw new RuntimeException(e);69 }70 71 JobSeeker jobSeeker = jobSeekerRepository.findById(applicationDTO.getJobSeekerId()).orElseThrow(() -> new IllegalArgumentException("User not found"));72 JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(applicationDTO.getJobAdId()).orElseThrow(() -> new IllegalArgumentException("Job Ad not found"));73 68 74 69 List<String> answers = new ArrayList<>(); … … 77 72 answers.add(applicationDTO.getAnswerThree()); 78 73 79 Application application = new Application(jobSeeker, jobAdvertisement, applicationDTO.getResumeFile().getOriginalFilename(), answers, applicationDTO.getMessageToRecruiter()); 80 applicationRepository.save(application); 74 Application application = new Application(jobSeeker, jobAdvertisement, 75 answers,applicationDTO.getMessageToRecruiter()); 76 application = applicationRepository.save(application); 77 78 Path filePath = this.fileStorageLocation.resolve(String.valueOf(application.getId())).resolve("resume"); 79 Path targetLocation = filePath.resolve(applicationDTO.getResumeFile().getOriginalFilename()); 80 81 try { 82 Files.createDirectories(filePath); 83 Files.copy(applicationDTO.getResumeFile().getInputStream(), targetLocation); 84 } catch (IOException e) { 85 throw new RuntimeException(e); 86 } 87 88 String relativePath = Paths.get("uploads","applications",String.valueOf(application.getId()), 89 "resume", applicationDTO.getResumeFile().getOriginalFilename()).toString(); 90 application.setResumeFilePath(relativePath); 91 application = applicationRepository.save(application); 92 81 93 return Application.mapToApplicationDetailsDTO(application); 82 94 } … … 95 107 96 108 @Override 97 public Resource loadResumeAsResource(String fileName) { 109 public Resource loadResumeAsResource(Long applicationId) { 110 Application application = applicationRepository.findById(applicationId). 111 orElseThrow(() -> new IllegalArgumentException("Application not found")); 112 113 String relativeFilePath = application.getResumeFilePath(); 114 Path filePath = fileStorageLocation.getParent().getParent().resolve(relativeFilePath).normalize(); 115 98 116 try { 99 Path filePath = fileStorageLocation.resolve(fileName).normalize();100 117 Resource resource = new UrlResource(filePath.toUri()); 101 118 if (resource.exists()) { 102 119 return resource; 103 120 } else { 104 throw new RuntimeException("File not found " + fileName);121 throw new RuntimeException("File not found: " + relativeFilePath); 105 122 } 106 123 } catch (IOException ex) { 107 throw new RuntimeException("File not found " + fileName, ex);124 throw new RuntimeException("File path is invalid: " + relativeFilePath, ex); 108 125 } 109 126 } -
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/JobAdvertisementServiceImpl.java
rbefb988 r08f82ec 17 17 18 18 import java.time.LocalDate; 19 import java.time.LocalDateTime;20 19 import java.util.Comparator; 21 20 import java.util.List; … … 24 23 @RequiredArgsConstructor 25 24 public class JobAdvertisementServiceImpl implements JobAdvertisementService { 26 private final UserRepository userRepository;27 25 private final JobAdvertisementRepository jobAdvertisementRepository; 28 26 private final RecruiterRepository recruiterRepository; … … 30 28 @Override 31 29 public JobAdDetailsDTO addJobAdvertisement(JobAdvertisementDTO jobAdvertisementDTO) { 32 Recruiter recruiter = recruiterRepository.findById(jobAdvertisementDTO.getId()).orElseThrow(() -> new IllegalArgumentException("User not found")); 30 Recruiter recruiter = recruiterRepository.findById(jobAdvertisementDTO.getId()) 31 .orElseThrow(() -> new IllegalArgumentException("User not found")); 33 32 JobAdvertisement jobAdvertisement = new JobAdvertisement( 34 33 recruiter, … … 47 46 @Override 48 47 public JobAdDetailsDTO editJobAdvertisement(Long id, JobAdvertisementDTO jobAdvertisementDTO) { 49 JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Job Advertisement not found")); 48 JobAdvertisement jobAdvertisement = jobAdvertisementRepository.findById(id) 49 .orElseThrow(() -> new IllegalArgumentException("Job Advertisement not found")); 50 50 jobAdvertisement.setTitle(jobAdvertisementDTO.getTitle()); 51 51 jobAdvertisement.setDescription(jobAdvertisementDTO.getDescription()); -
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/impl/RecruiterServiceImpl.java
rbefb988 r08f82ec 32 32 this.recruiterRepository = recruiterRepository; 33 33 34 this.logoStorageLocation = Paths.get(uploadDir + "/ logo").toAbsolutePath().normalize();34 this.logoStorageLocation = Paths.get(uploadDir + "/recruiters").toAbsolutePath().normalize(); 35 35 try { 36 36 Files.createDirectories(this.logoStorageLocation); … … 70 70 public void submitLogo(Long recruiterId, MultipartFile logoFile) { 71 71 72 Path recruiterLogoDir = this.logoStorageLocation.resolve(String.valueOf(recruiterId)) ;72 Path recruiterLogoDir = this.logoStorageLocation.resolve(String.valueOf(recruiterId)).resolve("logos"); 73 73 try { 74 74 Files.createDirectories(recruiterLogoDir); … … 82 82 Recruiter recruiter = recruiterRepository.findById(recruiterId) 83 83 .orElseThrow(() -> new RuntimeException("Recruiter not found")); 84 String relativePath = Paths.get("uploads", "logo", String.valueOf(recruiterId), originalFilename).toString();84 String relativePath = Paths.get("uploads","recruiters", String.valueOf(recruiterId), "logos", originalFilename).toString(); 85 85 recruiter.setLogoFilePath(relativePath); 86 86 recruiterRepository.save(recruiter); -
jobvista-backend/src/main/java/mk/ukim/finki/predmeti/internettehnologii/jobvistabackend/service/intef/ApplicationService.java
rbefb988 r08f82ec 14 14 List<ApplicationDetailsDTO> findAllByJobAdvertisementId(Long jobId); 15 15 List<ApplicationDetailsDTO> findAllByJobSeekerId(Long jobSeekerId); 16 Resource loadResumeAsResource( String fileName);16 Resource loadResumeAsResource(Long applicationId); 17 17 ApplicationStatusDTO updateApplicationStatus(Long id, String status); 18 18 }
Note:
See TracChangeset
for help on using the changeset viewer.