From 80b2d087e484f023e4be1c47c466cf0709e909ff Mon Sep 17 00:00:00 2001
From: Pierre Tellier <piair338@gmail.com>
Date: Fri, 28 Feb 2025 11:45:55 +0100
Subject: [PATCH] feat: implemented date filtration and a utils service to
 prevent code ducplication

---
 .../myinpulse/model/DelAppointment.java       |  8 ---
 .../enseirb/myinpulse/model/DelProject.java   |  7 ---
 .../enseirb/myinpulse/model/DelReport.java    |  6 --
 .../enseirb/myinpulse/model/LCSection.java    |  7 ---
 .../repository/SectionCellRepository.java     |  5 ++
 .../service/EntrepreneurApiService.java       | 27 +++-----
 .../myinpulse/service/SharedApiService.java   | 56 ++++++-----------
 .../myinpulse/service/UtilsService.java       | 62 +++++++++++++++++++
 .../service/database/SectionCellService.java  |  6 ++
 9 files changed, 99 insertions(+), 85 deletions(-)
 delete mode 100644 MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelAppointment.java
 delete mode 100644 MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelProject.java
 delete mode 100644 MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelReport.java
 delete mode 100644 MyINPulse-back/src/main/java/enseirb/myinpulse/model/LCSection.java
 create mode 100644 MyINPulse-back/src/main/java/enseirb/myinpulse/service/UtilsService.java

diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelAppointment.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelAppointment.java
deleted file mode 100644
index f29a2eb..0000000
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelAppointment.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package enseirb.myinpulse.model;
-
-public class DelAppointment {
-    int validated;
-    int[] akserId;
-    int[] destId;
-    String date; // TODO: date type ?
-}
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelProject.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelProject.java
deleted file mode 100644
index 25a21f9..0000000
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelProject.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package enseirb.myinpulse.model;
-
-public class DelProject {
-    int projectId;
-    String projectName;
-    String projectDescription;
-}
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelReport.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelReport.java
deleted file mode 100644
index bbdbae8..0000000
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/DelReport.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package enseirb.myinpulse.model;
-
-public class DelReport {
-    int projectId;
-    String reportContent;
-}
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/LCSection.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/model/LCSection.java
deleted file mode 100644
index 4fd6ec4..0000000
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/model/LCSection.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package enseirb.myinpulse.model;
-
-// TODO: is this redundant with the Section class from the database ?
-// TODO: In the one hand it represent the same data, and on the other it should be much lighter.
-// TODO: btw why does a LC section have an administrator ?
-
-public class LCSection {}
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/SectionCellRepository.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/SectionCellRepository.java
index 674c549..4ad5b51 100644
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/SectionCellRepository.java
+++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/repository/SectionCellRepository.java
@@ -6,8 +6,13 @@ import enseirb.myinpulse.model.SectionCell;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.rest.core.annotation.RepositoryRestResource;
 
+import java.time.LocalDateTime;
+
 @RepositoryRestResource
 public interface SectionCellRepository extends JpaRepository<SectionCell, Long> {
 
     Iterable<SectionCell> findByProjectSectionCellAndSectionId(Project project, long sectionId);
+
+    Iterable<SectionCell> findByProjectSectionCellAndSectionIdAndModificationDateBefore(
+            Project project, long sectionId, LocalDateTime date);
 }
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/EntrepreneurApiService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/EntrepreneurApiService.java
index 4e04f88..1bab1a1 100644
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/EntrepreneurApiService.java
+++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/EntrepreneurApiService.java
@@ -1,13 +1,9 @@
 package enseirb.myinpulse.service;
 
-import enseirb.myinpulse.model.Entrepreneur;
 import enseirb.myinpulse.model.Project;
 import enseirb.myinpulse.model.SectionCell;
-import enseirb.myinpulse.model.User;
-import enseirb.myinpulse.service.database.EntrepreneurService;
 import enseirb.myinpulse.service.database.ProjectService;
 import enseirb.myinpulse.service.database.SectionCellService;
-import enseirb.myinpulse.service.database.UserService;
 
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -23,28 +19,19 @@ public class EntrepreneurApiService {
 
     private final SectionCellService sectionCellService;
     private final ProjectService projectService;
-    private final UserService userService;
-    private final EntrepreneurService entrepreneurService;
+    private final UtilsService utilsService;
 
     @Autowired
     EntrepreneurApiService(
             SectionCellService sectionCellService,
             ProjectService projectService,
-            UserService userService,
-            EntrepreneurService entrepreneurService) {
+            UtilsService utilsService) {
         this.sectionCellService = sectionCellService;
         this.projectService = projectService;
-        this.userService = userService;
-        this.entrepreneurService = entrepreneurService;
+        this.utilsService = utilsService;
     }
 
-    // Create utils file ?
-    Boolean isAllowedToCheckProject(String mail, long projectId) {
-        User user = this.userService.getUserByEmail(mail);
-        Entrepreneur entrepreneur = this.entrepreneurService.getEntrepreneurById(user.getIdUser());
-        Project project = this.projectService.getProjectById(projectId);
-        return entrepreneur.getProjectParticipation() == project;
-    }
+
 
     public void editSectionCell(Long sectionCellId, SectionCell sectionCell, String mail) {
         SectionCell editSectionCell = sectionCellService.getSectionCellById(sectionCellId);
@@ -53,7 +40,7 @@ public class EntrepreneurApiService {
             throw new ResponseStatusException(
                     HttpStatus.NOT_FOUND, "Cette cellule de section n'existe pas");
         }
-        if (!isAllowedToCheckProject(mail, this.sectionCellService.getProjectId(sectionCellId))) {
+        if (!utilsService.isAllowedToCheckProject(mail, this.sectionCellService.getProjectId(sectionCellId))) {
             logger.warn(
                     "User {} tried to edit section cells {} of the project {} but is not allowed to.",
                     mail,
@@ -81,7 +68,7 @@ public class EntrepreneurApiService {
             throw new ResponseStatusException(
                     HttpStatus.NOT_FOUND, "Cette cellule de section n'existe pas");
         }
-        if (!isAllowedToCheckProject(mail, this.sectionCellService.getProjectId(sectionCellId))) {
+        if (!utilsService.isAllowedToCheckProject(mail, this.sectionCellService.getProjectId(sectionCellId))) {
             logger.warn(
                     "User {} tried to remove section cells {} of the project {} but is not allowed to.",
                     mail,
@@ -104,7 +91,7 @@ public class EntrepreneurApiService {
             throw new ResponseStatusException(
                     HttpStatus.BAD_REQUEST, "La cellule de section fournie est vide");
         }
-        if (!isAllowedToCheckProject(
+        if (!utilsService.isAllowedToCheckProject(
                 mail, this.sectionCellService.getProjectId(sectionCell.getIdSectionCell()))) {
             logger.warn(
                     "User {} tried to add a section cell to the project {} but is not allowed to.",
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java
index e5983e0..98cd05b 100644
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java
+++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/SharedApiService.java
@@ -10,6 +10,8 @@ import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
 import org.springframework.web.server.ResponseStatusException;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -18,57 +20,32 @@ public class SharedApiService {
 
     protected static final Logger logger = LogManager.getLogger();
 
-    private final AdministratorService administratorService;
-    private final UserService userService;
     private final ProjectService projectService;
     private final EntrepreneurService entrepreneurService;
     private final SectionCellService sectionCellService;
     private final AppointmentService appointmentService;
 
+    private final UtilsService utilsService;
+
     @Autowired
     SharedApiService(
-            AdministratorService administratorService,
-            UserService userService,
             ProjectService projectService,
             EntrepreneurService entrepreneurService,
             SectionCellService sectionCellService,
-            AppointmentService appointmentService) {
-        this.administratorService = administratorService;
-        this.userService = userService;
+            AppointmentService appointmentService,
+            UtilsService utilsService) {
         this.projectService = projectService;
         this.entrepreneurService = entrepreneurService;
         this.sectionCellService = sectionCellService;
         this.appointmentService = appointmentService;
-    }
-
-    // TODO: test
-    Boolean isAnAdmin(String mail) {
-        try {
-            long userId = this.userService.getUserByEmail(mail).getIdUser();
-            Administrator a = this.administratorService.getAdministratorById(userId);
-            return true;
-        } catch (ResponseStatusException e) {
-            logger.info(e);
-            return false;
-        }
-    }
-
-    // TODO: test
-    Boolean isAllowedToCheckProject(String mail, long projectId) {
-        if (isAnAdmin(mail)) {
-            return true;
-        }
-        User user = this.userService.getUserByEmail(mail);
-        Entrepreneur entrepreneur = this.entrepreneurService.getEntrepreneurById(user.getIdUser());
-        Project project = this.projectService.getProjectById(projectId);
-        return entrepreneur.getProjectParticipation() == project;
+        this.utilsService = utilsService;
     }
 
     // TODO filter this with date
     public Iterable<SectionCell> getSectionCells(
             long projectId, long sectionId, String date, String mail) {
 
-        if (!isAllowedToCheckProject(mail, projectId)) {
+        if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
             logger.warn(
                     "User {} tried to check section cells of the project {} but is not allowed to.",
                     mail,
@@ -76,13 +53,18 @@ public class SharedApiService {
             throw new ResponseStatusException(
                     HttpStatus.UNAUTHORIZED, "You're not allowed to check this project");
         }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+        LocalDateTime dateTime = LocalDateTime.parse(date, formatter);
+
         Project project = this.projectService.getProjectById(projectId);
-        return this.sectionCellService.getSectionCellsByProject(project, sectionId);
+        return this.sectionCellService.getSectionCellsByProjectAndSectionIdBeforeDate(
+                project, sectionId, dateTime);
     }
 
     // TODO: test
     public Iterable<Entrepreneur> getEntrepreneursByProjectId(long projectId, String mail) {
-        if (!isAllowedToCheckProject(mail, projectId)) {
+        if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
             logger.warn(
                     "User {} tried to check the member of the project {} but is not allowed to.",
                     mail,
@@ -94,9 +76,9 @@ public class SharedApiService {
         return this.entrepreneurService.GetEntrepreneurByProject(project);
     }
 
-    // TODO: test, protect via email
+    // TODO: test
     public Administrator getAdminByProjectId(long projectId, String mail) {
-        if (!isAllowedToCheckProject(mail, projectId)) {
+        if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
             logger.warn(
                     "User {} tried to check the admin of the project {} but is not allowed to.",
                     mail,
@@ -110,7 +92,7 @@ public class SharedApiService {
 
     // TODO
     public Iterable<Appointment> getAppointmentsByProjectId(long projectId, String mail) {
-        if (!isAllowedToCheckProject(mail, projectId)) {
+        if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
             logger.warn(
                     "User {} tried to check the appointments related to the project {} but is not allowed to.",
                     mail,
@@ -145,7 +127,7 @@ public class SharedApiService {
                         .getFirst()
                         .getProjectSectionCell()
                         .getIdProject();
-        if (!isAllowedToCheckProject(mail, projectId)) {
+        if (!utilsService.isAllowedToCheckProject(mail, projectId)) {
             logger.warn(
                     "User {} tried to generate the PDF report {} related to the appointment {} but is not allowed to.",
                     mail,
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/UtilsService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/UtilsService.java
new file mode 100644
index 0000000..a49e82e
--- /dev/null
+++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/UtilsService.java
@@ -0,0 +1,62 @@
+package enseirb.myinpulse.service;
+
+import enseirb.myinpulse.model.Administrator;
+import enseirb.myinpulse.model.Entrepreneur;
+import enseirb.myinpulse.model.Project;
+import enseirb.myinpulse.model.User;
+import enseirb.myinpulse.service.database.AdministratorService;
+import enseirb.myinpulse.service.database.EntrepreneurService;
+import enseirb.myinpulse.service.database.ProjectService;
+import enseirb.myinpulse.service.database.UserService;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.server.ResponseStatusException;
+
+@Service
+public class UtilsService {
+
+    protected static final Logger logger = LogManager.getLogger();
+
+    private final UserService userService;
+    private final ProjectService projectService;
+    private final EntrepreneurService entrepreneurService;
+    private final AdministratorService administratorService;
+
+    @Autowired
+    UtilsService(
+            ProjectService projectService,
+            UserService userService,
+            EntrepreneurService entrepreneurService,
+            AdministratorService administratorService) {
+        this.userService = userService;
+        this.projectService = projectService;
+        this.entrepreneurService = entrepreneurService;
+        this.administratorService = administratorService;
+    }
+
+    // TODO: test?
+    public Boolean isAllowedToCheckProject(String mail, long projectId) {
+        if (isAnAdmin(mail)) {
+            return true;
+        }
+        User user = this.userService.getUserByEmail(mail);
+        Entrepreneur entrepreneur = this.entrepreneurService.getEntrepreneurById(user.getIdUser());
+        Project project = this.projectService.getProjectById(projectId);
+        return entrepreneur.getProjectParticipation() == project;
+    }
+
+    // TODO: test
+    Boolean isAnAdmin(String mail) {
+        try {
+            long userId = this.userService.getUserByEmail(mail).getIdUser();
+            Administrator a = this.administratorService.getAdministratorById(userId);
+            return true;
+        } catch (ResponseStatusException e) {
+            logger.info(e);
+            return false;
+        }
+    }
+}
diff --git a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/SectionCellService.java b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/SectionCellService.java
index 5a70bee..59c7397 100644
--- a/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/SectionCellService.java
+++ b/MyINPulse-back/src/main/java/enseirb/myinpulse/service/database/SectionCellService.java
@@ -84,4 +84,10 @@ public class SectionCellService {
         SectionCell sectionCell = getSectionCellById(sectionCellId);
         return sectionCell.getAppointmentSectionCell();
     }
+
+    public Iterable<SectionCell> getSectionCellsByProjectAndSectionIdBeforeDate(
+            Project project, long sectionId, LocalDateTime date) {
+        return sectionCellRepository.findByProjectSectionCellAndSectionIdAndModificationDateBefore(
+                project, sectionId, date);
+    }
 }