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 fa171c3..988c70e 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -64,6 +64,9 @@ public class MainVerticle extends AbstractVerticle { router.post("/changePassword").handler(setUser::changeUserPassword); router.post("/publicUser").handler(queryUsers::getPublicUser); router.get("/getCategories").handler(queryObjects::getCategories); + router.post("/addCategories").handler(setObjects::newCategorie); + router.post("/deleteCategories").handler(setObjects::deleteCategories); + // Routes d'authentification router.post("/signup").handler(authHandler::handleSignup); router.post("/login").handler(authHandler::handleLogin); diff --git a/Back-end/src/main/java/com/example/starter/QueryObjects.java b/Back-end/src/main/java/com/example/starter/QueryObjects.java index abc5bca..61d60dc 100644 --- a/Back-end/src/main/java/com/example/starter/QueryObjects.java +++ b/Back-end/src/main/java/com/example/starter/QueryObjects.java @@ -42,7 +42,7 @@ public class QueryObjects { public void getCategories(RoutingContext context) { databaseService.pool - .query("SELECT DISTINCT type FROM weather_objects;") + .query("SELECT name FROM categories;") .execute() .onFailure(e -> { System.err.println("Erreur de récupération de la BDD :" + e.getMessage()); @@ -51,9 +51,16 @@ public class QueryObjects { .end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode()); }) .onSuccess(rows -> { + if (!rows.iterator().hasNext()) { + context.response() + .setStatusCode(404) + .end(new JsonObject().put("error", "Aucun type trouvé dans la base de données").encode()); + return; + } + JsonArray types = new JsonArray(); - rows.forEach(row -> types.add(row.getString("type"))); - + rows.forEach(row -> types.add(row.getString("name"))); + context.response() .putHeader("content-type", "application/json; charset=UTF-8") .end(types.encode()); @@ -64,8 +71,8 @@ public class QueryObjects { JsonObject body = context.body().asJsonObject(); if (body == null) { context.response() - .setStatusCode(400) - .end(new JsonObject().put("error", "Corps de la requête manquant").encode()); + .setStatusCode(400) + .end(new JsonObject().put("error", "Corps de la requête manquant").encode()); return; } String id = body.getString("id"); @@ -98,7 +105,7 @@ public class QueryObjects { Boolean shouldUpdatePoints = body.getBoolean("shouldUpdatePoints", false); if (Boolean.TRUE.equals(shouldUpdatePoints) && idUser != null) { - setUser.updateUserPoints(Integer.parseInt(idUser), 1); + setUser.updateUserPoints(Integer.parseInt(idUser), 1); } context.response() .putHeader("content-type", "application/json: charset=UTF-8") diff --git a/Back-end/src/main/java/com/example/starter/SetObjects.java b/Back-end/src/main/java/com/example/starter/SetObjects.java index ad16b15..dc13a66 100644 --- a/Back-end/src/main/java/com/example/starter/SetObjects.java +++ b/Back-end/src/main/java/com/example/starter/SetObjects.java @@ -60,6 +60,38 @@ public class SetObjects { }); } + public void deleteCategories(RoutingContext context) { + JsonObject body = context.body().asJsonObject(); + if (body == null) { + context.response() + .setStatusCode(400) + .end(new JsonObject().put("error", "Corps de la requête manquant").encode()); + return; + } + String name = body.getString("name"); + databaseService.pool + .preparedQuery("DELETE FROM categories WHERE name=?") + .execute(Tuple.of(name)) + .onFailure(e -> { + System.err.println("Erreur de récupération de la BDD :" + e.getMessage()); + context.response() + .setStatusCode(500) + .end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode()); + }) + .onSuccess(rows -> { + if (rows.rowCount() == 0) { + context.response() + .setStatusCode(404) + .end(new JsonObject().put("error", "Catégorie non trouvé").encode()); + return; + } + context.response() + .putHeader("content-type", "application/json: charset=UTF-8") + .end(new JsonObject().put("success", "La catégorie à bien été supprimé").encode()); + return; + }); + } + public void deleteObject(RoutingContext context) { JsonObject body = context.body().asJsonObject(); if (body == null) { @@ -137,4 +169,39 @@ public class SetObjects { }); } + public void newCategorie(RoutingContext context) { + JsonObject body = context.body().asJsonObject(); + if (body == null) { + context.response() + .setStatusCode(400) + .end(new JsonObject().put("error", "Corps de la requête manquant").encode()); + return; + } + String name = body.getString("name"); + + databaseService.pool + .preparedQuery( + "INSERT INTO categories (name) VALUES (?)") + .execute(Tuple.of(name)) + .onFailure(e -> { + System.err.println("Erreur de récupération de la BDD :" + e.getMessage()); + context.response() + .setStatusCode(500) + .end(new JsonObject().put("error", "Erreur de récupération de la BDD").encode()); + }) + .onSuccess(rows -> { + if (rows.rowCount() == 0) { + context.response() + .setStatusCode(404) + .end(new JsonObject().put("error", "Objet non trouvé").encode()); + return; + } + + context.response() + .putHeader("content-type", "application/json: charset=UTF-8") + .end(new JsonObject().put("success", "La catégorie à bien été ajouté").encode()); + return; + }); + } + } diff --git a/Front-end/src/components/FormNewObject.jsx b/Front-end/src/components/FormNewObject.jsx index 8d138f1..10c93c8 100644 --- a/Front-end/src/components/FormNewObject.jsx +++ b/Front-end/src/components/FormNewObject.jsx @@ -6,7 +6,7 @@ import { useAuth } from "../AuthContext"; function FormNewObject({ isAdmin }) { const { user } = useAuth(); - const [categorie, setCategorie] = useState({}); + const [categorie, setCategorie] = useState(); const [description, setDescription] = useState(""); const [type, setType] = useState(""); const [location, setLocalisation] = useState(""); @@ -50,10 +50,18 @@ function FormNewObject({ isAdmin }) { } } useEffect(() => { - axios.get(`${API_BASE_URL}/getCategories`).then((response) => { - setCategorie(response.data); - console.log(response.data); - }); + axios + .get(`${API_BASE_URL}/getCategories`) + .then((response) => { + if (response.data.length === 0) { + console.warn("Aucune catégorie disponible."); + } else { + setCategorie(response.data); + } + }) + .catch((error) => { + console.error("Erreur lors de la récupération des catégories :", error); + }); }, []); function resetForm() { setNom(""); @@ -151,7 +159,7 @@ function FormNewObject({ isAdmin }) { disabled={verif} > - {categorie.map((cat, index) => ( + {categorie&&categorie.map((cat, index) => ( diff --git a/Front-end/src/components/Header.jsx b/Front-end/src/components/Header.jsx index 8b1773c..54b2a34 100644 --- a/Front-end/src/components/Header.jsx +++ b/Front-end/src/components/Header.jsx @@ -90,6 +90,17 @@ function Header() { )} + {(user?.role === "admin")&&( +
  • + setIsMenuOpen(false)} + className="text-gray-600 hover:text-indigo-600" + > + Administration + +
  • + )}
  • { const trimmed = newCategory.trim(); if (trimmed !== "" && !categories.includes(trimmed)) { - setCategories([...categories, trimmed]); - setNewCategory(""); + axios + .post(`${API_BASE_URL}/addCategories`, { name: trimmed }) + .then((response) => { + console.log("Catégorie ajoutée :", response.data); + setCategories([...categories, trimmed]); + setNewCategory(""); + window.location.reload(); + }) + .catch((error) => { + console.error("Erreur lors de l'ajout de la catégorie :", error); + }); } }; const handleDeleteCategory = (categoryToDelete) => { - setCategories(categories.filter((cat) => cat !== categoryToDelete)); + const confirmation = window.confirm( + `Êtes-vous sûr de vouloir supprimer la catégorie "${categoryToDelete}" ? Cette action pourrait impacter des objets.` + ); + + if (confirmation) { + setCategories(categories.filter((cat) => cat !== categoryToDelete)); + axios + .post(`${API_BASE_URL}/deleteCategories`, { name: categoryToDelete }) + .then((response) => { + console.log("Catégorie supprimée :", response.data); + window.location.reload(); + }) + .catch((error) => { + console.error( + "Erreur lors de la suppression de la catégorie :", + error + ); + }); + } else { + console.log("Suppression annulée."); + } }; + useEffect(() => { + axios + .get(`${API_BASE_URL}/getCategories`) + .then((response) => { + if (response.data.length === 0) { + console.warn("Aucune catégorie disponible."); + } else { + setCategories(response.data); + } + }) + .catch((error) => { + console.error("Erreur lors de la récupération des catégories :", error); + }); + }, []); const [name, setName] = useState(""); const [description, setDescription] = useState(""); const [type, setType] = useState(""); @@ -127,20 +170,21 @@ function AdminObjet() { {/*Formulaire d'ajout d'objet*/} diff --git a/Front-end/src/pages/Admin/User.jsx b/Front-end/src/pages/Admin/User.jsx index 7ea7585..457c65d 100644 --- a/Front-end/src/pages/Admin/User.jsx +++ b/Front-end/src/pages/Admin/User.jsx @@ -34,31 +34,41 @@ function User() { }, []); const handleDeleteUser = (userId) => { const user = users.find((u) => u.id === userId); + if (user) { - axios - .post(`${API_BASE_URL}/deleteUser`, { - id: userId, - }) - .then((response) => { - alert("L'utilisateur à bien été supprimé !"); - console.log("L'utilisateur à été supprimé :", response.data); - window.location.reload(); - }) - .catch((error) => { - console.error( - "Erreur lors de la suppression de l'utilisateur :", - error - ); - }); - logAction(user.name, "Utilisateur supprimé"); + const confirmation = window.confirm( + `Êtes-vous sûr de vouloir supprimer l'utilisateur "${user.name}" ? Cette action pourrait entraîner la suppression des objets associés.` + ); + if (confirmation) { + axios + .post(`${API_BASE_URL}/deleteUser`, { + id: userId, + }) + .then((response) => { + alert("L'utilisateur a bien été supprimé !"); + console.log("L'utilisateur a été supprimé :", response.data); + window.location.reload(); + }) + .catch((error) => { + console.error( + "Erreur lors de la suppression de l'utilisateur :", + error + ); + }); + + logAction(user.name, "Utilisateur supprimé"); + + setUsers(users.filter((u) => u.id !== userId)); + } else { + console.log("Suppression annulée"); + } } - setUsers(users.filter((u) => u.id !== userId)); }; const handleChangeAccessLevel = (userId, newLevel) => { setUsers( users.map((user) => { - if (user.id === userId && newLevel!=user.role) { + if (user.id === userId && newLevel != user.role) { const oldLevel = user.role; user.role = newLevel; /*ToDO*/