From 8d4dc7916d0b99a5a9b7a660d5867fb80f888c57 Mon Sep 17 00:00:00 2001 From: Pierre Tellier Date: Wed, 26 Feb 2025 15:31:02 +0100 Subject: [PATCH] feat: added most of shared API calls --- .../myinpulse/controller/SharedApi.java | 4 +- .../enseirb/myinpulse/model/Entrepreneur.java | 4 + .../java/enseirb/myinpulse/model/Project.java | 4 + .../repository/AdministratorRepository.java | 2 + .../repository/EntrepreneurRepository.java | 3 + .../myinpulse/service/AdminApiService.java | 4 +- .../myinpulse/service/SharedApiService.java | 78 ++++++++++++++++++- .../database/AdministratorService.java | 6 ++ .../service/database/EntrepreneurService.java | 32 ++++---- .../service/database/UserService.java | 5 +- 10 files changed, 117 insertions(+), 25 deletions(-) diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/controller/SharedApi.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/controller/SharedApi.java index 4424c10..883cc9f 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/controller/SharedApi.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/controller/SharedApi.java @@ -54,10 +54,10 @@ public class SharedApi { /** * Endpoint used to get the administrator of a project. * - * @return a list of all project managed by the current admin user + * @return the admin of a project */ @GetMapping("/shared/projects/admin/{projectId}") - public Iterable getAdminByProjectId( + public Administrator getAdminByProjectId( @PathVariable int projectId, @AuthenticationPrincipal Jwt principal) { return sharedApiService.getAdminByProjectId(projectId, principal.getClaimAsString("email")); } diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java index 3773cea..d85c99d 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Entrepreneur.java @@ -75,4 +75,8 @@ public class Entrepreneur extends User { public void setSneeStatus(boolean statusSnee) { this.sneeStatus = sneeStatus; } + + public Project getProjectParticipation() { + return projectParticipation; + } } diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Project.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Project.java index 96dcbb4..070efc6 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Project.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/Project.java @@ -93,6 +93,10 @@ public class Project { this.projectStatus = projectStatus; } + public Administrator getAdministrator() { + return this.projectAdministrator; + } + public void setAdministrator(Administrator administrator) { this.projectAdministrator = administrator; } diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/AdministratorRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/AdministratorRepository.java index 34431fd..c9f3e50 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/AdministratorRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/AdministratorRepository.java @@ -8,6 +8,8 @@ import org.springframework.data.rest.core.annotation.RepositoryRestResource; @RepositoryRestResource public interface AdministratorRepository extends JpaRepository { + //public Administrator findByListProjectIsContaining(Project project); + /* @Query("SELECT a from Administrators a") Administrator findAllAdministrator(); */ diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/EntrepreneurRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/EntrepreneurRepository.java index eee1020..15a2222 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/EntrepreneurRepository.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/EntrepreneurRepository.java @@ -1,6 +1,7 @@ package enseirb.myinpulse.repository; import enseirb.myinpulse.model.Entrepreneur; +import enseirb.myinpulse.model.Project; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; @@ -8,6 +9,8 @@ import org.springframework.data.rest.core.annotation.RepositoryRestResource; @RepositoryRestResource public interface EntrepreneurRepository extends JpaRepository { + Iterable getEntrepreneurByProjectParticipation(Project project); + /* @Query("SELECT e from Entrepreneur e") Entrepreneur findAllEntrepreneurl(); */ diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java index 6d5806b..400c2b6 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/AdminApiService.java @@ -31,7 +31,7 @@ public class AdminApiService { public Iterable getProjectsOfAdmin(String email) { return projectService.getProjectsByAdminId( administratorService.getAdministratorById( - this.userService.getIdUserByEmail(email))); + this.userService.getUserByEmail(email).getIdUser())); } // TODO @@ -57,7 +57,7 @@ public class AdminApiService { // TODO: solve todo + test public void addNewProject(Project project) { - projectService.addNewProject(project); // TODO: how can the user know the ID ? + projectService.addNewProject(project); // TODO: how can the front know the ID ? } // TODO diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java index ea45245..e104cdd 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java @@ -1,7 +1,14 @@ package enseirb.myinpulse.service; import enseirb.myinpulse.model.*; +import enseirb.myinpulse.service.database.AdministratorService; +import enseirb.myinpulse.service.database.EntrepreneurService; +import enseirb.myinpulse.service.database.ProjectService; +import enseirb.myinpulse.service.database.UserService; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; @@ -9,17 +16,80 @@ import org.springframework.web.server.ResponseStatusException; @Service public class SharedApiService { + protected static final Logger logger = LogManager.getLogger(); + + private final AdministratorService administratorService; + private final UserService userService; + private final ProjectService projectService; + private final EntrepreneurService entrepreneurService; + + @Autowired + SharedApiService( + AdministratorService administratorService, + UserService userService, + ProjectService projectService, + EntrepreneurService entrepreneurService) { + this.administratorService = administratorService; + this.userService = userService; + this.projectService = projectService; + this.entrepreneurService = entrepreneurService; + } + + // TODO: test + Boolean isAnAdmin(String mail) { + try { + long userId = this.userService.getUserByEmail(mail).getIdUser(); + Administrator a = this.administratorService.getAdministratorById(userId); + return true; + } catch (ResponseStatusException e) { + logger.info(e); + return false; + } + } + + // TODO: test + Boolean isAllowedToCheckProject(String mail, long projectId) { + if (isAnAdmin(mail)) { + return true; + } + User user = this.userService.getUserByEmail(mail); + Entrepreneur entrepreneur = this.entrepreneurService.getEntrepreneurById(user.getIdUser()); + Project project = this.projectService.getProjectById(projectId); + return entrepreneur.getProjectParticipation() == project; + } + + // TODO public Iterable getLCSection( String projectId, String title, String date, String mail) { throw new ResponseStatusException(HttpStatus.NOT_IMPLEMENTED, "Not implemented yet"); } - public Iterable getEntrepreneursByProjectId(int projectId, String mail) { - throw new ResponseStatusException(HttpStatus.NOT_IMPLEMENTED, "Not implemented yet"); + // TODO: test, protect via email + public Iterable getEntrepreneursByProjectId(long projectId, String mail) { + if (!isAllowedToCheckProject(mail, projectId)) { + logger.warn( + "User {} tried to check the member of the project {} but is not allowed to.", + mail, + projectId); + throw new ResponseStatusException( + HttpStatus.UNAUTHORIZED, "You're not allowed to check this project"); + } + Project project = this.projectService.getProjectById(projectId); + return this.entrepreneurService.GetEntrepreneurByProject(project); } - public Iterable getAdminByProjectId(int projectId, String mail) { - throw new ResponseStatusException(HttpStatus.NOT_IMPLEMENTED, "Not implemented yet"); + // TODO: test, protect via email + public Administrator getAdminByProjectId(long projectId, String mail) { + if (!isAllowedToCheckProject(mail, projectId)) { + logger.warn( + "User {} tried to check the admin of the project {} but is not allowed to.", + mail, + projectId); + throw new ResponseStatusException( + HttpStatus.UNAUTHORIZED, "You're not allowed to check this project"); + } + Project project = this.projectService.getProjectById(projectId); + return project.getAdministrator(); } public Iterable getAppointmentsByProjectId(int projectId, String mail) { diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/AdministratorService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/AdministratorService.java index 645e00d..0f595a0 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/AdministratorService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/AdministratorService.java @@ -40,4 +40,10 @@ public class AdministratorService { public Administrator addAdministrator(Administrator administrator) { return this.administratorRepository.save(administrator); } + + /* + public Administrator getAdministratorByProject(Project project) { + r + } + */ } diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/EntrepreneurService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/EntrepreneurService.java index 3e72159..6e85920 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/EntrepreneurService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/EntrepreneurService.java @@ -1,28 +1,30 @@ -package enseirb.myinpulse.service.database.old_controllers_to_convert_to_services; +package enseirb.myinpulse.service.database; import enseirb.myinpulse.model.Entrepreneur; +import enseirb.myinpulse.model.Project; import enseirb.myinpulse.repository.EntrepreneurRepository; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.*; import org.springframework.web.server.ResponseStatusException; import java.util.Optional; -@RestController -public class EntrepreneurController { +@Service +public class EntrepreneurService { - @Autowired EntrepreneurRepository entrepreneurRepository; + private final EntrepreneurRepository entrepreneurRepository; - @GetMapping("/Entrepreneur") - @ResponseBody - public Iterable allEntrepreneurs() { + EntrepreneurService(EntrepreneurRepository entrepreneurRepository) { + this.entrepreneurRepository = entrepreneurRepository; + } + + public Iterable getAllEntrepreneurs() { return this.entrepreneurRepository.findAll(); } - @GetMapping("/Entrepreneur/{id}") - public Entrepreneur getEntrepreneurById(@PathVariable Long id) { + public Entrepreneur getEntrepreneurById(Long id) { Optional entrepreneur = entrepreneurRepository.findById(id); if (entrepreneur.isEmpty()) { throw new ResponseStatusException( @@ -31,14 +33,12 @@ public class EntrepreneurController { return entrepreneur.get(); } - @PostMapping("/Entrepreneur") - public Entrepreneur addEntrepreneur(@RequestBody Entrepreneur entrepreneur) { + public Entrepreneur addEntrepreneur(Entrepreneur entrepreneur) { return this.entrepreneurRepository.save(entrepreneur); } - @PostMapping("/Entrepreneur/{id}") public Entrepreneur updateEntrepreneur( - @PathVariable Long id, String school, String course, Boolean sneeStatus) { + Long id, String school, String course, Boolean sneeStatus) { Optional entrepreneur = entrepreneurRepository.findById(id); if (entrepreneur.isEmpty()) { throw new ResponseStatusException( @@ -55,4 +55,8 @@ public class EntrepreneurController { } return this.entrepreneurRepository.save(entrepreneur.get()); } + + public Iterable GetEntrepreneurByProject(Project project) { + return this.entrepreneurRepository.getEntrepreneurByProjectParticipation(project); + } } diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/UserService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/UserService.java index 6c3f33f..ab2361d 100644 --- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/UserService.java +++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/UserService.java @@ -26,15 +26,14 @@ public class UserService { } // TODO - public long getIdUserByEmail(String email) { + public User getUserByEmail(String email) { Optional opt_user = this.userRepository.findByPrimaryMail(email); if (opt_user.isEmpty()) { System.err.println("Couldn't find user with email " + email); throw new ResponseStatusException(HttpStatus.NOT_FOUND); } - User user = opt_user.get(); - return user.getIdUser(); + return opt_user.get(); } public Iterable allUsers() {