From 11ac854f88813c6de9dbf9f10a0807857174a8bf Mon Sep 17 00:00:00 2001 From: Mathis Date: Tue, 8 Apr 2025 12:38:58 +0200 Subject: [PATCH 1/4] Corresction path et header responsive --- .vscode/settings.json | 2 +- Back-end/pom.xml | 8 +- .../java/com/example/starter/AuthHandler.java | 1 - .../com/example/starter/DatabaseService.java | 5 +- .../com/example/starter/JwtAuthProvider.java | 4 +- .../com/example/starter/MainVerticle.java | 1 - Front-end/index.html | 2 +- Front-end/src/components/Header.jsx | 148 +++++++++++++----- Front-end/src/img/cloud-alert.svg | 1 - Front-end/src/img/cloud-sun-rain.svg | 1 + 10 files changed, 120 insertions(+), 53 deletions(-) delete mode 100644 Front-end/src/img/cloud-alert.svg create mode 100644 Front-end/src/img/cloud-sun-rain.svg diff --git a/.vscode/settings.json b/.vscode/settings.json index 5ed7c7a..bbca028 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { "liveServer.settings.port": 8081, - "java.configuration.updateBuildConfiguration": "interactive" + "java.configuration.updateBuildConfiguration": "automatic" } \ No newline at end of file diff --git a/Back-end/pom.xml b/Back-end/pom.xml index 5d0ce82..b221038 100644 --- a/Back-end/pom.xml +++ b/Back-end/pom.xml @@ -88,10 +88,10 @@ 0.9.0 - io.vertx - vertx-auth-jwt - 4.5.13 - + io.vertx + vertx-auth-jwt + 4.5.13 + diff --git a/Back-end/src/main/java/com/example/starter/AuthHandler.java b/Back-end/src/main/java/com/example/starter/AuthHandler.java index 2052b71..549be0e 100644 --- a/Back-end/src/main/java/com/example/starter/AuthHandler.java +++ b/Back-end/src/main/java/com/example/starter/AuthHandler.java @@ -4,7 +4,6 @@ import io.vertx.core.json.JsonObject; import io.vertx.ext.web.RoutingContext; import at.favre.lib.crypto.bcrypt.BCrypt; import io.vertx.ext.auth.jwt.JWTAuth; -import com.example.starter.auth.JwtAuthProvider; import io.vertx.sqlclient.Tuple; public class AuthHandler { diff --git a/Back-end/src/main/java/com/example/starter/DatabaseService.java b/Back-end/src/main/java/com/example/starter/DatabaseService.java index f4e05d5..8742f41 100644 --- a/Back-end/src/main/java/com/example/starter/DatabaseService.java +++ b/Back-end/src/main/java/com/example/starter/DatabaseService.java @@ -3,8 +3,7 @@ package com.example.starter; import io.vertx.core.Vertx; import io.vertx.jdbcclient.JDBCConnectOptions; import io.vertx.jdbcclient.JDBCPool; -import io.vertx.ext.auth.jwt.JWTAuth; -import io.vertx.ext.auth.jwt.JWTAuthOptions; + import io.vertx.sqlclient.PoolOptions; public class DatabaseService { @@ -13,7 +12,7 @@ public class DatabaseService { public DatabaseService(Vertx vertx) { pool = JDBCPool.pool(vertx, new JDBCConnectOptions() - .setJdbcUrl("jdbc:postgresql://localhost:5432/users?useUnicode=true&characterEncoding=UTF-8") //Url de la bdd + .setJdbcUrl("jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=UTF-8") //Url de la bdd .setUser("postgres") // Nom d'utilisateur PostgreSQL .setPassword("admin"), // Mot de passe PostgreSQL new PoolOptions() diff --git a/Back-end/src/main/java/com/example/starter/JwtAuthProvider.java b/Back-end/src/main/java/com/example/starter/JwtAuthProvider.java index 01d26d9..6c3cd38 100644 --- a/Back-end/src/main/java/com/example/starter/JwtAuthProvider.java +++ b/Back-end/src/main/java/com/example/starter/JwtAuthProvider.java @@ -1,10 +1,10 @@ -package com.example.starter.auth; +package com.example.starter; import io.vertx.core.Vertx; import io.vertx.ext.auth.jwt.JWTAuth; import io.vertx.ext.auth.jwt.JWTAuthOptions; import io.vertx.ext.auth.KeyStoreOptions; -import com.example.starter.auth.JwtAuthProvider; +import com.example.starter.JwtAuthProvider; public class JwtAuthProvider { 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 00a2cd1..629aded 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -7,7 +7,6 @@ import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.CorsHandler; import io.vertx.ext.auth.jwt.JWTAuth; -import com.example.starter.auth.JwtAuthProvider; import io.vertx.ext.web.handler.JWTAuthHandler; diff --git a/Front-end/index.html b/Front-end/index.html index e0bb005..63968ac 100644 --- a/Front-end/index.html +++ b/Front-end/index.html @@ -4,7 +4,7 @@ - + Projet Dev Web diff --git a/Front-end/src/components/Header.jsx b/Front-end/src/components/Header.jsx index 9bbd666..4bb7148 100644 --- a/Front-end/src/components/Header.jsx +++ b/Front-end/src/components/Header.jsx @@ -1,58 +1,128 @@ import React, { useState, useEffect } from "react"; -import { LogIn, UserPlus, LogOut, Settings } from "lucide-react"; +import { X, Menu, LogIn, UserPlus, LogOut, Settings } from "lucide-react"; import { Link } from "react-router-dom"; import { useAuth } from "../AuthContext"; function Header() { const { token, logout } = useAuth(); + const [isMenuOpen, setIsMenuOpen] = useState(false); return (
-
-
-

VigiMétéo

- -
- {token ? ( - <> - - - - - + + + {!token ? ( +
+ + + Connexion + + + + Inscription +
-
+ ) : ( +
+ + + + + +
+ )}
); diff --git a/Front-end/src/img/cloud-alert.svg b/Front-end/src/img/cloud-alert.svg deleted file mode 100644 index a7ea487..0000000 --- a/Front-end/src/img/cloud-alert.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Front-end/src/img/cloud-sun-rain.svg b/Front-end/src/img/cloud-sun-rain.svg new file mode 100644 index 0000000..9892ac6 --- /dev/null +++ b/Front-end/src/img/cloud-sun-rain.svg @@ -0,0 +1 @@ + \ No newline at end of file From 229f04d98e14a097fb583b7635881cb8bf258e04 Mon Sep 17 00:00:00 2001 From: Mathis Date: Thu, 10 Apr 2025 16:24:35 +0200 Subject: [PATCH 2/4] Debut de l'ajout des points --- .../main/java/com/example/starter/AuthHandler.java | 14 ++++++++++++-- Front-end/src/components/Header.jsx | 6 +++--- Front-end/src/components/ModifObject.jsx | 2 +- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Back-end/src/main/java/com/example/starter/AuthHandler.java b/Back-end/src/main/java/com/example/starter/AuthHandler.java index 549be0e..cb0d0cd 100644 --- a/Back-end/src/main/java/com/example/starter/AuthHandler.java +++ b/Back-end/src/main/java/com/example/starter/AuthHandler.java @@ -77,7 +77,7 @@ public class AuthHandler { } databaseService.pool - .preparedQuery("SELECT password FROM users WHERE email = ?") + .preparedQuery("SELECT password,points FROM users WHERE email = ?") .execute(Tuple.of(email)) .onSuccess(result -> { if (result.rowCount() == 0) { @@ -88,10 +88,20 @@ public class AuthHandler { } String storedHashedPassword = result.iterator().next().getString("password"); + Integer nbPointsUser = result.iterator().next().getInteger("points"); + BCrypt.Result verification = BCrypt.verifyer().verify(password.toCharArray(), storedHashedPassword); if (verification.verified) { - JsonObject claims = new JsonObject().put("sub", email).put("role", "user"); + JsonObject claims = new JsonObject().put("sub", email); + if(nbPointsUser<=30){ + claims.put("role", "user"); + }else if(nbPointsUser<=60){ + claims.put("role", "complexe"); + }else if(nbPointsUser>=100){ + claims.put("role", "admin"); + } + String token = jwtAuth.generateToken(claims); context.response() .setStatusCode(200) diff --git a/Front-end/src/components/Header.jsx b/Front-end/src/components/Header.jsx index 4bb7148..d8d4c53 100644 --- a/Front-end/src/components/Header.jsx +++ b/Front-end/src/components/Header.jsx @@ -9,8 +9,8 @@ function Header() { return (
-
-

VigiMétéo

+
+ VigiMétéo + +
+

+ {messRequete} +

+ + ); +} + +export default FormNewObject; diff --git a/Front-end/src/components/Header.jsx b/Front-end/src/components/Header.jsx index d8d4c53..78ea610 100644 --- a/Front-end/src/components/Header.jsx +++ b/Front-end/src/components/Header.jsx @@ -8,8 +8,8 @@ function Header() { const [isMenuOpen, setIsMenuOpen] = useState(false); return ( -
-
+
+
VigiMétéo - -
-

- {messRequete} -

- - + {/*Formulaire d'ajout d'objet*/} + {/* Tri des objets */} -
+

Liste des Objets et Outils/Services @@ -322,7 +159,7 @@ function AdminObjet() { > - + @@ -356,7 +193,7 @@ function AdminObjet() { {sortedObjects.map((obj) => ( - {obj.nom} + {obj.name} {obj.description} @@ -365,10 +202,10 @@ function AdminObjet() { {obj.type} - {obj.localisation} + {obj.location} - {obj.proprietaire} + {obj.proprio} {obj.status} diff --git a/Front-end/src/pages/Admin/sidebar.jsx b/Front-end/src/pages/Admin/sidebar.jsx index dd5b1bf..dbaf762 100644 --- a/Front-end/src/pages/Admin/sidebar.jsx +++ b/Front-end/src/pages/Admin/sidebar.jsx @@ -11,12 +11,12 @@ function Sidebar() { className="text-white no-underline hover:underline" href="/dashboard" > - Dashboard + Tableau de bord
  • - Users + Utilisateurs
  • @@ -24,17 +24,17 @@ function Sidebar() { className="text-white no-underline hover:underline" href="/adminobjet" > - AdminObjet + Gestion des objets
  • - Settings + Paramètres
  • - Reports + Rapports
  • diff --git a/Front-end/src/pages/Gestion/AddObject.jsx b/Front-end/src/pages/Gestion/AddObject.jsx index 8881166..b9615f9 100644 --- a/Front-end/src/pages/Gestion/AddObject.jsx +++ b/Front-end/src/pages/Gestion/AddObject.jsx @@ -1,71 +1,7 @@ import React, { useState } from "react"; -import { BadgePlus } from "lucide-react"; -import axios from "axios"; -import { API_BASE_URL } from "../../config"; +import FormNewObject from "../../components/FormNewObject"; function AddObject() { - const [description, setDescription] = useState(""); - const [type, setType] = useState(""); - const [location, setLocalisation] = useState(""); - const [status, setStatus] = useState("active"); - const [nom, setNom] = useState(""); - const [Response, setResponse] = useState(null); - const [isActive, setActive] = useState(true); - const [verif, setVerif] = useState(false); - const [enregistre, setEnregistre] = useState(false); - const [messRequete, setMessRequete] = useState(""); - function handleSubmit(event) { - event.preventDefault(); - - if (verif) { - console.log("Envoi requete"); - axios - .post(`${API_BASE_URL}/addObject`, { - nom, - description, - type, - location, - status, - }) - .then((response) => { - setMessRequete("Votre objet à bien été enregistré !"); - setEnregistre(true); - console.log("Ajout de l'objet réussit :", response.data); - }) - .catch((error) => { - setMessRequete("Il y a eu une erreur dans l'ajout de votre objet !"); - console.error("Erreur lors de l'ajout de l'objet :", error); - }); - setVerif(false); - resetForm(); - } else { - setVerif(true); - } - } - function resetForm() { - setNom(""); - setStatus(""); - setDescription(""); - setType(""); - setLocalisation(""); - setActive(true); - } - function handleCancel() { - if (verif) { - setVerif(false); - } else { - resetForm(); - } - } - - function handleStatusChange() { - setActive((prevIsActive) => { - const newIsActive = !prevIsActive; - setStatus(newIsActive ? "active" : "inactive"); - return newIsActive; - }); - } - return (
    @@ -74,144 +10,7 @@ function AddObject() { Nouvel objet

    -
    -
    -
    - -
    -

    - {!verif - ? "Entrez les données de votre nouvel objet" - : "Êtes-vous sûr de ces données ?"} -

    -
    -
    - - setNom(e.target.value)} - required - disabled={verif} - /> -
    -
    - - setDescription(e.target.value)} - required - disabled={verif} - /> -
    - -
    - - setType(e.target.value)} - required - disabled={verif} - /> -
    - -
    - - setLocalisation(e.target.value)} - required - disabled={verif} - /> -
    - -
    - -
    - -
    - - -
    - -
    -
    - -
    - - -
    -

    - {messRequete} -

    -
    +
    ); From 68917bbcb086c885672c2b6a0baaa95298b2a213 Mon Sep 17 00:00:00 2001 From: Mathis Date: Thu, 10 Apr 2025 20:43:45 +0200 Subject: [PATCH 4/4] ajout backend UserAdmin --- .../com/example/starter/MainVerticle.java | 48 +++++------ .../java/com/example/starter/QueryUsers.java | 51 +++++++++++ .../java/com/example/starter/SetUser.java | 48 +++++++++++ Front-end/src/pages/Admin/Dashboard.jsx | 47 +++------- Front-end/src/pages/Admin/User.jsx | 86 +++++++++++-------- 5 files changed, 187 insertions(+), 93 deletions(-) create mode 100644 Back-end/src/main/java/com/example/starter/QueryUsers.java create mode 100644 Back-end/src/main/java/com/example/starter/SetUser.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 331d1c6..052e187 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -9,7 +9,6 @@ import io.vertx.ext.web.handler.CorsHandler; import io.vertx.ext.auth.jwt.JWTAuth; import io.vertx.ext.web.handler.JWTAuthHandler; - public class MainVerticle extends AbstractVerticle { private DatabaseService databaseService; private Router router; @@ -17,32 +16,32 @@ public class MainVerticle extends AbstractVerticle { @Override public void start(Promise startPromise) throws Exception { databaseService = new DatabaseService(vertx); - + // Initialisation du fournisseur JWT JWTAuth jwtAuth = JwtAuthProvider.createJwtAuth(vertx); - // Initialisation du routeur router = Router.router(vertx); router.route().handler(BodyHandler.create()); router.route().handler(CorsHandler.create() - .addOrigin("*") - .allowedMethod(HttpMethod.GET) - .allowedMethod(HttpMethod.POST) - .allowedHeader("Content-Type") - .allowedHeader("Authorization")); - + .addOrigin("*") + .allowedMethod(HttpMethod.GET) + .allowedMethod(HttpMethod.POST) + .allowedHeader("Content-Type") + .allowedHeader("Authorization")); + // Protéger toutes les routes commençant par "/api/" router.route("/api/*").handler(JWTAuthHandler.create(jwtAuth)); - // Initialisation des handlers de requêtes QueryObjects queryObjects = new QueryObjects(databaseService); QueryWeatherData queryWeather = new QueryWeatherData(databaseService); SetObjects setObjects = new SetObjects(databaseService); - SetWeatherData setWeatherData = new SetWeatherData(databaseService); + SetWeatherData setWeatherData = new SetWeatherData(databaseService); AuthHandler authHandler = new AuthHandler(databaseService, jwtAuth); - + QueryUsers queryUsers = new QueryUsers(databaseService); + SetUser setUser = new SetUser(databaseService); + // Déclaration des routes router.get("/objets").handler(queryObjects::getObjects); router.get("/objet").handler(queryObjects::getParticularObject); @@ -53,22 +52,23 @@ public class MainVerticle extends AbstractVerticle { router.get("/getRange").handler(queryWeather::getRangeData); router.post("/modifRangeData").handler(setWeatherData::setRangeData); router.post("/deleteObject").handler(setObjects::deleteObject); - + router.get("/users").handler(queryUsers::getUsers); + router.post("/setUserPoints").handler(setUser::setUserPoints); // Routes d'authentification router.post("/signup").handler(authHandler::handleSignup); router.post("/login").handler(authHandler::handleLogin); - + // Création du serveur HTTP vertx.createHttpServer() - .requestHandler(router) - .listen(8888) - .onSuccess(server -> { - System.out.println("HTTP server started on port " + server.actualPort()); - startPromise.complete(); - }) - .onFailure(throwable -> { - throwable.printStackTrace(); - startPromise.fail(throwable); - }); + .requestHandler(router) + .listen(8888) + .onSuccess(server -> { + System.out.println("HTTP server started on port " + server.actualPort()); + startPromise.complete(); + }) + .onFailure(throwable -> { + throwable.printStackTrace(); + startPromise.fail(throwable); + }); } } diff --git a/Back-end/src/main/java/com/example/starter/QueryUsers.java b/Back-end/src/main/java/com/example/starter/QueryUsers.java new file mode 100644 index 0000000..a3cca49 --- /dev/null +++ b/Back-end/src/main/java/com/example/starter/QueryUsers.java @@ -0,0 +1,51 @@ +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; + +public class QueryUsers { + private DatabaseService databaseService; + + public QueryUsers(DatabaseService dtbS) { + this.databaseService = dtbS; + } + + public void getUsers(RoutingContext context) { + databaseService.pool + .query("SELECT * FROM users;") + .execute() + .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 -> { + JsonArray users = new JsonArray(); + for (Row row : rows) { + int points=row.getInteger("points"); + JsonObject user = new JsonObject() + .put("id", row.getInteger("id")) + .put("name", row.getString("name")) + .put("surname", row.getString("surname")) + .put("email", row.getString("email")) + .put("gender", row.getString("gender")) + .put("points",points); + if(points<=30){ + user.put("role", "user"); + }else if(points<=60){ + user.put("role", "complexe"); + }else if(points>=100){ + user.put("role", "admin"); + } + users.add(user); + } + context.response() + .putHeader("content-type", "application/json; charset=UTF-8") + .end(users.encode()); + + }); + } +} diff --git a/Back-end/src/main/java/com/example/starter/SetUser.java b/Back-end/src/main/java/com/example/starter/SetUser.java new file mode 100644 index 0000000..9d104fd --- /dev/null +++ b/Back-end/src/main/java/com/example/starter/SetUser.java @@ -0,0 +1,48 @@ +package com.example.starter; + +import io.vertx.core.json.JsonObject; +import io.vertx.ext.web.RoutingContext; +import io.vertx.sqlclient.Tuple; + +public class SetUser { + private DatabaseService databaseService; + + public SetUser(DatabaseService ddbs) { + this.databaseService = ddbs; + } + + public void setUserPoints(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; + } + Integer id = body.getInteger("id"); + Integer points = body.getInteger("points"); + + databaseService.pool + .preparedQuery( + "UPDATE users SET points=? WHERE id=?") + .execute(Tuple.of(points,id)) + .onFailure(e -> { + System.err.println("Erreur de récupération de la BDD :" + e.getMessage()); + context.response() + .setStatusCode(500) + .end(new JsonObject().put("Erreur", "Erreur de récupération de la BDD").encode()); + }) + .onSuccess(rows -> { + if (rows.rowCount() == 0) { + context.response() + .setStatusCode(404) + .end(new JsonObject().put("error", "Utilisateur non trouvé").encode()); + return; + } + context.response() + .putHeader("content-type", "application/json: charset=UTF-8") + .end(new JsonObject().put("success", "Les points de l'utilisateur ont bien été mis à jour").encode()); + return; + }); + } +} diff --git a/Front-end/src/pages/Admin/Dashboard.jsx b/Front-end/src/pages/Admin/Dashboard.jsx index a69d224..8056bc8 100644 --- a/Front-end/src/pages/Admin/Dashboard.jsx +++ b/Front-end/src/pages/Admin/Dashboard.jsx @@ -1,5 +1,8 @@ -import React, { useState } from "react"; +import React, { useState,useEffect } from "react"; import Sidebar from "./sidebar.jsx"; +import { API_BASE_URL } from "../../config.js"; +import axios from "axios"; + const dashboardStyles = { mainContent: { @@ -44,35 +47,7 @@ const dashboardStyles = { }; function Dashboard() { - // États simulés (dans une vraie application, ils viendraient d'une API ou d'un store global) - const [users, setUsers] = useState([ - { - id: 1, - username: "Alice", - email: "alice@example.com", - accessLevel: "Admin", - }, - { id: 2, username: "Bob", email: "bob@example.com", accessLevel: "User" }, - { - id: 3, - username: "Charlie", - email: "charlie@example.com", - accessLevel: "Guest", - }, - { - id: 4, - username: "David", - email: "david@example.com", - accessLevel: "User", - }, - { id: 5, username: "Eva", email: "eva@example.com", accessLevel: "User" }, - { - id: 6, - username: "Frank", - email: "frank@example.com", - accessLevel: "Admin", - }, - ]); + const [users, setUsers] = useState([]); const [logs, setLogs] = useState([ { id: 1, @@ -87,7 +62,11 @@ function Dashboard() { timestamp: new Date().toLocaleString(), }, ]); - + useEffect(() => { + axios.get(`${API_BASE_URL}/users`).then((response) => { + setUsers(response.data); + }); + }, []); return (
    @@ -118,15 +97,15 @@ function Dashboard() { Username Email - Access Level + Niveau d'accès {users.slice(0, 5).map((user) => ( - {user.username} + {user.name} {user.email} - {user.accessLevel} + {user.role} ))} {users.length === 0 && ( diff --git a/Front-end/src/pages/Admin/User.jsx b/Front-end/src/pages/Admin/User.jsx index 3bae034..fd28b76 100644 --- a/Front-end/src/pages/Admin/User.jsx +++ b/Front-end/src/pages/Admin/User.jsx @@ -1,5 +1,7 @@ -import React, { useState } from "react"; +import React, { useState,useEffect} from "react"; import Sidebar from "./sidebar.jsx"; +import { API_BASE_URL } from "../../config.js"; +import axios from "axios"; const styles = { mainContent: { @@ -46,47 +48,48 @@ const styles = { }; function User() { - // États pour la gestion des utilisateurs, des logs, des champs du formulaire et des ajustements de points const [users, setUsers] = useState([]); const [logs, setLogs] = useState([]); - const [username, setUsername] = useState(""); + const [name, setname] = useState(""); const [email, setEmail] = useState(""); const [pointsInput, setPointsInput] = useState({}); - // Ajout d'un utilisateur const handleAddUser = (e) => { e.preventDefault(); const newUser = { id: Date.now(), - username, + name, email, - accessLevel: "User", // Niveau d'accès par défaut + accessLevel: "User", points: 0, }; setUsers([...users, newUser]); - logAction(username, "User added"); - setUsername(""); + logAction(name, "User added"); + setname(""); setEmail(""); }; - - // Suppression d'un utilisateur (fonction présente dans script.js) + useEffect(() => { + axios.get(`${API_BASE_URL}/users`).then((response) => { + setUsers(response.data); + }); + }, []); const handleDeleteUser = (userId) => { const user = users.find((u) => u.id === userId); if (user) { - logAction(user.username, "User deleted"); + logAction(user.name, "User deleted"); } setUsers(users.filter((u) => u.id !== userId)); }; - // Changement du niveau d'accès via le menu déroulant (fonction issue de script.js) const handleChangeAccessLevel = (userId, newLevel) => { setUsers( users.map((user) => { if (user.id === userId) { - const oldLevel = user.accessLevel; - user.accessLevel = newLevel; + const oldLevel = user.role; + user.role = newLevel; + /*ToDO*/ logAction( - user.username, + user.name, `Access level changed from ${oldLevel} to ${newLevel}` ); } @@ -95,26 +98,39 @@ function User() { ); }; - // Ajustement des points d'un utilisateur (fonction issue de script.js) const handleAdjustPoints = (userId) => { const pointsToAdd = parseInt(pointsInput[userId]) || 0; setUsers( users.map((user) => { if (user.id === userId) { user.points += pointsToAdd; - logAction(user.username, `Points adjusted by ${pointsToAdd}`); + axios + .post(`${API_BASE_URL}/setUserPoints`, { + id:user.id, + points:user.points, + }) + .then((response) => { + setMessRequete("Les points ont bien été enregistré !"); + setEnregistre(true); + console.log("Ajout des points réussit :", response.data); + }) + .catch((error) => { + setMessRequete("Il y a eu une erreur dans l'ajout des points!"); + console.error("Erreur lors de l'ajout des points :", error); + }); + logAction(user.name, `Points ajustés par ${pointsToAdd}`); } return user; }) ); - // Réinitialiser la valeur de l'input pour cet utilisateur setPointsInput({ ...pointsInput, [userId]: "" }); }; - // Fonction de journalisation des actions (définie dans script.js) - const logAction = (username, action) => { + const logAction = (name, action) => { + /*TODO*/ + /*Ajouter le suivi dans un journal de log*/ const timestamp = new Date().toLocaleString(); - setLogs([...logs, { id: Date.now(), username, action, timestamp }]); + setLogs([...logs, { id: Date.now(), name, action, timestamp }]); }; return ( @@ -129,10 +145,10 @@ function User() { setUsername(e.target.value)} + id="name" + placeholder="name" + value={name} + onChange={(e) => setname(e.target.value)} required /> - Username + Nom Email - Access Level + Niveau d'accès Points Actions @@ -162,20 +178,20 @@ function User() { {users.map((user) => ( - {user.username} + {user.name} {user.email} {/* Menu déroulant pour changer le niveau d'accès */} @@ -225,11 +241,11 @@ function User() { {/* Tableau des logs */}
    -

    Login History and Action Logs

    +

    Historique des connexions et journal des logs

    - + @@ -237,7 +253,7 @@ function User() { {logs.map((log) => ( - +
    UsernameNom Action Timestamp
    {log.username}{log.name} {log.action} {log.timestamp}