diff --git a/src/main/java/com/projet/projetIndu/bootstrap/DatabaseSeeder.java b/src/main/java/com/projet/projetIndu/bootstrap/DatabaseSeeder.java index 122c87f153c787b5527c8e5869a0cb6603a98adf..47d3931b01825338171f698ca18d1c484ec8d2c5 100644 --- a/src/main/java/com/projet/projetIndu/bootstrap/DatabaseSeeder.java +++ b/src/main/java/com/projet/projetIndu/bootstrap/DatabaseSeeder.java @@ -1,19 +1,16 @@ package com.projet.projetIndu.bootstrap; import com.projet.projetIndu.entities.*; +import com.projet.projetIndu.repositories.*; +import org.springframework.boot.CommandLineRunner; import org.springframework.core.io.ClassPathResource; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; -import org.springframework.boot.CommandLineRunner; -import com.projet.projetIndu.repositories.DoctorRepository; -import com.projet.projetIndu.repositories.MedicalFilesRepository; -import com.projet.projetIndu.repositories.PatientRepository; -import com.projet.projetIndu.repositories.MedicalDocumentRepository; -import com.projet.projetIndu.repositories.AppointmentRepository; -import java.time.LocalDateTime; import java.io.IOException; -import java.nio.file.Files; +import java.io.InputStream; import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; @Component @@ -21,75 +18,78 @@ public class DatabaseSeeder implements CommandLineRunner { private final DoctorRepository doctorRepository; private final PatientRepository patientRepository; - private final MedicalFilesRepository medicalFilesRepository; + private final MedicalFileRepository medicalFileRepository; private final MedicalDocumentRepository medicalDocumentRepository; - private final AppointmentRepository appointmentRepository; // Ajout du repository des rendez-vous + private final AppointmentRepository appointmentRepository; + private final PasswordEncoder passwordEncoder; public DatabaseSeeder(DoctorRepository doctorRepository, PatientRepository patientRepository, - MedicalFilesRepository medicalFilesRepository, + MedicalFileRepository medicalFileRepository, MedicalDocumentRepository medicalDocumentRepository, - AppointmentRepository appointmentRepository) { // Injection du repository + AppointmentRepository appointmentRepository, + PasswordEncoder passwordEncoder) { this.doctorRepository = doctorRepository; this.patientRepository = patientRepository; - this.medicalFilesRepository = medicalFilesRepository; + this.medicalFileRepository = medicalFileRepository; this.medicalDocumentRepository = medicalDocumentRepository; this.appointmentRepository = appointmentRepository; + this.passwordEncoder = passwordEncoder; } @Override public void run(String... args) { - if (medicalFilesRepository.count() == 0) { - Doctor doctor1 = new Doctor("Jean", "Dupont", "Généraliste", "jean.dupont@example.com"); - Doctor doctor2 = new Doctor("Sophie", "Martin", "Cardiologue", "sophie.martin@example.com"); - + if (medicalFileRepository.count() == 0) { + Doctor doctor1 = new Doctor("Jean", "Dupont", "0444444444", "jean.dupont@example.com", "Generaliste", passwordEncoder.encode("password123")); + Doctor doctor2 = new Doctor("Sophie", "Martin", "0455555555", "sophie.martin@example.com", "Cardiologue", passwordEncoder.encode("password123")); doctorRepository.saveAll(List.of(doctor1, doctor2)); - //Patient patient1 = new Patient("Paul", "Durand", LocalDate.of(1990, 5, 15), "0678901234", "paul.durand@example.com", "5 Rue des Lilas", "Pollen", "Paracétamol"); - //Patient patient2 = new Patient("Alice", "Lemoine", LocalDate.of(1985, 10, 20), "0687654321", "alice.lemoine@example.com", "8 Rue du Lac", "Arachide", "Ibuprofène"); - Patient patient1 = new Patient("Paul", "Durand", LocalDate.parse("1990-05-15"), "0678901234", "paul.durand@example.com", "5 Rue des Lilas", "Pollen", "Paracétamol"); - Patient patient2 = new Patient("Alice", "Lemoine", LocalDate.parse("1990-05-15"), "0687654321", "alice.lemoine@example.com", "8 Rue du Lac", "Arachide", "Ibuprofène"); - + Patient patient1 = new Patient("Paul", "Durand", LocalDate.parse("1990-05-15"), "0678901234", "paul.durand@example.com", "5 Rue des Lilas", passwordEncoder.encode("test123")); + Patient patient2 = new Patient("Alice", "Lemoine", LocalDate.parse("1990-05-15"), "0687654321", "alice.lemoine@example.com", "8 Rue du Lac", passwordEncoder.encode("test123")); patientRepository.saveAll(List.of(patient1, patient2)); - MedicalFiles file1 = new MedicalFiles(patient1, doctor1, "Antécédents : Opération de l’appendicite."); - MedicalFiles file2 = new MedicalFiles(patient2, doctor2, "Antécédents : Hypertension traitée."); + MedicalFile file1 = new MedicalFile(patient1, "Arachide", "Ibuprofene"); + MedicalFile file2 = new MedicalFile(patient2, "Pollen", "Bisoprolol"); + medicalFileRepository.saveAll(List.of(file1, file2)); - medicalFilesRepository.saveAll(List.of(file1, file2)); + patient1.setMedicalFile(file1); + patient2.setMedicalFile(file2); + patientRepository.saveAll(List.of(patient1, patient2)); addDefaultDocument(file1, "documents/exemple1.pdf", "Rapport Médical.pdf"); addDefaultDocument(file2, "documents/exemple2.pdf", "Résultat Analyse.pdf"); + medicalFileRepository.saveAll(List.of(file1, file2)); Appointment appointment1 = new Appointment(patient1, doctor1, LocalDateTime.now().plusDays(2), AppointmentStatus.CONFIRMED, "Consultation de suivi"); Appointment appointment2 = new Appointment(patient2, doctor2, LocalDateTime.now().plusDays(7), AppointmentStatus.PENDING, "Bilan annuel"); - appointmentRepository.saveAll(List.of(appointment1, appointment2)); - System.out.println("Données insérées : "); + System.out.println("Données insérées :"); System.out.println("Médecins : " + doctorRepository.count()); System.out.println("Patients : " + patientRepository.count()); - System.out.println("Dossiers médicaux : " + medicalFilesRepository.count()); + System.out.println("Dossiers médicaux : " + medicalFileRepository.count()); System.out.println("Documents médicaux : " + medicalDocumentRepository.count()); System.out.println("Rendez-vous : " + appointmentRepository.count()); } } - - private void addDefaultDocument(MedicalFiles medicalFile, String filePath, String fileName) { + private void addDefaultDocument(MedicalFile medicalFile, String filePath, String fileName) { try { ClassPathResource resource = new ClassPathResource(filePath); - byte[] fileData = Files.readAllBytes(resource.getFile().toPath()); + try (InputStream inputStream = resource.getInputStream()) { + byte[] fileData = inputStream.readAllBytes(); - MedicalDocument document = new MedicalDocument(); - document.setFileName(fileName); - document.setFileData(fileData); - document.setMedicalFile(medicalFile); + MedicalDocument document = new MedicalDocument(); + document.setFileName(fileName); + document.setFileData(fileData); + document.setMedicalFile(medicalFile); - medicalDocumentRepository.save(document); + medicalFile.getDocumentList().add(document); + medicalDocumentRepository.save(document); + } } catch (IOException e) { System.err.println("Erreur lors du chargement du fichier " + filePath); e.printStackTrace(); } } - } diff --git a/src/main/java/com/projet/projetIndu/config/SecurityConfig.java b/src/main/java/com/projet/projetIndu/config/SecurityConfig.java deleted file mode 100644 index a310d6d4dd10e171ded4a70410d68381c1bfa767..0000000000000000000000000000000000000000 --- a/src/main/java/com/projet/projetIndu/config/SecurityConfig.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.projet.projetIndu.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; - -@Configuration -public class SecurityConfig { - - @Bean - public BCryptPasswordEncoder passwordEncoder() { - return new BCryptPasswordEncoder(); - } -} diff --git a/src/main/java/com/projet/projetIndu/controllers/LoginController.java b/src/main/java/com/projet/projetIndu/controllers/LoginController.java new file mode 100644 index 0000000000000000000000000000000000000000..6e23cc15c7a8e0cdb32104b6cfaa477fbb1fec67 --- /dev/null +++ b/src/main/java/com/projet/projetIndu/controllers/LoginController.java @@ -0,0 +1,13 @@ +package com.projet.projetIndu.controllers; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class LoginController { + + @GetMapping("/login") + public String showLoginForm() { + return "login"; // Correspond à login.html + } +} diff --git a/src/main/java/com/projet/projetIndu/controllers/MedicalFilesController.java b/src/main/java/com/projet/projetIndu/controllers/MedicalFileController.java similarity index 76% rename from src/main/java/com/projet/projetIndu/controllers/MedicalFilesController.java rename to src/main/java/com/projet/projetIndu/controllers/MedicalFileController.java index 1b9c62bd947bcaff4ee5827779413a23f27d26e1..12eeb6749f0b826fbce23b9090dedbce24415543 100644 --- a/src/main/java/com/projet/projetIndu/controllers/MedicalFilesController.java +++ b/src/main/java/com/projet/projetIndu/controllers/MedicalFileController.java @@ -1,9 +1,9 @@ package com.projet.projetIndu.controllers; import com.projet.projetIndu.entities.MedicalDocument; -import com.projet.projetIndu.entities.MedicalFiles; +import com.projet.projetIndu.entities.MedicalFile; import com.projet.projetIndu.repositories.MedicalDocumentRepository; -import com.projet.projetIndu.services.MedicalFilesService; +import com.projet.projetIndu.services.MedicalFileService; import org.springframework.http.*; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -12,25 +12,26 @@ import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.io.IOException; +import java.time.LocalDate; import java.util.List; import java.util.Optional; @Controller @RequestMapping("/medical-files") -public class MedicalFilesController { +public class MedicalFileController { - private final MedicalFilesService medicalFilesService; + private final MedicalFileService medicalFileService; private final MedicalDocumentRepository medicalDocumentRepository; - public MedicalFilesController(MedicalFilesService medicalFilesService, MedicalDocumentRepository medicalDocumentRepository) { - this.medicalFilesService = medicalFilesService; + public MedicalFileController(MedicalFileService medicalFileService, MedicalDocumentRepository medicalDocumentRepository) { + this.medicalFileService = medicalFileService; this.medicalDocumentRepository = medicalDocumentRepository; } // Afficher tous les dossiers médicaux @GetMapping public String listMedicalFiles(Model model) { - List<MedicalFiles> medicalFiles = medicalFilesService.getAllMedicalFiles(); + List<MedicalFile> medicalFiles = medicalFileService.getAllMedicalFiles(); model.addAttribute("medicalFiles", medicalFiles); return "medical-files"; } @@ -38,7 +39,7 @@ public class MedicalFilesController { // Afficher un dossier médical spécifique @GetMapping("/{id}") public String viewMedicalFile(@PathVariable Long id, Model model) { - return medicalFilesService.getMedicalFileById(id) + return medicalFileService.getMedicalFileById(id) .map(medicalFile -> { model.addAttribute("medicalFile", medicalFile); return "view-medical-file"; @@ -48,23 +49,27 @@ public class MedicalFilesController { // Créer un dossier médical @PostMapping("/create") - public String createMedicalFile(@ModelAttribute MedicalFiles medicalFiles) { - medicalFilesService.saveMedicalFiles(medicalFiles); + public String createMedicalFile(@ModelAttribute MedicalFile medicalFile) { + medicalFileService.saveMedicalFiles(medicalFile); return "redirect:/medical-files"; } // Mettre à jour l'historique médical @PostMapping("/{id}/history") - public String updateMedicalFileHistory(@PathVariable Long id, @RequestParam String history) { - medicalFilesService.updateMedicalFileHistory(id, history); + public String updateMedicalFileHistory(@PathVariable Long id, + @RequestParam String antecedent, + @RequestParam String notes, + @RequestParam LocalDate consultationDate) { + medicalFileService.updateMedicalFileHistory(id, antecedent, notes, consultationDate); return "redirect:/medical-files/" + id; } + // Ajouter un document à un dossier médical @PostMapping("/{id}/documents") public String uploadMedicalFileDocument(@PathVariable Long id, @RequestParam("document") MultipartFile document) { try { - medicalFilesService.uploadMedicalFileDocument(id, document); + medicalFileService.uploadMedicalFileDocument(id, document); } catch (IOException e) { e.printStackTrace(); return "error"; @@ -111,7 +116,7 @@ public class MedicalFilesController { // Supprimer un dossier médical @DeleteMapping("/{id}") public String deleteMedicalFile(@PathVariable Long id) { - medicalFilesService.deleteMedicalFileById(id); + medicalFileService.deleteMedicalFileById(id); return "redirect:/medical-files"; } } diff --git a/src/main/java/com/projet/projetIndu/controllers/UserController.java b/src/main/java/com/projet/projetIndu/controllers/UserController.java new file mode 100644 index 0000000000000000000000000000000000000000..78c30c7bb32a9378c526b2b13e0683f2914a574a --- /dev/null +++ b/src/main/java/com/projet/projetIndu/controllers/UserController.java @@ -0,0 +1,37 @@ +package com.projet.projetIndu.controllers; + +import com.projet.projetIndu.dto.UserRegistrationDTO; +import com.projet.projetIndu.services.UserService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; + +@Controller +public class UserController { + private final UserService userService; + + public UserController(UserService userService) { + this.userService = userService; + } + + // Affiche le formulaire d'inscription + @GetMapping("/register") + public String showRegistrationForm(Model model) { + model.addAttribute("userDTO", new UserRegistrationDTO()); + return "register"; + } + + // Traite le formulaire d'inscription + @PostMapping("/register") + public String registerUser(@ModelAttribute("userDTO") UserRegistrationDTO userDTO, Model model) { + try { + userService.registerUser(userDTO); + return "redirect:/login"; + } catch (IllegalArgumentException e) { + model.addAttribute("error", e.getMessage()); + return "register"; + } + } +} diff --git a/src/main/java/com/projet/projetIndu/dto/UserRegistrationDTO.java b/src/main/java/com/projet/projetIndu/dto/UserRegistrationDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..78114498b32bbff49c69a8fb16c0db52747dabb2 --- /dev/null +++ b/src/main/java/com/projet/projetIndu/dto/UserRegistrationDTO.java @@ -0,0 +1,21 @@ +package com.projet.projetIndu.dto; + +import com.projet.projetIndu.entities.Role; +import lombok.Getter; +import lombok.Setter; +import java.time.LocalDate; + +@Getter +@Setter +public class UserRegistrationDTO { + private String firstName; + private String lastName; + private String phoneNumber; + private String email; //utilisé comme username + private String password; + private Role role; + private String speciality; // Uniquement pour les doctors + private LocalDate dateOfBirth; // Uniquement pour les patients + private String address; // Uniquement pour les patients +} + diff --git a/src/main/java/com/projet/projetIndu/entities/Admin.java b/src/main/java/com/projet/projetIndu/entities/Admin.java new file mode 100644 index 0000000000000000000000000000000000000000..b1afc5dbeb0b6a8a36f481f9de9aca6d29a88a66 --- /dev/null +++ b/src/main/java/com/projet/projetIndu/entities/Admin.java @@ -0,0 +1,14 @@ +package com.projet.projetIndu.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@DiscriminatorValue("ADMIN") +public class Admin extends User { +} diff --git a/src/main/java/com/projet/projetIndu/entities/Appointment.java b/src/main/java/com/projet/projetIndu/entities/Appointment.java index db74bfeb5727f407db6f4ae4a22acf967ad5ea3d..5af4c61c08ceb90a19d5f148a61ac29223fcb57c 100644 --- a/src/main/java/com/projet/projetIndu/entities/Appointment.java +++ b/src/main/java/com/projet/projetIndu/entities/Appointment.java @@ -1,6 +1,7 @@ package com.projet.projetIndu.entities; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -13,6 +14,7 @@ import java.time.LocalDateTime; @Getter @Setter @NoArgsConstructor +@AllArgsConstructor public class Appointment { @Id @@ -28,7 +30,7 @@ public class Appointment { private Doctor doctor; @OneToOne - @JoinColumn(name = "invoice_id", nullable = false) + @JoinColumn(name = "invoice_id", nullable = true) private Invoice invoice; @DateTimeFormat(pattern = "dd/MM/yyyy HH:mm") @@ -55,5 +57,4 @@ public class Appointment { } - } diff --git a/src/main/java/com/projet/projetIndu/entities/Doctor.java b/src/main/java/com/projet/projetIndu/entities/Doctor.java index 5ac0d61f52caab8281dd5c95418f280639a502d2..cc524e6a6a2b320b75e1d7d8c1c75d3ca20a98a1 100644 --- a/src/main/java/com/projet/projetIndu/entities/Doctor.java +++ b/src/main/java/com/projet/projetIndu/entities/Doctor.java @@ -1,25 +1,32 @@ package com.projet.projetIndu.entities; -import jakarta.persistence.*; +import jakarta.persistence.CascadeType; +import jakarta.persistence.DiscriminatorValue; +import jakarta.persistence.Entity; +import jakarta.persistence.OneToMany; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; @Entity -@Table(name = "doctors") @Getter @Setter +@DiscriminatorValue("DOCTOR") @NoArgsConstructor public class Doctor extends User { private String speciality; + @OneToMany(mappedBy = "doctor", cascade = CascadeType.ALL, orphanRemoval = true) + private List<Appointment> appointmentList = new ArrayList<>(); - public Doctor(String firstName, String lastName, String phoneNumber, String email, String address, String username, String password, Role role) { - super(firstName, lastName, phoneNumber, email, address, username, password, role); + public Doctor(String firstName, String lastName, String phoneNumber, String email, String speciality, String password) { + super(firstName, lastName, phoneNumber, email, password); + this.role = Role.DOCTOR; this.speciality = speciality; } - } +} diff --git a/src/main/java/com/projet/projetIndu/entities/HealthHistorical.java b/src/main/java/com/projet/projetIndu/entities/HealthHistorical.java index 6ee646eb12c40f220cf10f619b24af42263684bd..9fc91300c0c153919cdd3683f080f37bfc0a2b47 100644 --- a/src/main/java/com/projet/projetIndu/entities/HealthHistorical.java +++ b/src/main/java/com/projet/projetIndu/entities/HealthHistorical.java @@ -6,12 +6,13 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDate; +import java.time.LocalDateTime; @Entity @Data @NoArgsConstructor @AllArgsConstructor -class HealthHistorical { +public class HealthHistorical { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -20,4 +21,8 @@ class HealthHistorical { private String notes; private LocalDate consultationDate; + @ManyToOne + @JoinColumn(name = "medical_file_id", nullable = false) + private MedicalFile medicalFile; + } \ No newline at end of file diff --git a/src/main/java/com/projet/projetIndu/entities/MedicalDocument.java b/src/main/java/com/projet/projetIndu/entities/MedicalDocument.java index 2dba3ee5677ab45a89dd272e59df0f8cbe0b7e5e..fab8f1650b5d1e210af010aab967644ba6c9ed1d 100644 --- a/src/main/java/com/projet/projetIndu/entities/MedicalDocument.java +++ b/src/main/java/com/projet/projetIndu/entities/MedicalDocument.java @@ -20,4 +20,8 @@ public class MedicalDocument { @Column(columnDefinition = "LONGBLOB") private byte[] fileData; + @ManyToOne + @JoinColumn(name = "medical_file_id", nullable = true) + private MedicalFile medicalFile; + } diff --git a/src/main/java/com/projet/projetIndu/entities/MedicalFiles.java b/src/main/java/com/projet/projetIndu/entities/MedicalFile.java similarity index 61% rename from src/main/java/com/projet/projetIndu/entities/MedicalFiles.java rename to src/main/java/com/projet/projetIndu/entities/MedicalFile.java index ab3cf39b445c5c1aa89ac68c61747e75b7f7c9b3..d83a62f11d3ba9aa8e5924d75352553dbdcf3431 100644 --- a/src/main/java/com/projet/projetIndu/entities/MedicalFiles.java +++ b/src/main/java/com/projet/projetIndu/entities/MedicalFile.java @@ -1,6 +1,7 @@ package com.projet.projetIndu.entities; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -14,7 +15,8 @@ import java.util.List; @Getter @Setter @NoArgsConstructor -public class MedicalFiles { +@AllArgsConstructor +public class MedicalFile { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -23,21 +25,25 @@ public class MedicalFiles { private String allergy; private String treatment; - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "medicalFile", cascade = CascadeType.ALL, orphanRemoval = true) private List<HealthHistorical> healthHistoricalList = new ArrayList<>(); - @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) + @OneToOne @JoinColumn(name = "patient_id", nullable = false) private Patient patient; - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "medicalFile", cascade = CascadeType.ALL, orphanRemoval = true) private List<MedicalDocument> documentList = new ArrayList<>(); @Column(nullable = false, updatable = false) private LocalDateTime createdAt = LocalDateTime.now(); - public MedicalFiles(Patient patient) { + public MedicalFile(Patient patient, String allergy, String treatment) { this.patient = patient; + this.allergy = allergy; + this.treatment = treatment; + this.healthHistoricalList = new ArrayList<>(); + this.documentList = new ArrayList<>(); } } diff --git a/src/main/java/com/projet/projetIndu/entities/Notification.java b/src/main/java/com/projet/projetIndu/entities/Notification.java index 3076f3a2012911a95de403078a2c3f860c087cb3..46f222f6dae1d13bc3b0876f8b9bd489ff01a963 100644 --- a/src/main/java/com/projet/projetIndu/entities/Notification.java +++ b/src/main/java/com/projet/projetIndu/entities/Notification.java @@ -31,4 +31,9 @@ public class Notification { @Column(nullable = false, updatable = false) private LocalDateTime createdAt = LocalDateTime.now(); + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private User user; + } diff --git a/src/main/java/com/projet/projetIndu/entities/Patient.java b/src/main/java/com/projet/projetIndu/entities/Patient.java index 8765aef4161baa280fe13098753b62481d6cbf61..047a23746e42ecaea0ffeeaabf901472d0fe22f5 100644 --- a/src/main/java/com/projet/projetIndu/entities/Patient.java +++ b/src/main/java/com/projet/projetIndu/entities/Patient.java @@ -4,28 +4,30 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.springframework.data.domain.Auditable; import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; +import java.util.ArrayList; import java.util.List; @Entity -@Table(name = "patients") @Getter @Setter +@DiscriminatorValue("PATIENT") @NoArgsConstructor public class Patient extends User { - @Column(nullable = false) private LocalDate dateOfBirth; + @OneToMany(mappedBy = "patient", cascade = CascadeType.ALL) + private List<Appointment> appointmentList = new ArrayList<>(); - public Patient(String firstName, String lastName, String phoneNumber, String email, String address, String username, String password, Role role) { - super(firstName, lastName, phoneNumber, email, address, username, password, role); - this.dateOfBirth = LocalDate.now(); + @OneToOne(mappedBy = "patient", cascade = CascadeType.ALL) + private MedicalFile medicalFile; + public Patient(String firstName, String lastName, LocalDate dateOfBirth, String phoneNumber, String email, String address, String password) { + super(firstName, lastName, phoneNumber, email, address, password); + this.role = Role.PATIENT; + this.dateOfBirth = dateOfBirth; } diff --git a/src/main/java/com/projet/projetIndu/entities/Statistic.java b/src/main/java/com/projet/projetIndu/entities/Statistic.java deleted file mode 100644 index 2dd50fce1eb2c74b7cffd7163c50e12f9c49e835..0000000000000000000000000000000000000000 --- a/src/main/java/com/projet/projetIndu/entities/Statistic.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.projet.projetIndu.entities; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; - -@Entity -@Table(name = "statistics") -@Getter -@Setter -@NoArgsConstructor -public class Statistic { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne - @JoinColumn(name = "doctor_id", nullable = false) - private Doctor doctor; - - @Column(nullable = false) - private LocalDate date; - - private int consultationCount; - private int patientCount; - private double totalIncome; - - @Column(nullable = false, updatable = false) - private LocalDateTime createdAt = LocalDateTime.now(); -} diff --git a/src/main/java/com/projet/projetIndu/entities/User.java b/src/main/java/com/projet/projetIndu/entities/User.java index 6d0b0f8cc5d67610431ad2644ea87b71dcd833cc..709f0de420efba52e07ace80394d1d2735e68240 100644 --- a/src/main/java/com/projet/projetIndu/entities/User.java +++ b/src/main/java/com/projet/projetIndu/entities/User.java @@ -16,7 +16,7 @@ import java.util.List; @NoArgsConstructor @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "role", discriminatorType = DiscriminatorType.STRING) -abstract class User { +public abstract class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -27,34 +27,40 @@ abstract class User { private String lastName; private String phoneNumber; @Column(unique = true, nullable = false) - private String email; + private String email; // Utilisé comme identifiant private String address; - @Column(nullable = false, unique = true) - private String username; @Column(nullable = false) private String password; @Enumerated(EnumType.STRING) - @Column(nullable = false) - private Role role; + @Column(nullable = false, updatable = false, insertable = false) + protected Role role; - @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Notification> notificationList = new ArrayList<>(); @Column(nullable = false, updatable = false) private LocalDateTime createdAt = LocalDateTime.now(); - protected User(String firstName, String lastName, String phoneNumber, String email, String address, String username, String password, Role role) { + protected User(String firstName, String lastName, String phoneNumber, String email, String address, String password) { this.firstName = firstName; this.lastName = lastName; this.phoneNumber = phoneNumber; this.email = email; this.address = address; - this.username = username; this.password = password; - this.role = role; } + + protected User(String firstName, String lastName, String phoneNumber, String email, String password) { + this.firstName = firstName; + this.lastName = lastName; + this.phoneNumber = phoneNumber; + this.email = email; + this.password = password; + } + + } diff --git a/src/main/java/com/projet/projetIndu/repositories/AdminRepository.java b/src/main/java/com/projet/projetIndu/repositories/AdminRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..c170bd69e3740a27b629b74605b27196721d0bde --- /dev/null +++ b/src/main/java/com/projet/projetIndu/repositories/AdminRepository.java @@ -0,0 +1,7 @@ +package com.projet.projetIndu.repositories; + +import com.projet.projetIndu.entities.Admin; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface AdminRepository extends JpaRepository<Admin, Long> { +} diff --git a/src/main/java/com/projet/projetIndu/repositories/MedicalFileRepository.java b/src/main/java/com/projet/projetIndu/repositories/MedicalFileRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..54f79ccf4eacc1bcce09978871aa887cb2df20e1 --- /dev/null +++ b/src/main/java/com/projet/projetIndu/repositories/MedicalFileRepository.java @@ -0,0 +1,8 @@ +package com.projet.projetIndu.repositories; + +import com.projet.projetIndu.entities.MedicalFile; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MedicalFileRepository extends JpaRepository<MedicalFile, Long> { + +} diff --git a/src/main/java/com/projet/projetIndu/repositories/MedicalFilesRepository.java b/src/main/java/com/projet/projetIndu/repositories/MedicalFilesRepository.java deleted file mode 100644 index 6d6d04f962c65f7d6ba1e5ec7ef3c737f2635db3..0000000000000000000000000000000000000000 --- a/src/main/java/com/projet/projetIndu/repositories/MedicalFilesRepository.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.projet.projetIndu.repositories; - -import com.projet.projetIndu.entities.MedicalFiles; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface MedicalFilesRepository extends JpaRepository<MedicalFiles, Long> { - -} diff --git a/src/main/java/com/projet/projetIndu/repositories/StatisticRepository.java b/src/main/java/com/projet/projetIndu/repositories/StatisticRepository.java deleted file mode 100644 index 23e51eb7da8a15dde3a1aad2f37267e8397c7585..0000000000000000000000000000000000000000 --- a/src/main/java/com/projet/projetIndu/repositories/StatisticRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.projet.projetIndu.repositories; - -import com.projet.projetIndu.entities.Statistic; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface StatisticRepository extends JpaRepository<Statistic, Long> { -} diff --git a/src/main/java/com/projet/projetIndu/repositories/UserRepository.java b/src/main/java/com/projet/projetIndu/repositories/UserRepository.java index 4469777bd63b5c7e998b99ff6b15ac938dc0d2d6..b0a4cd35c13138dcee7cf27f74a24e857a5a0b35 100644 --- a/src/main/java/com/projet/projetIndu/repositories/UserRepository.java +++ b/src/main/java/com/projet/projetIndu/repositories/UserRepository.java @@ -7,9 +7,6 @@ import java.util.Optional; public interface UserRepository extends JpaRepository<User,Long> { - //trouver l'utilisateur avec son username - Optional<User> findByUsername(String username); - - //vérifie si le username existe déjà - boolean existsByUsername(String username); + Optional<User> findByEmail(String email); + boolean existsByEmail(String email); } diff --git a/src/main/java/com/projet/projetIndu/security/CustomUserDetailsService.java b/src/main/java/com/projet/projetIndu/security/CustomUserDetailsService.java new file mode 100644 index 0000000000000000000000000000000000000000..35e1e524e775e656de41371a8554484cc27c1422 --- /dev/null +++ b/src/main/java/com/projet/projetIndu/security/CustomUserDetailsService.java @@ -0,0 +1,34 @@ +package com.projet.projetIndu.security; + +import com.projet.projetIndu.entities.User; +import com.projet.projetIndu.repositories.UserRepository; +import jakarta.transaction.Transactional; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class CustomUserDetailsService implements UserDetailsService { + + private final UserRepository userRepository; + + public CustomUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + @Transactional + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + User user = userRepository.findByEmail(email) + .orElseThrow(() -> new UsernameNotFoundException("Utilisateur non trouvé avec l'email : " + email)); + + return org.springframework.security.core.userdetails.User.builder() + .username(user.getEmail()) // L'email sert d'identifiant + .password(user.getPassword()) // Mot de passe hashé en BDD + .roles(user.getRole().name()) // Récupération du rôle + .build(); + } + +} + diff --git a/src/main/java/com/projet/projetIndu/security/SecurityConfig.java b/src/main/java/com/projet/projetIndu/security/SecurityConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..b40bb41a80957938ad3f708ac00cbc747cf0d0a5 --- /dev/null +++ b/src/main/java/com/projet/projetIndu/security/SecurityConfig.java @@ -0,0 +1,52 @@ +package com.projet.projetIndu.security; + +import com.projet.projetIndu.repositories.UserRepository; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +@Configuration +public class SecurityConfig { + + @Bean + public BCryptPasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .authorizeHttpRequests(auth -> auth + .requestMatchers("/admin/**").hasRole("ADMIN") // Accès réservé aux admins + .requestMatchers("/doctors/**").hasRole("DOCTOR") // Accès aux médecins + .requestMatchers("/patients/**").hasRole("PATIENT") // Accès aux patients + .anyRequest().authenticated() + ) + .formLogin(form -> form + .loginPage("/login") + .usernameParameter("email") + .defaultSuccessUrl("/", true) + .permitAll() + ) + .logout(logout -> logout + .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) + .logoutSuccessUrl("/login?logout") + .permitAll() + ); + + + return http.build(); + } + + @Bean + public UserDetailsService userDetailsService(UserRepository userRepository) { + return new CustomUserDetailsService(userRepository); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/projet/projetIndu/services/MedicalFilesService.java b/src/main/java/com/projet/projetIndu/services/MedicalFileService.java similarity index 57% rename from src/main/java/com/projet/projetIndu/services/MedicalFilesService.java rename to src/main/java/com/projet/projetIndu/services/MedicalFileService.java index b81b8f6e51a45b64ac00a28bfaacd537ec496b10..e016e43aa52b68cce1801f77899813c88219e6ea 100644 --- a/src/main/java/com/projet/projetIndu/services/MedicalFilesService.java +++ b/src/main/java/com/projet/projetIndu/services/MedicalFileService.java @@ -1,59 +1,66 @@ package com.projet.projetIndu.services; -import com.projet.projetIndu.entities.Doctor; +import com.projet.projetIndu.entities.HealthHistorical; import com.projet.projetIndu.entities.MedicalDocument; -import com.projet.projetIndu.entities.MedicalFiles; -import com.projet.projetIndu.entities.Patient; -import com.projet.projetIndu.repositories.MedicalFilesRepository; -import jakarta.annotation.PostConstruct; -import jakarta.persistence.EntityNotFoundException; +import com.projet.projetIndu.entities.MedicalFile; +import com.projet.projetIndu.repositories.MedicalFileRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @Service -public class MedicalFilesService { - private final MedicalFilesRepository medicalFilesRepository; - //private final List<MedicalFiles> medicalFilesList = new ArrayList<>(); +public class MedicalFileService { + private final MedicalFileRepository medicalFileRepository; + //private final List<MedicalFile> medicalFilesList = new ArrayList<>(); @Autowired - public MedicalFilesService(MedicalFilesRepository medicalFilesRepository) { - this.medicalFilesRepository = medicalFilesRepository; + public MedicalFileService(MedicalFileRepository medicalFileRepository) { + this.medicalFileRepository = medicalFileRepository; } - public List<MedicalFiles> getAllMedicalFiles() { - return medicalFilesRepository.findAll(); + public List<MedicalFile> getAllMedicalFiles() { + return medicalFileRepository.findAll(); } - public Optional<MedicalFiles> getMedicalFileById(Long id) { - return medicalFilesRepository.findById(id); + public Optional<MedicalFile> getMedicalFileById(Long id) { + return medicalFileRepository.findById(id); } - public MedicalFiles saveMedicalFiles(MedicalFiles medicalFiles) { - return medicalFilesRepository.save(medicalFiles); + public MedicalFile saveMedicalFiles(MedicalFile medicalFile) { + return medicalFileRepository.save(medicalFile); } public void deleteMedicalFileById(Long id) { - medicalFilesRepository.deleteById(id); + medicalFileRepository.deleteById(id); } - public void updateMedicalFileHistory(Long id, String history) { - Optional<MedicalFiles> optionalMedicalFile = medicalFilesRepository.findById(id); + public void updateMedicalFileHistory(Long id, String antecedent, String notes, LocalDate consultationDate) { + Optional<MedicalFile> optionalMedicalFile = medicalFileRepository.findById(id); if (optionalMedicalFile.isPresent()) { - MedicalFiles medicalFile = optionalMedicalFile.get(); - medicalFile.setHistory(history); // Mise à jour de l'historique - medicalFilesRepository.save(medicalFile); + MedicalFile medicalFile = optionalMedicalFile.get(); + + HealthHistorical healthHistorical = new HealthHistorical(); + healthHistorical.setAntecedent(antecedent); + healthHistorical.setNotes(notes); + healthHistorical.setConsultationDate(consultationDate); + healthHistorical.setMedicalFile(medicalFile); + + medicalFile.getHealthHistoricalList().add(healthHistorical); + + medicalFileRepository.save(medicalFile); } } + + public void uploadMedicalFileDocument(Long medicalFileId, MultipartFile file) throws IOException { - MedicalFiles medicalFile = medicalFilesRepository.findById(medicalFileId) + MedicalFile medicalFile = medicalFileRepository.findById(medicalFileId) .orElseThrow(() -> new RuntimeException("Dossier médical introuvable")); MedicalDocument document = new MedicalDocument(); @@ -62,8 +69,8 @@ public class MedicalFilesService { document.setFileData(file.getBytes()); document.setMedicalFile(medicalFile); - medicalFile.getDocuments().add(document); - medicalFilesRepository.save(medicalFile); + medicalFile.getDocumentList().add(document); + medicalFileRepository.save(medicalFile); } @@ -85,14 +92,14 @@ public class MedicalFilesService { // Patient patient1 = new Patient(1L, "Pierre", "Martinez", "10/05/1980", "0654789652", "jean.dupont@email.com", "1 rue de Paris", "Pollen", "Aspirine"); // Doctor doctor1 = new Doctor(1L, "Jean", "Dupont", "Cardiologue", "jean.dupont@example.com"); // -// medicalFilesList.add(new MedicalFiles(1L, patient1, doctor1, "Aucun antécédent majeur.")); +// medicalFilesList.add(new MedicalFile(1L, patient1, doctor1, "Aucun antécédent majeur.")); // } // -// public List<MedicalFiles> getAllMedicalFiles() { +// public List<MedicalFile> getAllMedicalFiles() { // return medicalFilesList; // } -// public Optional<MedicalFiles> getMedicalFileById(Long id) { +// public Optional<MedicalFile> getMedicalFileById(Long id) { // return medicalFilesList.stream().filter(mf -> mf.getId().equals(id)).findFirst(); // } @@ -104,7 +111,7 @@ public class MedicalFilesService { // } /// Pour le codage en dur (à retirer ensuite avec la BDD) -// public List<MedicalFiles> getAllMedicalFiles() { +// public List<MedicalFile> getAllMedicalFiles() { // // Récupérer les patients et médecins en dur // Patient patient1 = new Patient(1L, "Pierre", "Martinez", "10/05/1980", "0654789652", "jean.dupont@email.com", "1 rue de Paris", "Pollen", "Aspirine"); // Patient patient2 = new Patient(2L, "Marine", "Boz", "19/10/2001", "066666666", "marine.boz@email.com", "10 rue de Marseille", "Péniciline", "Bisoce"); @@ -115,9 +122,9 @@ public class MedicalFilesService { // Doctor doctor3 = new Doctor(3L, "Paul", "Durand", "Généraliste", "paul.durand@example.com"); // // return Arrays.asList( -// new MedicalFiles(1L, patient1, doctor1, "Aucun antécédent majeur."), -// new MedicalFiles(2L, patient2, doctor2, "Allergie à la pénicilline."), -// new MedicalFiles(3L, patient3, doctor3, "Diabète de type 2.") +// new MedicalFile(1L, patient1, doctor1, "Aucun antécédent majeur."), +// new MedicalFile(2L, patient2, doctor2, "Allergie à la pénicilline."), +// new MedicalFile(3L, patient3, doctor3, "Diabète de type 2.") // ); // } @@ -129,13 +136,13 @@ public class MedicalFilesService { // .ifPresent(mf -> mf.setDocuments(document)); // Mise à jour du document // } // // DUR -// public void saveMedicalFile(MedicalFiles medicalFile) { -// medicalFilesRepository.save(medicalFile); // Persiste en base +// public void saveMedicalFile(MedicalFile medicalFile) { +// medicalFileRepository.save(medicalFile); // Persiste en base // } // ///En dur -// public Optional<MedicalFiles> getMedicalFileById(Long id) { -// List<MedicalFiles> medicalFilesList = getAllMedicalFiles(); // Récupère les données en dur +// public Optional<MedicalFile> getMedicalFileById(Long id) { +// List<MedicalFile> medicalFilesList = getAllMedicalFiles(); // Récupère les données en dur // return medicalFilesList.stream() // .filter(medicalFile -> medicalFile.getId().equals(id)) // .findFirst(); @@ -143,9 +150,9 @@ public class MedicalFilesService { // // //En dur (remplace saveMedicalFiles pour l'instant) // public void updateMedicalFile(Long id, String history, String documents) { -// List<MedicalFiles> medicalFilesList = getAllMedicalFiles(); +// List<MedicalFile> medicalFilesList = getAllMedicalFiles(); // -// for (MedicalFiles file : medicalFilesList) { +// for (MedicalFile file : medicalFilesList) { // if (file.getId().equals(id)) { // file.setHistory(history); // file.setDocuments(documents.getBytes()); diff --git a/src/main/java/com/projet/projetIndu/services/StatisticService.java b/src/main/java/com/projet/projetIndu/services/StatisticService.java deleted file mode 100644 index 3f6b19ad33d3ebfe96e0e28e0253b5f6694f85b1..0000000000000000000000000000000000000000 --- a/src/main/java/com/projet/projetIndu/services/StatisticService.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.projet.projetIndu.services; - -import com.projet.projetIndu.entities.Statistic; -import com.projet.projetIndu.repositories.StatisticRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -@Service -public class StatisticService { - private final StatisticRepository statisticRepository; - - @Autowired - public StatisticService(StatisticRepository statisticRepository) { - this.statisticRepository = statisticRepository; - } - - public List<Statistic> getAllStatistics() { - return statisticRepository.findAll(); - } - - public Optional<Statistic> getStatisticById(Long id) { - return statisticRepository.findById(id); - } - - public Statistic saveStatistic(Statistic statistic) { - return statisticRepository.save(statistic); - } - - public void deleteStatisticById(Long id) { - statisticRepository.deleteById(id); - } - -} diff --git a/src/main/java/com/projet/projetIndu/services/UserService.java b/src/main/java/com/projet/projetIndu/services/UserService.java index f0cf7237d51bffa0efb488745030cb576f8bfbe4..c59a4bb7b9a2b9319c04aa96b9956edbb0690c37 100644 --- a/src/main/java/com/projet/projetIndu/services/UserService.java +++ b/src/main/java/com/projet/projetIndu/services/UserService.java @@ -1,7 +1,7 @@ package com.projet.projetIndu.services; -import com.projet.projetIndu.entities.Role; -import com.projet.projetIndu.entities.User; +import com.projet.projetIndu.dto.UserRegistrationDTO; +import com.projet.projetIndu.entities.*; import com.projet.projetIndu.repositories.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; @@ -10,13 +10,15 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.util.List; import java.util.Optional; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import static com.projet.projetIndu.entities.Role.*; @Service -public class UserService implements UserDetailsService{ +public class UserService implements UserDetailsService { private final UserRepository userRepository; private final BCryptPasswordEncoder passwordEncoder; @@ -30,8 +32,8 @@ public class UserService implements UserDetailsService{ return userRepository.findAll(); } - public Optional<User> getUserByUsername(String username) { - return userRepository.findByUsername(username); + public Optional<User> getUserByUsername(String email) { + return userRepository.findByEmail(email); } public Optional<User> getUserById(Long id) { @@ -46,20 +48,63 @@ public class UserService implements UserDetailsService{ userRepository.deleteById(id); } - public User registerUser(String username, String password, Role role) { - String encodedPassword = passwordEncoder.encode(password); - User user = new User(username, encodedPassword, role); + public User registerUser(UserRegistrationDTO userDTO) { + // Vérifier si un utilisateur avec cet email existe déjà + if (userRepository.existsByEmail(userDTO.getEmail())) { + throw new IllegalArgumentException("Email already taken"); + } + + String encodedPassword = passwordEncoder.encode(userDTO.getPassword()); + User user; + + try { + Role role = Role.valueOf(String.valueOf(userDTO.getRole())); // Conversion du String en Role Enum + + switch (role) { + case DOCTOR -> { + Doctor doctor = new Doctor(); + doctor.setSpeciality(userDTO.getSpeciality()); + user = doctor; + } + case PATIENT -> { + Patient patient = new Patient(); + patient.setDateOfBirth(userDTO.getDateOfBirth()); + patient.setAddress(userDTO.getAddress()); + user = patient; + } + case ADMIN -> { + user = new Admin(); + } + default -> throw new IllegalArgumentException("Invalid role"); + } + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Invalid role provided: " + userDTO.getRole()); + } + + // Remplissage des données utilisateur + user.setFirstName(userDTO.getFirstName()); + user.setLastName(userDTO.getLastName()); + user.setPhoneNumber(userDTO.getPhoneNumber()); + user.setEmail(userDTO.getEmail()); + user.setPassword(encodedPassword); + return userRepository.save(user); } + + + @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = userRepository.findByUsername(username) + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + User user = userRepository.findByEmail(email) .orElseThrow(() -> new UsernameNotFoundException("User not found")); + return org.springframework.security.core.userdetails.User - .withUsername(user.getUsername()) + .withUsername(user.getEmail()) .password(user.getPassword()) - .roles(user.getRole().name()) + .authorities(user.getClass().getSimpleName()) // Utilisation de la classe comme rôle .build(); } + } + diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 60271139666e855654cd601699e982c74e79c0d7..637d0247258236c716ec851121420aac3f116ff2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,20 +1,19 @@ spring.application.name=projetIndu + spring.datasource.url=jdbc:mysql://localhost:3306/projet spring.datasource.username=root spring.datasource.password=jessie spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect -spring.jpa.hibernate.ddl-auto=update +spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true -spring.jpa.properties.hibernate.format_sql=true + spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.cache=false + spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-request-size=100MB spring.mvc.hiddenmethod.filter.enabled=true - - - -spring.banner.location=banner.txt \ No newline at end of file +spring.banner.location=banner.txt diff --git a/src/main/resources/sqls/create-tables.sql b/src/main/resources/sqls/create-tables.sql new file mode 100644 index 0000000000000000000000000000000000000000..7325dd15b416384fd1584fce0630b9c7a180815d --- /dev/null +++ b/src/main/resources/sqls/create-tables.sql @@ -0,0 +1,68 @@ +CREATE TABLE users ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + first_name VARCHAR(255) NOT NULL, + last_name VARCHAR(255) NOT NULL, + phone_number VARCHAR(255), + email VARCHAR(255) UNIQUE NOT NULL, + address VARCHAR(255), + password VARCHAR(255) NOT NULL, + role VARCHAR(50) NOT NULL, + created_at DATETIME NOT NULL +) ENGINE=InnoDB; + +CREATE TABLE notifications ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + content TEXT, + type VARCHAR(50) NOT NULL, + status VARCHAR(50) NOT NULL, + created_at DATETIME NOT NULL +) ENGINE=InnoDB; + +CREATE TABLE invoices ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + amount DOUBLE NOT NULL, + issue_date DATETIME NOT NULL, + status VARCHAR(50) NOT NULL, + created_at DATETIME NOT NULL +) ENGINE=InnoDB; + +CREATE TABLE appointments ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + patient_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + invoice_id BIGINT, + date_time DATETIME NOT NULL, + status VARCHAR(50) NOT NULL, + reason TEXT NOT NULL, + created_at DATETIME NOT NULL, + FOREIGN KEY (patient_id) REFERENCES users(id), + FOREIGN KEY (doctor_id) REFERENCES users(id), + FOREIGN KEY (invoice_id) REFERENCES invoices(id) +) ENGINE=InnoDB; + +CREATE TABLE medical_files ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + allergy VARCHAR(255), + treatment VARCHAR(255), + patient_id BIGINT UNIQUE, + created_at DATETIME NOT NULL, + FOREIGN KEY (patient_id) REFERENCES users(id) +) ENGINE=InnoDB; + +CREATE TABLE health_historical ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + antecedent VARCHAR(255), + notes VARCHAR(255), + consultation_date DATE, + medical_file_id BIGINT NOT NULL, + FOREIGN KEY (medical_file_id) REFERENCES medical_files(id) +) ENGINE=InnoDB; + +CREATE TABLE medical_documents ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + file_name VARCHAR(255), + file_type VARCHAR(255), + file_data LONGBLOB, + medical_file_id BIGINT NOT NULL, + FOREIGN KEY (medical_file_id) REFERENCES medical_files(id) +) ENGINE=InnoDB; \ No newline at end of file diff --git a/src/main/resources/sqls/insert-values.sql b/src/main/resources/sqls/insert-values.sql new file mode 100644 index 0000000000000000000000000000000000000000..a327f5e680a3e602bb0433df309422da0168d51f --- /dev/null +++ b/src/main/resources/sqls/insert-values.sql @@ -0,0 +1,26 @@ +-- Insertion des utilisateurs (médecins et patients) +INSERT INTO users (first_name, last_name, phone_number, email, address, password, role, created_at) VALUES + ('Jean', 'Dupont', '0444444444', 'jean.dupont@example.com', NULL, '$2a$10$x3BWC9e/K6cSNdoc3fsmOemY0NyAU5VTDFxkgkUsqKF1Jgvpu3Zwi', 'DOCTOR', NOW()), + ('Sophie', 'Martin', '0455555555', 'sophie.martin@example.com', NULL, '$2a$10$x3BWC9e/K6cSNdoc3fsmOemY0NyAU5VTDFxkgkUsqKF1Jgvpu3Zwi', 'DOCTOR', NOW()), + ('Paul', 'Durand', '0678901234', 'paul.durand@example.com', '5 Rue des Lilas', '$2a$10$tVWsBUEczExWqyvK5vfsnOQpaWHA4rmuXB73xuzApNELhIpZqhl0W', 'PATIENT', NOW()), + ('Alice', 'Lemoine', '0687654321', 'alice.lemoine@example.com', '8 Rue du Lac', '$2a$10$tVWsBUEczExWqyvK5vfsnOQpaWHA4rmuXB73xuzApNELhIpZqhl0W', 'PATIENT', NOW()); + +-- Récupérer les IDs des utilisateurs insérés (médecins et patients) +SET @doctor1Id = (SELECT id FROM users WHERE email = 'jean.dupont@example.com'); +SET @doctor2Id = (SELECT id FROM users WHERE email = 'sophie.martin@example.com'); +SET @patient1Id = (SELECT id FROM users WHERE email = 'paul.durand@example.com'); +SET @patient2Id = (SELECT id FROM users WHERE email = 'alice.lemoine@example.com'); + +-- Insertion des dossiers médicaux +INSERT INTO medical_files (patient_id, allergy, treatment, created_at) VALUES + (@patient1Id, 'Arachide', 'Ibuprofene', NOW()), + (@patient2Id, 'Pollen', 'Bisoprolol', NOW()); + +-- Récupérer les IDs des dossiers médicaux insérés +SET @file1Id = (SELECT id FROM medical_files WHERE patient_id = @patient1Id); +SET @file2Id = (SELECT id FROM medical_files WHERE patient_id = @patient2Id); + +-- Insertion des rendez-vous +INSERT INTO appointments (patient_id, doctor_id, invoice_id, date_time, status, reason, created_at) VALUES + (@patient1Id, @doctor1Id, NULL, DATE_ADD(NOW(), INTERVAL 2 DAY), 'CONFIRMED', 'Consultation de suivi', NOW()), + (@patient2Id, @doctor2Id, NULL, DATE_ADD(NOW(), INTERVAL 7 DAY), 'PENDING', 'Bilan annuel', NOW()); \ No newline at end of file diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 214562e5f629471781f6c655b108850cdc30efbd..5a592207102ca6fb2034af5c488b23ee0736459d 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -15,8 +15,8 @@ <h1 class="text-2xl font-semibold text-gray-900">Gestion Dossiers Médicaux</h1> <div class="space-x-4"> <a href="/doctors/dashboard" class="px-6 py-2 bg-green-500 text-white rounded-md hover:bg-green-600">Professionnel de santé</a> - <a href="/login" class="text-blue-500 hover:text-blue-700">Connexion</a> - <a href="/register" class="text-blue-500 hover:text-blue-700">Inscription</a> + <a th:href="@{/login}" class="text-blue-500 hover:text-blue-700">Connexion</a> + <a th:href="@{/register}" class="text-blue-500 hover:text-blue-700">Inscription</a> </div> </div> </div> diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000000000000000000000000000000000000..f2b5c1f4a3e4095a194fd363c82f7e304a970cff --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <title>Connexion</title> + <link rel="stylesheet" th:href="@{/css/styles.css}"> + <link rel="stylesheet" + href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> +</head> +<body class="bg-light"> +<div class="container d-flex justify-content-center align-items-center vh-100"> + <div class="card shadow p-4" style="width: 350px; border-radius: 10px;"> + <h3 class="text-center mb-3">Connexion</h3> + <form th:action="@{/login}" method="post"> + <div class="mb-3"> + <label for="username" class="form-label">Nom d'utilisateur</label> + <input type="text" class="form-control" id="username" name="username" required> + </div> + <div class="mb-3"> + <label for="password" class="form-label">Mot de passe</label> + <input type="password" class="form-control" id="password" name="password" required> + </div> + <button type="submit" class="btn btn-primary w-100">Se connecter</button> + </form> + <div class="text-center mt-3"> + <a href="#" class="text-decoration-none">Mot de passe oublié ?</a> + </div> + <div class="text-center mt-3"> + <a th:href="@{/register}" class="btn btn-outline-secondary w-100">Créer un compte</a> + </div> + </div> +</div> +</body> +</html> diff --git a/src/main/resources/templates/medical-files.html b/src/main/resources/templates/medical-files.html index 9643afef3f8b38c020c27aed66b5b5039c64485e..abb549337a29fac68dd406f91819d8dec727d305 100644 --- a/src/main/resources/templates/medical-files.html +++ b/src/main/resources/templates/medical-files.html @@ -23,7 +23,7 @@ </tr> </thead> <tbody> - <tr th:each="file : ${medicalFiles}"> + <tr th:each="file : ${medicalFile}"> <td th:text="${file.id}"></td> <td th:text="${file.patient.firstName} + ' ' + ${file.patient.lastName}"></td> <td th:text="${file.doctor.firstName} + ' ' + ${file.doctor.lastName}"></td> diff --git a/src/main/resources/templates/register.html b/src/main/resources/templates/register.html new file mode 100644 index 0000000000000000000000000000000000000000..5dbff8b24e3bd665934389ef8ff4146a63e16954 --- /dev/null +++ b/src/main/resources/templates/register.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head> + <meta charset="UTF-8"> + <title>Inscription</title> + <link rel="stylesheet" th:href="@{/css/styles.css}"> + <link rel="stylesheet" + href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"> +</head> +<body class="bg-light"> +<div class="container d-flex justify-content-center align-items-center vh-100"> + <div class="card shadow p-4" style="width: 350px; border-radius: 10px;"> + <h3 class="text-center mb-3">Inscription</h3> + <form th:action="@{/register}" method="post"> + <div class="mb-3"> + <label for="firstName" class="form-label">Prénom</label> + <input type="text" class="form-control" id="firstName" name="firstName" required> + </div> + <div class="mb-3"> + <label for="lastName" class="form-label">Nom</label> + <input type="text" class="form-control" id="lastName" name="lastName" required> + </div> + <div class="mb-3"> + <label for="email" class="form-label">Email</label> + <input type="email" class="form-control" id="email" name="email" required> + </div> + <div class="mb-3"> + <label for="password" class="form-label">Mot de passe</label> + <input type="password" class="form-control" id="password" name="password" required> + </div> + <button type="submit" class="btn btn-success w-100">S'inscrire</button> + </form> + <div class="text-center mt-3"> + <a th:href="@{/login}" class="btn btn-outline-secondary w-100">J'ai déjà un compte</a> + </div> + </div> +</div> +</body> +</html>