diff --git a/src/main/java/com/example/gestionstagesbackend/Config/SecurityConfig.java b/src/main/java/com/example/gestionstagesbackend/Config/SecurityConfig.java index c62e15076c3ccd3090caaae18020190a729675fe..83a9bc2ef3b5a0e5d668d430fc46ed6eb4436063 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 2f789a69d83ef1402032aab0a079cd3555780201..689fb8bfc41de99f8b0a727155a21de23a8d795a 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 3b783883763693495fdb05c20da4020a64b02d5f..97077d55be7352937eed785f1c3138b60fdc7218 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 5304e92e7ab3475ae9151fddbadf45fe0f095cb1..69b9210e2830b4420944bac0a500693b787b096b 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 a6bc14382388e874dd333e5205c46fae8e16edfb..8734c6f0b27a94e6a3e5dd596c945fa16fd20325 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 bc2c8b772e92abd8e7a3a7c98b5e82f5d9b539de..ce91ccb37698f43ddc45c552b3f38a8f72a09f16 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 abfb39d6c1f5ce0e6255c52b1922e9e7874714c0..e670b2769b6ba17acb14a4df04507f61f72a0b28 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 68d883388339deffcdcdc09c0efd9b617996fd08..ee80a41da78ab9022109eff16c782d5eb396e99f 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 eec1793227de4615df9fdd8ef404de3ccff41360..a71471c0166c28a4e27252abfa336a4d5fa8a185 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); + } }