diff --git a/pom.xml b/pom.xml index 8944b776b5546425b0572f64588f169e57d9cdc9..f676de058c4adbbe3345246460cf29092b4bf0bb 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 9b9678eb3a74dc4fcc5187caa6945e20b8369fdb..807aacdd223e0d0bebbb654e4a9da7242de93233 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 689fb8bfc41de99f8b0a727155a21de23a8d795a..4ac9c60f30f4b742c52167c60afef09bb3177092 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 97077d55be7352937eed785f1c3138b60fdc7218..a3155a8629c3c5589d28369737bf0c740118e015 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 5e34a73754082926d6ae24d2a87a2c0dea00709b..f07a8ce0fc206eea0981b8ea953d8bcf39a51276 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 51f19a62bc4e0da2623fea5d13b23e9711cba612..186c6e071ba0027787e0641c172142708c9dc5bf 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 69b9210e2830b4420944bac0a500693b787b096b..4bd2a554db955e36ecce11f8e27822f8c65e4c32 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 8734c6f0b27a94e6a3e5dd596c945fa16fd20325..4f5f64942bd8c53b90c0f77ddd7b2732adb09b4b 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 ce91ccb37698f43ddc45c552b3f38a8f72a09f16..6ee45732aed26c781854057b2a47133d1fc1138d 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 ee80a41da78ab9022109eff16c782d5eb396e99f..50f435737435892c21857d285693c3cfefae0096 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 a71471c0166c28a4e27252abfa336a4d5fa8a185..ab586ba01164dcb3bb7358ccda58b451582b3f46 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 36d31ff4a821bb5822e9a34d89a12339992efee7..007eeeb14b1df949a09d6f5c7be74bb6568c205c 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 6c81c6909d27a21ad9e811296b1710e0855065f4..2e13e2d6bb77e992abe523e245a235caf4002246 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."); + } + } }