diff --git a/backend/src/main/java/app/linkedout/backend_v2/controllers/FileController.java b/backend/src/main/java/app/linkedout/backend_v2/controllers/FileController.java new file mode 100644 index 0000000..0bbc55a --- /dev/null +++ b/backend/src/main/java/app/linkedout/backend_v2/controllers/FileController.java @@ -0,0 +1,37 @@ +package app.linkedout.backend_v2.controllers; + +import app.linkedout.backend_v2.models.File; +import app.linkedout.backend_v2.services.FileService; +import app.linkedout.backend_v2.services.SessionService; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping(path = "api/v1/files") +public class FileController { + + private final FileService fileService ; + private final SessionService sessionService; + public FileController(FileService fileService, SessionService sessionService) { + this.fileService = fileService; + this.sessionService = sessionService; + } + + @GetMapping("/{user_ID}/{content_type}") + public List getFileByUserIdAndType(@PathVariable("user_ID") Integer user_ID, @PathVariable("content_type") String contentType) throws Exception { + return fileService.getFilesByUserIdAndType(user_ID, contentType); + } + + @PostMapping + public void insertFile(@RequestBody File file) throws Exception { + int user_id = sessionService.getCurrentUserId(); + fileService.insertFile(file, user_id); + } + + @PutMapping() + public void updateFile(@RequestBody File file) + { + fileService.updateFile(file); + } +} \ No newline at end of file diff --git a/backend/src/main/java/app/linkedout/backend_v2/controllers/JobPostController.java b/backend/src/main/java/app/linkedout/backend_v2/controllers/JobPostController.java index 7b7e61b..eb84896 100644 --- a/backend/src/main/java/app/linkedout/backend_v2/controllers/JobPostController.java +++ b/backend/src/main/java/app/linkedout/backend_v2/controllers/JobPostController.java @@ -2,9 +2,15 @@ import app.linkedout.backend_v2.models.JobPost; import app.linkedout.backend_v2.models.JobPostAndCompany; +import app.linkedout.backend_v2.models.Person; import app.linkedout.backend_v2.services.JobPostService; import org.springframework.web.bind.annotation.*; +import java.sql.Date; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; @@ -45,7 +51,15 @@ public List getFilteredJobPosts(@RequestBody Map getAppliedJobs(@PathVariable("user_ID") Integer u public void applyForJob(@PathVariable("user_ID") Integer user_ID,@PathVariable("post_ID") Integer post_ID) { jobPostService.apply(user_ID, post_ID); } + + @GetMapping("/applicants/{post_ID}") + public List getApplicantsOfPost(@PathVariable("post_ID") Integer post_ID) { + return jobPostService.getApplicantsOfPost(post_ID); + } } diff --git a/backend/src/main/java/app/linkedout/backend_v2/dao/FileDao.java b/backend/src/main/java/app/linkedout/backend_v2/dao/FileDao.java new file mode 100644 index 0000000..bdc6402 --- /dev/null +++ b/backend/src/main/java/app/linkedout/backend_v2/dao/FileDao.java @@ -0,0 +1,11 @@ +package app.linkedout.backend_v2.dao; + +import app.linkedout.backend_v2.models.File; + +import java.util.List; + +public interface FileDao { + List getFilesByUserIdAndType(int user_id, String content_type); + int insertFile(File file, int user_id); + int updateFile(File file); +} \ No newline at end of file diff --git a/backend/src/main/java/app/linkedout/backend_v2/dao/JobPostDao.java b/backend/src/main/java/app/linkedout/backend_v2/dao/JobPostDao.java index ecb2daf..11c399e 100644 --- a/backend/src/main/java/app/linkedout/backend_v2/dao/JobPostDao.java +++ b/backend/src/main/java/app/linkedout/backend_v2/dao/JobPostDao.java @@ -2,7 +2,9 @@ import app.linkedout.backend_v2.models.JobPost; import app.linkedout.backend_v2.models.JobPostAndCompany; +import app.linkedout.backend_v2.models.Person; +import java.sql.Date; import java.util.List; import java.util.Optional; @@ -11,7 +13,8 @@ public interface JobPostDao { int insertJobPost(JobPost jobPost); int deleteJobPost(int id); Optional getJobPostDetails(int id); - List filterJobs(String content, String job_title, String position, String workplace, String location); + List filterJobs(String content, String job_title, String position, String workplace, String location, Date start_date, Date end_date); List getAppliedJobs(int id); int apply(int user_id, int post_id); + List getApplicantsOfPost(int post_id); } diff --git a/backend/src/main/java/app/linkedout/backend_v2/models/File.java b/backend/src/main/java/app/linkedout/backend_v2/models/File.java new file mode 100644 index 0000000..842b45d --- /dev/null +++ b/backend/src/main/java/app/linkedout/backend_v2/models/File.java @@ -0,0 +1,7 @@ +package app.linkedout.backend_v2.models; + +import java.sql.Date; + +public record File (Integer file_id, Integer user_id, String content, String fileName, String fileType, Date uploadTime, String contentType) { + +} diff --git a/backend/src/main/java/app/linkedout/backend_v2/repositories/FileRepository.java b/backend/src/main/java/app/linkedout/backend_v2/repositories/FileRepository.java new file mode 100644 index 0000000..0a3ec41 --- /dev/null +++ b/backend/src/main/java/app/linkedout/backend_v2/repositories/FileRepository.java @@ -0,0 +1,60 @@ +package app.linkedout.backend_v2.repositories; + +import app.linkedout.backend_v2.dao.ExperienceDao; +import app.linkedout.backend_v2.dao.FileDao; +import app.linkedout.backend_v2.models.Company; +import app.linkedout.backend_v2.models.Experience; +import app.linkedout.backend_v2.models.ExperienceAndCompany; +import app.linkedout.backend_v2.models.File; +import app.linkedout.backend_v2.repositories.rowMappers.CompanyRowMapper; +import app.linkedout.backend_v2.repositories.rowMappers.ExperienceAndCompanyRowMapper; +import app.linkedout.backend_v2.repositories.rowMappers.ExperienceRowMapper; +import app.linkedout.backend_v2.repositories.rowMappers.FileRowMapper; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public class FileRepository implements FileDao { + + private final JdbcTemplate jdbcTemplate; + + public FileRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public List getFilesByUserIdAndType(int user_id, String content_type) { + var sql = """ + SELECT * + FROM File + WHERE user_id = ? AND contentType = ? + """; + return jdbcTemplate.query(sql, new FileRowMapper(), user_id, content_type); + } + + @Override + public int insertFile(File file, int user_id) { + var sql = """ + INSERT INTO File (file_id, user_id, content, fileName, fileType, uploadTime, contentType) + VALUES (?, ?, ?, ?, ?, ?, ?); + """; + return jdbcTemplate.update(sql, file.file_id(), user_id, file.content(), file.fileName(), file.fileType(), file.uploadTime(), file.contentType()); + + } + + @Override + public int updateFile(File file) + { + var sql = """ + UPDATE File + SET file_id = ?, content = ?, fileName = ?, fileType = ?, uploadTime = ?, contentType = ? + WHERE user_id = ? AND content_type = ?; + """; + return jdbcTemplate.update(sql, file.file_id(), file.content(), file.fileName(), file.fileType(), file.uploadTime(), file.contentType(), file.user_id(), file.contentType()); + } + +} diff --git a/backend/src/main/java/app/linkedout/backend_v2/repositories/JobPostRepository.java b/backend/src/main/java/app/linkedout/backend_v2/repositories/JobPostRepository.java index cf57f6d..10a3e14 100644 --- a/backend/src/main/java/app/linkedout/backend_v2/repositories/JobPostRepository.java +++ b/backend/src/main/java/app/linkedout/backend_v2/repositories/JobPostRepository.java @@ -3,14 +3,17 @@ import app.linkedout.backend_v2.dao.JobPostDao; import app.linkedout.backend_v2.models.JobPost; import app.linkedout.backend_v2.models.JobPostAndCompany; +import app.linkedout.backend_v2.models.Person; import app.linkedout.backend_v2.repositories.rowMappers.JobPostAndCompanyRowMapper; import app.linkedout.backend_v2.repositories.rowMappers.JobPostRowMapper; +import app.linkedout.backend_v2.repositories.rowMappers.PersonRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.SqlParameterValue; import org.springframework.stereotype.Repository; import java.sql.Types; +import java.sql.Date; import java.util.List; import java.util.Optional; @@ -69,19 +72,20 @@ public Optional getJobPostDetails(int id) { } @Override - public List filterJobs(String content, String job_title, String position, String workplace, String location) { + public List filterJobs(String content, String job_title, String position, String workplace, String location, Date start_date, Date end_date) { var sql = """ SELECT * FROM JobPost AS jp JOIN Company AS c ON jp.company_ID = c.company_ID - WHERE (content LIKE CONCAT('%', ?, '%') OR job_title LIKE CONCAT('%', ?, '%') OR name LIKE CONCAT('%', ?, '%')) AND position LIKE CONCAT('%', ?, '%') AND workplace LIKE CONCAT('%', ?, '%') AND location LIKE CONCAT('%', ?, '%') AND date > CURRENT_DATE; + WHERE (content LIKE CONCAT('%', ?, '%') OR job_title LIKE CONCAT('%', ?, '%') OR name LIKE CONCAT('%', ?, '%')) AND position LIKE CONCAT('%', ?, '%') AND workplace LIKE CONCAT('%', ?, '%') AND location LIKE CONCAT('%', ?, '%') AND (date BETWEEN ? AND ?); """; - //return jdbcTemplate.query(sql, new JobPostAndCompanyRowMapper(), content, job_title, content, position, workplace, location); return jdbcTemplate.query(sql, new JobPostAndCompanyRowMapper(), new SqlParameterValue(Types.VARCHAR, content), new SqlParameterValue(Types.VARCHAR, job_title), new SqlParameterValue(Types.VARCHAR, content), new SqlParameterValue(Types.VARCHAR, position), new SqlParameterValue(Types.VARCHAR, workplace), - new SqlParameterValue(Types.VARCHAR, location)); + new SqlParameterValue(Types.VARCHAR, location), + new SqlParameterValue(Types.DATE, start_date), + new SqlParameterValue(Types.DATE, end_date)); } @Override @@ -102,4 +106,14 @@ INSERT INTO Applies (user_ID, post_ID) """; return jdbcTemplate.update(sql, user_id, post_id); } + + @Override + public List getApplicantsOfPost(int post_id) { + var sql = """ + SELECT * + FROM Person + WHERE id IN (SELECT user_ID FROM Applies WHERE post_ID = ?) + """; + return jdbcTemplate.query(sql, new PersonRowMapper(), post_id); + } } diff --git a/backend/src/main/java/app/linkedout/backend_v2/repositories/rowMappers/FileRowMapper.java b/backend/src/main/java/app/linkedout/backend_v2/repositories/rowMappers/FileRowMapper.java new file mode 100644 index 0000000..024b148 --- /dev/null +++ b/backend/src/main/java/app/linkedout/backend_v2/repositories/rowMappers/FileRowMapper.java @@ -0,0 +1,23 @@ +package app.linkedout.backend_v2.repositories.rowMappers; + +import app.linkedout.backend_v2.models.File; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class FileRowMapper implements RowMapper { + @Override + public File mapRow(ResultSet rs, int rowNum) throws SQLException { + return new File( + rs.getInt("file_id"), + rs.getInt("user_id"), + rs.getString("content"), + rs.getString("fileName"), + rs.getString("fileType"), + rs.getDate("uploadTime"), + rs.getString("contentType") + ); + } +} diff --git a/backend/src/main/java/app/linkedout/backend_v2/services/FileService.java b/backend/src/main/java/app/linkedout/backend_v2/services/FileService.java new file mode 100644 index 0000000..0efe7ee --- /dev/null +++ b/backend/src/main/java/app/linkedout/backend_v2/services/FileService.java @@ -0,0 +1,29 @@ +package app.linkedout.backend_v2.services; + +import app.linkedout.backend_v2.dao.FileDao; +import app.linkedout.backend_v2.dao.InterestDao; +import app.linkedout.backend_v2.models.File; +import app.linkedout.backend_v2.models.Interest; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class FileService { + private final FileDao fileDao; + + public FileService(FileDao fileDao) { + this.fileDao = fileDao; + } + + public List getFilesByUserIdAndType(int user_id, String content_type) { + return fileDao.getFilesByUserIdAndType(user_id, content_type); + } + public int insertFile(File file, int user_id) { + return fileDao.insertFile(file, user_id); + } + public int updateFile(File file) + { + return fileDao.updateFile(file); + } +} diff --git a/backend/src/main/java/app/linkedout/backend_v2/services/JobPostService.java b/backend/src/main/java/app/linkedout/backend_v2/services/JobPostService.java index facf0ed..16f9686 100644 --- a/backend/src/main/java/app/linkedout/backend_v2/services/JobPostService.java +++ b/backend/src/main/java/app/linkedout/backend_v2/services/JobPostService.java @@ -4,8 +4,10 @@ import app.linkedout.backend_v2.models.CareerExpert; import app.linkedout.backend_v2.models.JobPost; import app.linkedout.backend_v2.models.JobPostAndCompany; +import app.linkedout.backend_v2.models.Person; import org.springframework.stereotype.Service; +import java.sql.Date; import java.util.List; import javax.el.PropertyNotFoundException; @@ -35,8 +37,8 @@ public JobPostAndCompany getJobPostDetails(int id) { return jobPostDao.getJobPostDetails(id).orElseThrow(PropertyNotFoundException::new); } - public List filterJobPosts(String content, String job_title, String position, String workplace, String location) { - return jobPostDao.filterJobs(content, job_title, position, workplace, location); + public List filterJobPosts(String content, String job_title, String position, String workplace, String location, Date start_date, Date end_date) { + return jobPostDao.filterJobs(content, job_title, position, workplace, location, start_date, end_date); } public void apply(int user_id, int post_id) { @@ -47,4 +49,7 @@ public List getAppliedJobs(int id) { return jobPostDao.getAppliedJobs(id); } + public List getApplicantsOfPost(int post_id) { + return jobPostDao.getApplicantsOfPost(post_id); + } } diff --git a/backend/src/main/resources/db/migration/R__Jobposts.sql b/backend/src/main/resources/db/migration/R__Jobposts.sql index e565e0b..f49797b 100644 --- a/backend/src/main/resources/db/migration/R__Jobposts.sql +++ b/backend/src/main/resources/db/migration/R__Jobposts.sql @@ -7,6 +7,19 @@ CREATE TABLE IF NOT EXISTS Company ( company_picture bytea, PRIMARY KEY (company_ID) ); + +CREATE TABLE IF NOT EXISTS File ( + file_ID BIGSERIAL NOT NULL, + user_ID BIGSERIAL NOT NULL, + content VARCHAR, + fileName VARCHAR, + fileType VARCHAR, + uploadTime DATE, + contentType VARCHAR, + PRIMARY KEY (file_ID), + FOREIGN KEY (user_ID) REFERENCES Person(id) +); + CREATE TABLE IF NOT EXISTS Experience ( exp_ID BIGSERIAL NOT NULL, user_ID BIGSERIAL NOT NULL,