From c375bc944eb85fdda9ec1c0cdb5349cdb343ccd8 Mon Sep 17 00:00:00 2001
From: fatima ezzahra majidi <fatima-ezzahra.majidi.etu@univ-lille.fr>
Date: Sun, 2 Mar 2025 20:22:41 +0000
Subject: [PATCH] Relations entre composants

---
 .../Config/SecurityConfig.java                |  9 ++--
 .../controllers/EnterpriseController.java     | 16 +++++-
 .../controllers/StageController.java          |  8 ++-
 .../gestionstagesbackend/model/Candidacy.java | 45 +++++------------
 .../model/Enterprise.java                     | 39 +++++----------
 .../gestionstagesbackend/model/Stage.java     | 49 ++++++++-----------
 .../repositories/EnterpriseRepository.java    |  7 ++-
 .../repositories/StageRepository.java         |  7 ++-
 .../services/EnterpriseService.java           | 27 +++++++---
 9 files changed, 101 insertions(+), 106 deletions(-)

diff --git a/src/main/java/com/example/gestionstagesbackend/Config/SecurityConfig.java b/src/main/java/com/example/gestionstagesbackend/Config/SecurityConfig.java
index c62e150..83a9bc2 100644
--- a/src/main/java/com/example/gestionstagesbackend/Config/SecurityConfig.java
+++ b/src/main/java/com/example/gestionstagesbackend/Config/SecurityConfig.java
@@ -7,16 +7,13 @@ import org.springframework.security.web.SecurityFilterChain;
 
 @Configuration
 public class SecurityConfig {
-
     @Bean
     public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
         http
+                .csrf(csrf -> csrf.disable()) // ✅ Disable CSRF protection
                 .authorizeHttpRequests(auth -> auth
-                        .requestMatchers("/api/**").permitAll()  // Allow all API calls
-                        .anyRequest().authenticated()           // Require authentication for other requests
-                )
-                .csrf(csrf -> csrf.disable()); // Disable CSRF for testing
-
+                        .anyRequest().permitAll() // ✅ Allow all requests (for testing)
+                );
         return http.build();
     }
 }
diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java b/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java
index 2f789a6..689fb8b 100644
--- a/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java
+++ b/src/main/java/com/example/gestionstagesbackend/controllers/EnterpriseController.java
@@ -1,6 +1,5 @@
 package com.example.gestionstagesbackend.controllers;
 
-
 import com.example.gestionstagesbackend.model.Enterprise;
 import com.example.gestionstagesbackend.services.EnterpriseService;
 import org.springframework.http.ResponseEntity;
@@ -10,7 +9,7 @@ import java.util.List;
 
 @RestController
 @RequestMapping("/api/enterprises")
-@CrossOrigin(origins = "*") // Allow requests from all origins (for testing)
+@CrossOrigin(origins = "*")
 public class EnterpriseController {
 
     private final EnterpriseService enterpriseService;
@@ -21,20 +20,33 @@ public class EnterpriseController {
 
     @PostMapping
     public ResponseEntity<Enterprise> createEnterprise(@RequestBody Enterprise enterprise) {
+        System.out.println("Received POST request: " + enterprise.getName() + ", " + enterprise.getAddress());
+
         Enterprise savedEnterprise = enterpriseService.saveEnterprise(enterprise);
+
+        System.out.println("Response sent with Enterprise ID: " + savedEnterprise.getId());
+
         return ResponseEntity.ok(savedEnterprise);
     }
 
     @GetMapping
     public ResponseEntity<List<Enterprise>> getAllEnterprises() {
+        System.out.println("🔵 Fetching all enterprises...");
         return ResponseEntity.ok(enterpriseService.getAllEnterprises());
     }
 
     @GetMapping("/{id}")
     public ResponseEntity<Enterprise> getEnterpriseById(@PathVariable Long id) {
+        System.out.println("Fetching enterprise with ID: " + id);
         return enterpriseService.getEnterpriseById(id)
                 .map(ResponseEntity::ok)
                 .orElse(ResponseEntity.notFound().build());
     }
 
+    @DeleteMapping("/{id}")
+    public ResponseEntity<Void> deleteEnterprise(@PathVariable Long id) {
+        System.out.println("Deleting enterprise with ID: " + id);
+        enterpriseService.deleteEnterprise(id);
+        return ResponseEntity.noContent().build();
+    }
 }
diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java b/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java
index 3b78388..97077d5 100644
--- a/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java
+++ b/src/main/java/com/example/gestionstagesbackend/controllers/StageController.java
@@ -36,9 +36,15 @@ public class StageController {
 
         stage.setEnterprise(enterprise.get());
         Stage savedStage = stageService.saveStage(stage);
-        return ResponseEntity.ok(savedStage);
+
+        // Fetch the saved stage with enterprise details included
+        Optional<Stage> fullStage = stageService.getStageById(savedStage.getId());
+
+        return fullStage.map(ResponseEntity::ok).orElse(ResponseEntity.ok(savedStage));
     }
 
+
+
     @GetMapping
     public ResponseEntity<List<Stage>> getAllStages() {
         return ResponseEntity.ok(stageService.getAllStages());
diff --git a/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java b/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java
index 5304e92..69b9210 100644
--- a/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java
+++ b/src/main/java/com/example/gestionstagesbackend/model/Candidacy.java
@@ -1,5 +1,6 @@
 package com.example.gestionstagesbackend.model;
 
+import com.fasterxml.jackson.annotation.JsonBackReference;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import jakarta.persistence.*;
 
@@ -11,17 +12,17 @@ public class Candidacy {
 
     @ManyToOne
     @JoinColumn(name = "student_id")
-    @JsonIgnoreProperties({"candidacies"}) // Prevents infinite recursion when serializing
+    @JsonIgnoreProperties({"candidacies"}) // Prevents recursion, but keeps other data
     private Student student;
 
     @ManyToOne
     @JoinColumn(name = "stage_id")
-    @JsonIgnoreProperties({"candidacies"})
-    private Stage stage;
+    @JsonBackReference
+    private Stage stage; // suppression de @JsonIgnoreProperties pour inclure Stage in response
 
     @ManyToOne
     @JoinColumn(name = "univ_supervisor_id")
-    @JsonIgnoreProperties({"supervisedStages"})
+    @JsonIgnoreProperties({"supervisedStages"}) // Prevents recursion
     private UnivSupervisor univSupervisor;
 
     public Candidacy() {}
@@ -32,35 +33,15 @@ public class Candidacy {
         this.univSupervisor = univSupervisor;
     }
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Student getStudent() {
-        return student;
-    }
+    public Long getId() { return id; }
+    public void setId(Long id) { this.id = id; }
 
-    public void setStudent(Student student) {
-        this.student = student;
-    }
+    public Student getStudent() { return student; }
+    public void setStudent(Student student) { this.student = student; }
 
-    public Stage getStage() {
-        return stage;
-    }
+    public Stage getStage() { return stage; }
+    public void setStage(Stage stage) { this.stage = stage; }
 
-    public void setStage(Stage stage) {
-        this.stage = stage;
-    }
-
-    public UnivSupervisor getUnivSupervisor() {
-        return univSupervisor;
-    }
-
-    public void setUnivSupervisor(UnivSupervisor univSupervisor) {
-        this.univSupervisor = univSupervisor;
-    }
+    public UnivSupervisor getUnivSupervisor() { return univSupervisor; }
+    public void setUnivSupervisor(UnivSupervisor univSupervisor) { this.univSupervisor = univSupervisor; }
 }
diff --git a/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java b/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java
index a6bc143..8734c6f 100644
--- a/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java
+++ b/src/main/java/com/example/gestionstagesbackend/model/Enterprise.java
@@ -1,22 +1,19 @@
 package com.example.gestionstagesbackend.model;
 
 import jakarta.persistence.*;
-
-
-
 import java.util.List;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
 
 @Entity
-@Table(name = "enterprise")
 public class Enterprise {
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     private Long id;
-
     private String name;
     private String address;
 
-    @OneToMany(mappedBy = "enterprise", cascade = CascadeType.ALL)
+    @OneToMany(mappedBy = "enterprise", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JsonManagedReference //  as the parent side
     private List<Stage> stages;
 
     public Enterprise() {}
@@ -26,27 +23,13 @@ public class Enterprise {
         this.address = address;
     }
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
+    public Long getId() { return id; }
+    public String getName() { return name; }
+    public String getAddress() { return address; }
+    public List<Stage> getStages() { return stages; }
 
-    public String getAddress() {
-        return address;
-    }
-
-    public void setAddress(String address) {
-        this.address = address;
-    }
+    public void setId(Long id) { this.id = id; }
+    public void setName(String name) { this.name = name; }
+    public void setAddress(String address) { this.address = address; }
+    public void setStages(List<Stage> stages) { this.stages = stages; }
 }
diff --git a/src/main/java/com/example/gestionstagesbackend/model/Stage.java b/src/main/java/com/example/gestionstagesbackend/model/Stage.java
index bc2c8b7..ce91ccb 100644
--- a/src/main/java/com/example/gestionstagesbackend/model/Stage.java
+++ b/src/main/java/com/example/gestionstagesbackend/model/Stage.java
@@ -1,7 +1,8 @@
 package com.example.gestionstagesbackend.model;
 
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import com.fasterxml.jackson.annotation.JsonManagedReference;
 import jakarta.persistence.*;
-
 import java.util.List;
 
 @Entity
@@ -14,49 +15,41 @@ public class Stage {
 
     @ManyToOne
     @JoinColumn(name = "enterprise_id", nullable = false)
+    @JsonBackReference // Prevents infinite recursion in JSON serialization
     private Enterprise enterprise;
 
-    @OneToMany(mappedBy = "stage", cascade = CascadeType.ALL)
+    @OneToMany(mappedBy = "stage", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    @JsonManagedReference // ✅ Allows Candidacies to appear in Stage responses
     private List<Candidacy> candidacies;
 
     public Stage() {}
 
-    public Stage(Long id, String name, String description, Enterprise enterprise) {
-        this.id = id;
+    public Stage(String name, String description, Enterprise enterprise) {
         this.name = name;
         this.description = description;
         this.enterprise = enterprise;
     }
 
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
+    public Stage(Long id, String name, String description, Enterprise enterprise, List<Candidacy> candidacies) {
         this.id = id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
         this.name = name;
+        this.description = description;
+        this.enterprise = enterprise;
+        this.candidacies = candidacies;
     }
 
-    public String getDescription() {
-        return description;
-    }
+    public Long getId() { return id; }
+    public void setId(Long id) { this.id = id; }
 
-    public void setDescription(String description) {
-        this.description = description;
-    }
+    public String getName() { return name; }
+    public void setName(String name) { this.name = name; }
 
-    public Enterprise getEnterprise() {
-        return enterprise;
-    }
+    public String getDescription() { return description; }
+    public void setDescription(String description) { this.description = description; }
 
-    public void setEnterprise(Enterprise enterprise) {
-        this.enterprise = enterprise;
-    }
+    public Enterprise getEnterprise() { return enterprise; }
+    public void setEnterprise(Enterprise enterprise) { this.enterprise = enterprise; }
+
+    public List<Candidacy> getCandidacies() { return candidacies; }
+    public void setCandidacies(List<Candidacy> candidacies) { this.candidacies = candidacies; }
 }
diff --git a/src/main/java/com/example/gestionstagesbackend/repositories/EnterpriseRepository.java b/src/main/java/com/example/gestionstagesbackend/repositories/EnterpriseRepository.java
index abfb39d..e670b27 100644
--- a/src/main/java/com/example/gestionstagesbackend/repositories/EnterpriseRepository.java
+++ b/src/main/java/com/example/gestionstagesbackend/repositories/EnterpriseRepository.java
@@ -1,8 +1,13 @@
 package com.example.gestionstagesbackend.repositories;
 
-
 import com.example.gestionstagesbackend.model.Enterprise;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import java.util.Optional;
 
 public interface EnterpriseRepository extends JpaRepository<Enterprise, Long> {
+
+    @Query("SELECT e FROM Enterprise e LEFT JOIN FETCH e.stages WHERE e.id = :id")
+    Optional<Enterprise> findByIdWithStages(@Param("id") Long id);
 }
diff --git a/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java b/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java
index 68d8833..ee80a41 100644
--- a/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java
+++ b/src/main/java/com/example/gestionstagesbackend/repositories/StageRepository.java
@@ -1,10 +1,15 @@
 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.stereotype.Repository;
 
+import java.util.Optional;
+
 @Repository
 public interface StageRepository extends JpaRepository<Stage, Long> {
+
+    @EntityGraph(attributePaths = {"enterprise"}) // Ensures Enterprise is fetched
+    Optional<Stage> findById(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 eec1793..a71471c 100644
--- a/src/main/java/com/example/gestionstagesbackend/services/EnterpriseService.java
+++ b/src/main/java/com/example/gestionstagesbackend/services/EnterpriseService.java
@@ -1,14 +1,11 @@
 package com.example.gestionstagesbackend.services;
 
-
-
 import com.example.gestionstagesbackend.model.Enterprise;
 import com.example.gestionstagesbackend.repositories.EnterpriseRepository;
 import org.springframework.stereotype.Service;
 import java.util.List;
 import java.util.Optional;
 
-
 @Service
 public class EnterpriseService {
 
@@ -19,15 +16,31 @@ public class EnterpriseService {
     }
 
     public Enterprise saveEnterprise(Enterprise enterprise) {
-        return enterpriseRepository.save(enterprise);
-    }
+        System.out.println("Saving enterprise: " + enterprise.getName() + ", " + enterprise.getAddress());
 
-    public Optional<Enterprise> getEnterpriseById(Long id) {
-        return enterpriseRepository.findById(id);
+        // If stages exist, set their enterprise reference correctly
+        if (enterprise.getStages() != null && !enterprise.getStages().isEmpty()) {
+            enterprise.getStages().forEach(stage -> stage.setEnterprise(enterprise));
+        } else {
+            enterprise.setStages(null); // Avoid redundant or circular references
+        }
+
+        Enterprise savedEnterprise = enterpriseRepository.save(enterprise);
+        System.out.println("Saved Enterprise ID: " + savedEnterprise.getId());
 
+        return savedEnterprise;
     }
 
     public List<Enterprise> getAllEnterprises() {
         return enterpriseRepository.findAll();
     }
+
+    public Optional<Enterprise> getEnterpriseById(Long id) {
+        return enterpriseRepository.findByIdWithStages(id);
+    }
+
+    public void deleteEnterprise(Long id) {
+        System.out.println("Deleting Enterprise ID: " + id);
+        enterpriseRepository.deleteById(id);
+    }
 }
-- 
GitLab