diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/AuthController.java b/src/main/java/com/example/gestionstagesbackend/controllers/AuthController.java index e8f5cc2cc8f3936cebc884d96e2074a0432b4033..692060d4366906e50c05b5d2435b6f1d5ca8c7d2 100644 --- a/src/main/java/com/example/gestionstagesbackend/controllers/AuthController.java +++ b/src/main/java/com/example/gestionstagesbackend/controllers/AuthController.java @@ -13,6 +13,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -54,41 +55,29 @@ public class AuthController { String username = loginRequest.get("username"); String password = loginRequest.get("password"); - System.out.println("🔍 Attempting login for: " + username); - - if (username == null || password == null) { - System.out.println("❌ Username or password is missing in the request."); - return ResponseEntity.status(400).body(Map.of("error", "Username and password are required")); - } - - Optional<User> userOptional = userService.findByUsername(username); - if (userOptional.isEmpty()) { - System.out.println("❌ User not found!"); - return ResponseEntity.status(401).body(Map.of("error", "Invalid credentials")); + Optional<User> user = userService.findByUsername(username); + if (user.isEmpty()) { + return ResponseEntity.status(401).body("Invalid credentials"); } - User user = userOptional.get(); - System.out.println("✅ User found: " + username); - try { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(username, password) ); - // Update security context on successful authentication SecurityContextHolder.getContext().setAuthentication(authentication); - System.out.println("✅ Login successful for user: " + username); - // ✅ 🔥 Renvoie les rôles de l'utilisateur dans la réponse - return ResponseEntity.ok(Map.of( - "message", "Login successful", - "username", user.getUsername(), - "roles", user.getRoles() // Retourne les rôles ici - )); + // ✅ Send username & familyname in the response + Map<String, Object> responseBody = new HashMap<>(); + responseBody.put("id", user.get().getId()); // 🔥 Ajoute l'ID ici + responseBody.put("username", user.get().getUsername()); + responseBody.put("familyname", user.get().getFamilyname()); // Assure-toi que ce champ existe bien + responseBody.put("roles", user.get().getRoles()); + responseBody.put("message", "Login successful"); + return ResponseEntity.ok(responseBody); } catch (Exception e) { - System.out.println("❌ Authentication failed for user " + username + ": " + e.getMessage()); - return ResponseEntity.status(401).body(Map.of("error", "Invalid username or password")); + return ResponseEntity.status(401).body("Invalid username or password"); } } diff --git a/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java b/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java index 45f172ddfd7884e47312c7dcc42f51df2d6fba81..5d9abad4d822a3f8ad787fdd551b863be52d39da 100644 --- a/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java +++ b/src/main/java/com/example/gestionstagesbackend/controllers/StudentController.java @@ -74,4 +74,10 @@ public class StudentController { studentService.deleteStudent(id); return ResponseEntity.noContent().build(); } + @GetMapping("/with-role") + public ResponseEntity<List<Student>> getStudentsWithRoleEtudiant() { + List<Student> students = studentService.getStudentsByRole("ROLE_ETUDIANT"); + return ResponseEntity.ok(students); + } + } diff --git a/src/main/java/com/example/gestionstagesbackend/model/Student.java b/src/main/java/com/example/gestionstagesbackend/model/Student.java index 3c14cc0ef6cc70e69fe525f9ab07056c55e23424..d596fba011b194d3635339cd219da993ac98f08e 100644 --- a/src/main/java/com/example/gestionstagesbackend/model/Student.java +++ b/src/main/java/com/example/gestionstagesbackend/model/Student.java @@ -14,43 +14,31 @@ public class Student { @OneToMany(mappedBy = "student", cascade = CascadeType.ALL) private List<Candidacy> candidacies; + @OneToOne + @JoinColumn(name = "user_id", unique = true) + private User user; // Ajout de la liaison avec User + public Student() {} - public Student(Long id, String firstname, String lastname) { + public Student(Long id, String firstname, String lastname, User user) { this.id = id; this.firstname = firstname; this.lastname = lastname; + this.user = user; } - public Long getId() { - return id; - } + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } - public void setId(Long id) { - this.id = id; - } + public String getFirstname() { return firstname; } + public void setFirstname(String firstname) { this.firstname = firstname; } - public String getFirstname() { - return firstname; - } + public String getLastname() { return lastname; } + public void setLastname(String lastname) { this.lastname = lastname; } - public void setFirstname(String firstname) { - this.firstname = firstname; - } + public List<Candidacy> getCandidacies() { return candidacies; } + public void setCandidacies(List<Candidacy> candidacies) { this.candidacies = candidacies; } - public String getLastname() { - return lastname; - } - - public void setLastname(String lastname) { - this.lastname = lastname; - } - - public List<Candidacy> getCandidacies() { - return candidacies; - } - - public void setCandidacies(List<Candidacy> candidacies) { - this.candidacies = candidacies; - } + public User getUser() { return user; } + public void setUser(User user) { this.user = user; } } diff --git a/src/main/java/com/example/gestionstagesbackend/model/User.java b/src/main/java/com/example/gestionstagesbackend/model/User.java index 14ba5954dd4d0f3377d728c48cbc7e27cb947eee..0d1e46d299b5f4ea16003acad7354b610e2cd1cf 100644 --- a/src/main/java/com/example/gestionstagesbackend/model/User.java +++ b/src/main/java/com/example/gestionstagesbackend/model/User.java @@ -11,14 +11,17 @@ import java.util.stream.Collectors; @Entity @Table(name = "users") -public class User implements UserDetails { // ✅ Implements UserDetails +public class User implements UserDetails { // Implements UserDetails @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(unique = true, nullable = false) + @Column(nullable = false) private String username; + @Column(nullable = false) + private String familyname; // ✅ Added familyname + @JsonIgnore @Column(nullable = false) private String password; @@ -26,12 +29,13 @@ public class User implements UserDetails { // ✅ Implements UserDetails @ElementCollection(fetch = FetchType.EAGER) @CollectionTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id")) @Column(name = "role") - private Set<String> roles; // ✅ Roles stored in a separate table + private Set<String> roles; // Roles stored in a separate table public User() {} - public User(String username, String password, Set<String> roles) { + public User(String username, String familyname, String password, Set<String> roles) { this.username = username; + this.familyname = familyname; this.password = password; this.roles = roles; } @@ -52,6 +56,14 @@ public class User implements UserDetails { // ✅ Implements UserDetails this.username = username; } + public String getFamilyname() { + return familyname; + } + + public void setFamilyname(String familyname) { + this.familyname = familyname; + } + public String getPassword() { return password; } @@ -96,6 +108,6 @@ public class User implements UserDetails { // ✅ Implements UserDetails @Override public String toString() { - return "User{id=" + id + ", username='" + username + "', roles=" + roles + "}"; + return "User{id=" + id + ", username='" + username + "', familyname='" + familyname + "', roles=" + roles + "}"; } } diff --git a/src/main/java/com/example/gestionstagesbackend/repositories/StudentRepository.java b/src/main/java/com/example/gestionstagesbackend/repositories/StudentRepository.java index e7474ad53c65a21b8c7aa4227673559831c6c668..35cb3a7b6c01d4650a170857f8c52b797560268a 100644 --- a/src/main/java/com/example/gestionstagesbackend/repositories/StudentRepository.java +++ b/src/main/java/com/example/gestionstagesbackend/repositories/StudentRepository.java @@ -2,8 +2,16 @@ package com.example.gestionstagesbackend.repositories; import com.example.gestionstagesbackend.model.Student; 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.List; +import java.util.Optional; + @Repository public interface StudentRepository extends JpaRepository<Student, Long> { + @Query("SELECT s FROM Student s WHERE s.user.id IN (SELECT u.id FROM User u WHERE :role MEMBER OF u.roles)") + List<Student> findStudentsByRole(@Param("role") String role); + Optional<Student> findByFirstnameAndLastname(String firstname, String lastname); } diff --git a/src/main/java/com/example/gestionstagesbackend/repositories/UserRepository.java b/src/main/java/com/example/gestionstagesbackend/repositories/UserRepository.java index ce9ec7d19ff099102c6b65986cfb5bc0b383732e..18a187275ef415a7d652097d28f9bcaee7059b42 100644 --- a/src/main/java/com/example/gestionstagesbackend/repositories/UserRepository.java +++ b/src/main/java/com/example/gestionstagesbackend/repositories/UserRepository.java @@ -2,9 +2,14 @@ package com.example.gestionstagesbackend.repositories; import com.example.gestionstagesbackend.model.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByUsername(String username); + @Query("SELECT u FROM User u WHERE :role MEMBER OF u.roles") + List<User> findByRole(@Param("role") String role); } diff --git a/src/main/java/com/example/gestionstagesbackend/services/StudentService.java b/src/main/java/com/example/gestionstagesbackend/services/StudentService.java index 2e13e2d6bb77e992abe523e245a235caf4002246..2c110bafea44d358b1158cbdfd7e2de0550007ee 100644 --- a/src/main/java/com/example/gestionstagesbackend/services/StudentService.java +++ b/src/main/java/com/example/gestionstagesbackend/services/StudentService.java @@ -34,4 +34,17 @@ public class StudentService { throw new IllegalArgumentException("Student with ID " + id + " does not exist."); } } + public void createStudentIfNotExists(String firstname, String lastname) { + if (studentRepository.findByFirstnameAndLastname(firstname, lastname).isEmpty()) { + Student student = new Student(); + student.setFirstname(firstname); + student.setLastname(lastname); + studentRepository.save(student); + System.out.println("✅ Created student: " + firstname + " " + lastname); + } + } + + public List<Student> getStudentsByRole(String role) { + return studentRepository.findStudentsByRole(role); + } } diff --git a/src/main/java/com/example/gestionstagesbackend/services/UserService.java b/src/main/java/com/example/gestionstagesbackend/services/UserService.java index 394867ce5a73d2d12007585876558dadefe0c9b6..7aeefd1e0a7b041e6a6b849db1b297dff7f03aeb 100644 --- a/src/main/java/com/example/gestionstagesbackend/services/UserService.java +++ b/src/main/java/com/example/gestionstagesbackend/services/UserService.java @@ -3,6 +3,7 @@ package com.example.gestionstagesbackend.services; import com.example.gestionstagesbackend.model.User; import com.example.gestionstagesbackend.repositories.UserRepository; import jakarta.annotation.PostConstruct; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @@ -54,20 +55,31 @@ public class UserService implements UserDetailsService { @PostConstruct public void createDefaultUsers() { - createUserIfNotExists("admin", "admin123", Set.of("ROLE_ADMIN")); - createUserIfNotExists("etudiant", "etudiant123", Set.of("ROLE_ETUDIANT")); - createUserIfNotExists("entreprise", "entreprise123", Set.of("ROLE_ENTREPRISE")); - createUserIfNotExists("superviseur", "superviseur123", Set.of("ROLE_SUPERVISEUR")); + createUserIfNotExists("admin", "admin123", "Admin", "ROLE_ADMIN"); + createUserIfNotExists("etudiant1", "etudiant123", "Etudiant1", "ROLE_ETUDIANT"); + createUserIfNotExists("etudiant2", "etudiant123", "Etudiant2", "ROLE_ETUDIANT"); + createUserIfNotExists("entreprise", "entreprise123", "Entreprise", "ROLE_ENTREPRISE"); + createUserIfNotExists("superviseur", "superviseur123", "Superviseur", "ROLE_SUPERVISEUR"); } - private void createUserIfNotExists(String username, String password, Set<String> roles) { + private void createUserIfNotExists(String username, String password, String familyname, String role) { if (userRepository.findByUsername(username).isEmpty()) { User user = new User(); user.setUsername(username); user.setPassword(passwordEncoder.encode(password)); - user.setRoles(roles); + user.setFamilyname(familyname); + user.setRoles(Set.of(role)); userRepository.save(user); - System.out.println("✅ Created user: " + username + " with roles " + roles); + + // Si l'utilisateur est un étudiant, on crée un étudiant associé + if (role.equals("ROLE_ETUDIANT")) { + studentService.createStudentIfNotExists(username, familyname); + } + + System.out.println("✅ Created user: " + username + " with role " + role); } } + + @Autowired + private StudentService studentService; // Injection du service pour créer un étudiant }