From dedc185275b9b78266d3172a4cd139875f2875a0 Mon Sep 17 00:00:00 2001 From: fatima ezzahra majidi <fatima-ezzahra.majidi.etu@univ-lille.fr> Date: Thu, 6 Mar 2025 14:56:44 +0000 Subject: [PATCH] =?UTF-8?q?Mise=20=C3=A0=20jour=20des=20PUT,POST,DELETE=20?= =?UTF-8?q?en=20fonction=20des=20relations=20entre=20les=20composants?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 ++ .../controllers/CandidacyController.java | 13 +++++++--- .../controllers/EnterpriseController.java | 18 +++++++++++++ .../controllers/StageController.java | 26 +++++++++++++++++++ .../controllers/StudentController.java | 26 ++++++++++++++++++- .../controllers/UnivSupervisorController.java | 23 ++++++++++++++++ .../gestionstagesbackend/model/Candidacy.java | 8 +++--- .../model/Enterprise.java | 4 ++- .../gestionstagesbackend/model/Stage.java | 7 +++-- .../repositories/StageRepository.java | 5 ++++ .../services/EnterpriseService.java | 2 +- .../services/StageService.java | 10 ++++++- .../services/StudentService.java | 8 ++++++ 13 files changed, 140 insertions(+), 12 deletions(-) diff --git a/pom.xml b/pom.xml index 8944b77..f676de0 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,8 @@ </dependency> + + </dependencies> <build> diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/CandidacyController.java b/src/main/java/com/example/gestionstagesbackend/controllers/CandidacyController.java index 9b9678e..807aacd 100644 --- a/src/main/java/com/example/gestionstagesbackend/controllers/CandidacyController.java +++ b/src/main/java/com/example/gestionstagesbackend/controllers/CandidacyController.java @@ -76,10 +76,17 @@ public class CandidacyController { @GetMapping("/{id}") public ResponseEntity<Candidacy> getCandidacyById(@PathVariable Long id) { - return candidacyService.getCandidacyById(id) - .map(ResponseEntity::ok) - .orElse(ResponseEntity.notFound().build()); + Optional<Candidacy> optionalCandidacy = candidacyService.getCandidacyById(id); + + if (optionalCandidacy.isPresent()) { + Candidacy candidacy = optionalCandidacy.get(); + candidacy.getStage().getId(); // Ensure Stage ID is included + return ResponseEntity.ok(candidacy); + } else { + return ResponseEntity.notFound().build(); + } } + @DeleteMapping("/{id}") public ResponseEntity<Void> deleteCandidacy(@PathVariable Long id) { if (!candidacyService.existsById(id)) { diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java b/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java index 689fb8b..4ac9c60 100644 --- a/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java +++ b/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java @@ -6,6 +6,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Optional; @RestController @RequestMapping("/api/enterprises") @@ -49,4 +50,21 @@ public class EnterpriseController { enterpriseService.deleteEnterprise(id); return ResponseEntity.noContent().build(); } + + @PutMapping("/{id}") + public ResponseEntity<?> updateEnterprise(@PathVariable Long id, @RequestBody Enterprise updatedEnterprise) { + Optional<Enterprise> optionalEnterprise = enterpriseService.getEnterpriseById(id); + + if (optionalEnterprise.isPresent()) { + Enterprise existingEnterprise = optionalEnterprise.get(); + existingEnterprise.setName(updatedEnterprise.getName()); + existingEnterprise.setAddress(updatedEnterprise.getAddress()); + + Enterprise savedEnterprise = enterpriseService.saveEnterprise(existingEnterprise); + return ResponseEntity.ok(savedEnterprise); + } else { + return ResponseEntity.notFound().build(); + } + } + } diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java b/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java index 97077d5..a3155a8 100644 --- a/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java +++ b/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java @@ -49,6 +49,20 @@ public class StageController { public ResponseEntity<List<Stage>> getAllStages() { return ResponseEntity.ok(stageService.getAllStages()); } + @GetMapping("/{id}") + public ResponseEntity<Stage> getStageById(@PathVariable Long id) { + Optional<Stage> optionalStage = stageService.getStageById(id); + + if (optionalStage.isPresent()) { + Stage stage = optionalStage.get(); + stage.getEnterprise().getId(); // Ensure Enterprise ID is included + return ResponseEntity.ok(stage); + } else { + return ResponseEntity.notFound().build(); + } + } + + @PutMapping("/{id}") public ResponseEntity<?> updateStage(@PathVariable Long id, @RequestBody Stage updatedStage) { Optional<Stage> optionalStage = stageService.getStageById(id); @@ -72,5 +86,17 @@ public class StageController { return ResponseEntity.notFound().build(); } } + @DeleteMapping("/{id}") + public ResponseEntity<?> deleteStage(@PathVariable Long id) { + Optional<Stage> optionalStage = stageService.getStageById(id); + + if (optionalStage.isPresent()) { + stageService.deleteStage(id); + return ResponseEntity.noContent().build(); // HTTP 204 No Content (successful deletion) + } else { + return ResponseEntity.notFound().build(); // HTTP 404 Not Found if the stage doesn't exist + } + } + } diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java b/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java index 5e34a73..f07a8ce 100644 --- a/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java +++ b/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java @@ -40,10 +40,34 @@ public class StudentController { .orElse(ResponseEntity.notFound().build()); } - // endpoint pour recherche de candidacy par student + // Endpoint to get all candidacies of a student @GetMapping("/{id}/candidacies") public ResponseEntity<List<Candidacy>> getStudentCandidacies(@PathVariable Long id) { List<Candidacy> candidacies = candidacyService.getCandidaciesByStudentId(id); return ResponseEntity.ok(candidacies); } + + // ✅ PUT - Update student by ID + @PutMapping("/{id}") + public ResponseEntity<Student> updateStudent(@PathVariable Long id, @RequestBody Student updatedStudent) { + Optional<Student> optionalStudent = studentService.getStudentById(id); + + if (optionalStudent.isPresent()) { + Student existingStudent = optionalStudent.get(); + existingStudent.setFirstname(updatedStudent.getFirstname()); + existingStudent.setLastname(updatedStudent.getLastname()); + + Student savedStudent = studentService.saveStudent(existingStudent); + return ResponseEntity.ok(savedStudent); + } else { + return ResponseEntity.notFound().build(); + } + } + + // ✅ DELETE - Remove student by ID + @DeleteMapping("/{id}") + public ResponseEntity<Void> deleteStudent(@PathVariable Long id) { + studentService.deleteStudent(id); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/UnivSupervisorController.java b/src/main/java/com/example/gestionstagesbackend/controllers/UnivSupervisorController.java index 51f19a6..186c6e0 100644 --- a/src/main/java/com/example/gestionstagesbackend/controllers/UnivSupervisorController.java +++ b/src/main/java/com/example/gestionstagesbackend/controllers/UnivSupervisorController.java @@ -35,4 +35,27 @@ public class UnivSupervisorController { .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); } + + // ✅ PUT - Update UnivSupervisor by ID + @PutMapping("/{id}") + public ResponseEntity<UnivSupervisor> updateUnivSupervisor(@PathVariable Long id, @RequestBody UnivSupervisor updatedSupervisor) { + Optional<UnivSupervisor> optionalSupervisor = univSupervisorService.getUnivSupervisorById(id); + + if (optionalSupervisor.isPresent()) { + UnivSupervisor existingSupervisor = optionalSupervisor.get(); + existingSupervisor.setName(updatedSupervisor.getName()); + + UnivSupervisor savedSupervisor = univSupervisorService.saveUnivSupervisor(existingSupervisor); + return ResponseEntity.ok(savedSupervisor); + } else { + return ResponseEntity.notFound().build(); + } + } + + // ✅ DELETE - Remove UnivSupervisor by ID + @DeleteMapping("/{id}") + public ResponseEntity<Void> deleteUnivSupervisor(@PathVariable Long id) { + univSupervisorService.deleteUnivSupervisor(id); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java b/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java index 69b9210..4bd2a55 100644 --- a/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java +++ b/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java @@ -16,9 +16,11 @@ public class Candidacy { private Student student; @ManyToOne - @JoinColumn(name = "stage_id") - @JsonBackReference - private Stage stage; // suppression de @JsonIgnoreProperties pour inclure Stage in response + @JoinColumn(name = "stage_id", nullable = false) + @JsonIgnoreProperties({"candidacies", "enterprise"}) // Ensures that Candidacy includes Stage but avoids loops + private Stage stage; + + // suppression de @JsonIgnoreProperties pour inclure Stage in response @ManyToOne @JoinColumn(name = "univ_supervisor_id") diff --git a/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java b/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java index 8734c6f..4f5f649 100644 --- a/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java +++ b/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java @@ -1,5 +1,6 @@ package com.example.gestionstagesbackend.model; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.persistence.*; import java.util.List; import com.fasterxml.jackson.annotation.JsonManagedReference; @@ -13,9 +14,10 @@ public class Enterprise { private String address; @OneToMany(mappedBy = "enterprise", cascade = CascadeType.ALL, fetch = FetchType.LAZY) - @JsonManagedReference // as the parent side + //@JsonManagedReference // Ensures that stages are included in Enterprise JSON responses private List<Stage> stages; + public Enterprise() {} public Enterprise(String name, String address) { diff --git a/src/main/java/com/example/gestionstagesbackend/model/Stage.java b/src/main/java/com/example/gestionstagesbackend/model/Stage.java index ce91ccb..6ee4573 100644 --- a/src/main/java/com/example/gestionstagesbackend/model/Stage.java +++ b/src/main/java/com/example/gestionstagesbackend/model/Stage.java @@ -1,6 +1,7 @@ package com.example.gestionstagesbackend.model; import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; import java.util.List; @@ -15,13 +16,15 @@ public class Stage { @ManyToOne @JoinColumn(name = "enterprise_id", nullable = false) - @JsonBackReference // Prevents infinite recursion in JSON serialization + @JsonIgnoreProperties({"stages"}) // Prevents infinite loops but keeps enterprise data in JSON private Enterprise enterprise; + @OneToMany(mappedBy = "stage", cascade = CascadeType.ALL, fetch = FetchType.LAZY) - @JsonManagedReference // ✅ Allows Candidacies to appear in Stage responses + //@JsonManagedReference private List<Candidacy> candidacies; + public Stage() {} public Stage(String name, String description, Enterprise enterprise) { diff --git a/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java b/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java index ee80a41..50f4357 100644 --- a/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java +++ b/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java @@ -3,6 +3,8 @@ package com.example.gestionstagesbackend.repositories; import com.example.gestionstagesbackend.model.Stage; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.util.Optional; @@ -12,4 +14,7 @@ public interface StageRepository extends JpaRepository<Stage, Long> { @EntityGraph(attributePaths = {"enterprise"}) // Ensures Enterprise is fetched Optional<Stage> findById(Long id); + @Query("SELECT s FROM Stage s LEFT JOIN FETCH s.enterprise WHERE s.id = :id") + Optional<Stage> findByIdWithEnterprise(@Param("id") Long id); + } diff --git a/src/main/java/com/example/gestionstagesbackend/services/EnterpriseService.java b/src/main/java/com/example/gestionstagesbackend/services/EnterpriseService.java index a71471c..ab586ba 100644 --- a/src/main/java/com/example/gestionstagesbackend/services/EnterpriseService.java +++ b/src/main/java/com/example/gestionstagesbackend/services/EnterpriseService.java @@ -16,7 +16,7 @@ public class EnterpriseService { } public Enterprise saveEnterprise(Enterprise enterprise) { - System.out.println("Saving enterprise: " + enterprise.getName() + ", " + enterprise.getAddress()); + //System.out.println("Saving enterprise: " + enterprise.getName() + ", " + enterprise.getAddress()); // If stages exist, set their enterprise reference correctly if (enterprise.getStages() != null && !enterprise.getStages().isEmpty()) { diff --git a/src/main/java/com/example/gestionstagesbackend/services/StageService.java b/src/main/java/com/example/gestionstagesbackend/services/StageService.java index 36d31ff..007eeeb 100644 --- a/src/main/java/com/example/gestionstagesbackend/services/StageService.java +++ b/src/main/java/com/example/gestionstagesbackend/services/StageService.java @@ -2,7 +2,9 @@ package com.example.gestionstagesbackend.services; import com.example.gestionstagesbackend.model.Stage; import com.example.gestionstagesbackend.repositories.StageRepository; +import org.hibernate.Hibernate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; @@ -24,6 +26,12 @@ public class StageService { } public Optional<Stage> getStageById(Long id) { - return stageRepository.findById(id); + return stageRepository.findByIdWithEnterprise(id); } + + + public void deleteStage(Long id) { + stageRepository.deleteById(id); + } + } diff --git a/src/main/java/com/example/gestionstagesbackend/services/StudentService.java b/src/main/java/com/example/gestionstagesbackend/services/StudentService.java index 6c81c69..2e13e2d 100644 --- a/src/main/java/com/example/gestionstagesbackend/services/StudentService.java +++ b/src/main/java/com/example/gestionstagesbackend/services/StudentService.java @@ -26,4 +26,12 @@ public class StudentService { public Optional<Student> getStudentById(Long id) { return studentRepository.findById(id); } + + public void deleteStudent(Long id) { + if (studentRepository.existsById(id)) { + studentRepository.deleteById(id); + } else { + throw new IllegalArgumentException("Student with ID " + id + " does not exist."); + } + } } -- GitLab