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}