From ff7c27ba90e5b580879e7fcb13970a21052ceb38 Mon Sep 17 00:00:00 2001 From: Charles Mendiburu Date: Sun, 13 Apr 2025 14:35:42 +0200 Subject: [PATCH] =?UTF-8?q?Recup=C3=A9ration=20Demande=20suppression=20par?= =?UTF-8?q?tie=20Admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/starter/MainVerticle.java | 9 +- .../example/starter/QueryDeleteObject.java | 107 ++++++++++++------ .../starter/SetRequestDeleteObject.java | 43 +++++++ Front-end/src/components/Alert.jsx | 20 ++-- Front-end/src/pages/Admin/AdminObjet.jsx | 71 ++++++++++++ Front-end/src/pages/Admin/Dashboard.jsx | 30 +++++ 6 files changed, 226 insertions(+), 54 deletions(-) create mode 100644 Back-end/src/main/java/com/example/starter/SetRequestDeleteObject.java diff --git a/Back-end/src/main/java/com/example/starter/MainVerticle.java b/Back-end/src/main/java/com/example/starter/MainVerticle.java index 90f9bee..66b020c 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -46,6 +46,10 @@ public class MainVerticle extends AbstractVerticle { setWeatherData.setUserHandler(setUser); QueryDeleteObject RequestDeleteObject = new QueryDeleteObject(databaseService); + SetRequestDeleteObject DeleteObject = new SetRequestDeleteObject(databaseService); + + + // Déclaration des routes router.get("/objets").handler(queryObjects::getObjects); @@ -68,13 +72,10 @@ public class MainVerticle extends AbstractVerticle { router.post("/addCategories").handler(setObjects::newCategorie); router.post("/deleteCategories").handler(setObjects::deleteCategories); router.post("/requestDeleteObject").handler(RequestDeleteObject::deleteObject); - - - + router.get("/getDemandeSuppression").handler(DeleteObject::getAllDeletionRequests); // Routes d'authentification router.post("/signup").handler(authHandler::handleSignup); router.post("/login").handler(authHandler::handleLogin); - // Création du serveur HTTP vertx.createHttpServer() diff --git a/Back-end/src/main/java/com/example/starter/QueryDeleteObject.java b/Back-end/src/main/java/com/example/starter/QueryDeleteObject.java index a9e21d2..5be9f59 100644 --- a/Back-end/src/main/java/com/example/starter/QueryDeleteObject.java +++ b/Back-end/src/main/java/com/example/starter/QueryDeleteObject.java @@ -12,53 +12,86 @@ public class QueryDeleteObject { } public void deleteObject(RoutingContext context) { - JsonObject body = context.body().asJsonObject(); + JsonObject body = context.body().asJsonObject(); - if (body == null) { - context.response().setStatusCode(400).end(new JsonObject().put("error", "Requête invalide").encode()); - return; - } - - // Lecture des paramètres - Integer objectId = body.getInteger("object_id"); - Integer userId = body.getInteger("requested_by"); - - System.out.println("Body reçu : " + body.encode()); - System.out.println("objectId = " + objectId + ", userId = " + userId); - - if (objectId == null || userId == null) { - context.response().setStatusCode(400).end(new JsonObject().put("error", "Champs manquants").encode()); - return; - } - - // Vérification si l'objet existe - String checkQuery = "SELECT id FROM weather_objects WHERE id = ?"; - - databaseService.pool.preparedQuery(checkQuery).execute(Tuple.of(objectId), res -> { - if (res.failed()) { - res.cause().printStackTrace(); // Affiche l'erreur SQL s'il y en a une - context.response().setStatusCode(500).end(new JsonObject().put("error", "Erreur base de données").encode()); + if (body == null) { + context.response().setStatusCode(400).end(new JsonObject().put("error", "Requête invalide").encode()); return; } - if (res.result().rowCount() == 0) { - context.response().setStatusCode(404).end(new JsonObject().put("error", "Objet non trouvé").encode()); + // Lecture des paramètres + Integer objectId = body.getInteger("object_id"); + Integer userId = body.getInteger("requested_by"); + + System.out.println("Body reçu : " + body.encode()); + System.out.println("objectId = " + objectId + ", userId = " + userId); + + if (objectId == null || userId == null) { + context.response().setStatusCode(400).end(new JsonObject().put("error", "Champs manquants").encode()); return; } - // Insertion simple (pas de vérif doublon pour l’instant) - String checkDuplicate = "SELECT 1 FROM deletion_requests WHERE object_id = ? AND requested_by = ?"; - String insertQuery = "INSERT INTO deletion_requests (object_id, requested_by) VALUES (?, ?)"; + // Vérification si l'objet existe + String checkQuery = "SELECT id FROM weather_objects WHERE id = ?"; - databaseService.pool.preparedQuery(insertQuery).execute(Tuple.of(objectId, userId), insertRes -> { - if (insertRes.succeeded()) { - context.response().setStatusCode(200).end(new JsonObject().put("message", "Demande envoyée").encode()); + databaseService.pool.preparedQuery(checkQuery).execute(Tuple.of(objectId), res -> { + if (res.failed()) { + res.cause().printStackTrace(); // Affiche l'erreur SQL s'il y en a une + context.response().setStatusCode(500) + .end(new JsonObject().put("error", "Erreur base de données").encode()); + return; + } + + if (res.result().rowCount() == 0) { + context.response().setStatusCode(404).end(new JsonObject().put("error", "Objet non trouvé").encode()); + return; + } + + // Insertion simple (pas de vérif doublon pour l’instant) + String checkDuplicate = "SELECT 1 FROM deletion_requests WHERE object_id = ? AND requested_by = ?"; + String insertQuery = "INSERT INTO deletion_requests (object_id, requested_by) VALUES (?, ?)"; + + databaseService.pool.preparedQuery(insertQuery).execute(Tuple.of(objectId, userId), insertRes -> { + if (insertRes.succeeded()) { + context.response().setStatusCode(200) + .end(new JsonObject().put("message", "Demande envoyée").encode()); + } else { + insertRes.cause().printStackTrace(); // Pour voir l'erreur en console + context.response().setStatusCode(500) + .end(new JsonObject().put("error", "Erreur insertion").encode()); + } + }); + }); + + } + + public void getAllDeletionRequests(RoutingContext context) { + String query = "SELECT * FROM deletion_requests"; + + databaseService.pool.query(query).execute(res -> { + if (res.succeeded()) { + var results = res.result(); + var jsonArray = new io.vertx.core.json.JsonArray(); + + results.forEach(row -> { + JsonObject json = new JsonObject() + .put("id", row.getInteger("id")) + .put("object_id", row.getInteger("object_id")) + .put("requested_by", row.getInteger("requested_by")) + .put("requested_at", row.getLocalDateTime("requested_at").toString()); // si tu as un champ + // de type timestamp + jsonArray.add(json); + }); + + context.response() + .putHeader("Content-Type", "application/json") + .end(jsonArray.encode()); } else { - insertRes.cause().printStackTrace(); // Pour voir l'erreur en console - context.response().setStatusCode(500).end(new JsonObject().put("error", "Erreur insertion").encode()); + res.cause().printStackTrace(); + context.response().setStatusCode(500) + .end(new JsonObject().put("error", "Erreur lors de la récupération des demandes").encode()); } }); - }); -} + } } diff --git a/Back-end/src/main/java/com/example/starter/SetRequestDeleteObject.java b/Back-end/src/main/java/com/example/starter/SetRequestDeleteObject.java new file mode 100644 index 0000000..2767041 --- /dev/null +++ b/Back-end/src/main/java/com/example/starter/SetRequestDeleteObject.java @@ -0,0 +1,43 @@ +package com.example.starter; + +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.web.RoutingContext; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowSet; + +public class SetRequestDeleteObject { + private final DatabaseService databaseService; + + // Le nom du constructeur doit correspondre au nom de la classe + public SetRequestDeleteObject(DatabaseService dtbS) { + this.databaseService = dtbS; + } + + public void getAllDeletionRequests(RoutingContext context) { + String query = "SELECT * FROM deletion_requests"; + + databaseService.pool.query(query).execute(res -> { + if (res.succeeded()) { + RowSet results = res.result(); + JsonArray jsonArray = new JsonArray(); + + results.forEach(row -> { + JsonObject json = new JsonObject() + .put("id", row.getInteger("id")) + .put("object_id", row.getInteger("object_id")) + .put("requested_by", row.getInteger("requested_by")) + .put("request_date", row.getLocalDateTime("request_date").toString()); // Assurez-vous que le type correspond + jsonArray.add(json); + }); + + context.response() + .putHeader("Content-Type", "application/json") + .end(jsonArray.encode()); + } else { + res.cause().printStackTrace(); + context.response().setStatusCode(500).end(new JsonObject().put("error", "Erreur lors de la récupération des demandes").encode()); + } + }); + } +} diff --git a/Front-end/src/components/Alert.jsx b/Front-end/src/components/Alert.jsx index 37aa2f7..615ca9b 100644 --- a/Front-end/src/components/Alert.jsx +++ b/Front-end/src/components/Alert.jsx @@ -1,36 +1,30 @@ -import React, { useState, useEffect } from "react"; +import React, { useEffect } from "react"; import { Check, X } from "lucide-react"; import { useAuth } from "../AuthContext"; function Alert({ affAlert, setAffAlert, message }) { const { user } = useAuth(); - // Gère la disparition de l'alerte après 3 secondes useEffect(() => { if (affAlert) { const timer = setTimeout(() => { - setAffAlert(false); // Cache l'alerte après 3 secondes + setAffAlert(false); }, 3000); - return () => clearTimeout(timer); // Nettoie le timer au besoin + return () => clearTimeout(timer); } }, [affAlert, setAffAlert]); return ( affAlert && user?.role !== "user" && ( -
+
+ +

{message}

- - - - -

- {message} -

) ); diff --git a/Front-end/src/pages/Admin/AdminObjet.jsx b/Front-end/src/pages/Admin/AdminObjet.jsx index 4803c03..ed69a91 100644 --- a/Front-end/src/pages/Admin/AdminObjet.jsx +++ b/Front-end/src/pages/Admin/AdminObjet.jsx @@ -9,6 +9,7 @@ function AdminObjet() { const [categories, setCategories] = useState(); const [newCategory, setNewCategory] = useState(""); const [objects, setObjects] = useState([]); + const [deleteRequests, setDeleteRequests] = useState([]); useEffect(() => { axios.get(`${API_BASE_URL}/objets`).then((response) => { @@ -16,6 +17,20 @@ function AdminObjet() { }); }, []); + useEffect(() => { + axios + .get(`${API_BASE_URL}/getDemandeSuppression`) + .then((response) => { + setDeleteRequests(response.data); + }) + .catch((error) => { + console.error( + "Erreur lors de la récupération des requêtes de suppression :", + error + ); + }); + }, []); + const handleAddCategory = () => { const trimmed = newCategory.trim(); if (trimmed !== "" && !categories.includes(trimmed)) { @@ -315,6 +330,62 @@ function AdminObjet() { Enregistrer les règles globales + + +
+

+ Demandes de Suppression d'Objets +

+ +
+ + + + + + + + + + + + {deleteRequests.map((request) => ( + + + + + + + + ))} + {deleteRequests.length === 0 && ( + + + + )} + +
IDObjet IDUtilisateur IDDate de RequêteActions
{request.id}{request.object_id}{request.requested_by}{request.request_date} + + +
+ Aucune demande de suppression trouvée. +
+
+
+
diff --git a/Front-end/src/pages/Admin/Dashboard.jsx b/Front-end/src/pages/Admin/Dashboard.jsx index 1a945ae..f0f5f1d 100644 --- a/Front-end/src/pages/Admin/Dashboard.jsx +++ b/Front-end/src/pages/Admin/Dashboard.jsx @@ -43,6 +43,7 @@ const initialWidgets = [ { id: 3, type: "reporting" }, { id: 4, type: "adminobjet" }, { id: 5, type: "objects" }, + { id: 6, type: "requestObject" } ]; function Dashboard() { @@ -70,6 +71,10 @@ function Dashboard() { axios.get(`${API_BASE_URL}/objets`).then((response) => { setAdminObjects(response.data); }); + + axios.get(`${API_BASE_URL}/demandeSuppression`).then((response) => { + setRequestDeleteObject(response.data); + }) }, []); const [adminObjects, setAdminObjects] = useState([ @@ -284,6 +289,25 @@ function Dashboard() { )} + + {widget.type ==="requestObject" && ( +
+

Requête suppression objets

+ +
+

Générer des rapports d'utilisation :

+
+ +
+
+
+ + )} {widget.type === "reporting" && (

Rapports et Statistiques

@@ -372,6 +396,12 @@ function Dashboard() { > Rapports et Statistiques +