From 6bcdcedc66dd4d2ab1ba31566fdfa72a19064844 Mon Sep 17 00:00:00 2001 From: Mathis Date: Fri, 11 Apr 2025 19:48:50 +0200 Subject: [PATCH] Ajout de la page de profil --- .../java/com/example/starter/AuthHandler.java | 7 +- .../com/example/starter/MainVerticle.java | 4 + .../java/com/example/starter/QueryUsers.java | 64 +++- .../java/com/example/starter/SetUser.java | 142 ++++++-- Front-end/src/App.jsx | 6 +- Front-end/src/components/Header.jsx | 12 +- Front-end/src/pages/Gestion/Gestion.jsx | 1 - Front-end/src/pages/Login.jsx | 57 +++- Front-end/src/pages/Profil.jsx | 317 ++++++++++++++++++ Front-end/src/pages/Settings.jsx | 161 --------- Front-end/src/pages/Signup.jsx | 24 +- 11 files changed, 581 insertions(+), 214 deletions(-) create mode 100644 Front-end/src/pages/Profil.jsx delete mode 100644 Front-end/src/pages/Settings.jsx 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 e3a31c3..1bc0490 100644 --- a/Back-end/src/main/java/com/example/starter/AuthHandler.java +++ b/Back-end/src/main/java/com/example/starter/AuthHandler.java @@ -30,8 +30,9 @@ public class AuthHandler { String email = body.getString("email"); String gender = body.getString("gender"); String password = body.getString("password"); + String pseudo = body.getString("pseudo"); - if (name == null || surname == null || email == null || gender == null || password == null) { + if (name == null || surname == null || email == null || gender == null || password == null || pseudo == null) { context.response() .setStatusCode(400) .end(new JsonObject().put("error", "Tous les champs sont requis").encode()); @@ -41,8 +42,8 @@ public class AuthHandler { String hashedPassword = BCrypt.withDefaults().hashToString(12, password.toCharArray()); databaseService.pool - .preparedQuery("INSERT INTO users (name, surname, email, gender, password) VALUES (?, ?, ?, ?, ?)") - .execute(Tuple.of(name, surname, email, gender, hashedPassword)) + .preparedQuery("INSERT INTO users (name, surname, email, gender, password, pseudo) VALUES (?, ?, ?, ?, ?, ?)") + .execute(Tuple.of(name, surname, email, gender, hashedPassword,pseudo)) .onSuccess(result -> { context.response() .setStatusCode(201) 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 b669774..b45f367 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -56,12 +56,16 @@ public class MainVerticle extends AbstractVerticle { router.post("/modifRangeData").handler(setWeatherData::setRangeData); router.post("/deleteObject").handler(setObjects::deleteObject); router.get("/users").handler(queryUsers::getUsers); + router.post("/user").handler(queryUsers::getUser); router.post("/setUserPoints").handler(setUser::setUserPoints); router.post("/deleteUser").handler(setUser::deleteUser); + router.post("/updateProfil").handler(setUser::updateUserProfile); + router.post("/changePassword").handler(setUser::changeUserPassword); // 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/QueryUsers.java b/Back-end/src/main/java/com/example/starter/QueryUsers.java index e065c02..6305e81 100644 --- a/Back-end/src/main/java/com/example/starter/QueryUsers.java +++ b/Back-end/src/main/java/com/example/starter/QueryUsers.java @@ -4,6 +4,7 @@ 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.Tuple; public class QueryUsers { private DatabaseService databaseService; @@ -25,19 +26,20 @@ public class QueryUsers { .onSuccess(rows -> { JsonArray users = new JsonArray(); for (Row row : rows) { - int points=row.getInteger("points"); + 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<=60){ + .put("pseudo",row.getString("pseudo")) + .put("points", points); + if (points <= 60) { user.put("role", "user"); - }else if(points<=100){ + } else if (points <= 100) { user.put("role", "complexe"); - }else if(points>=200){ + } else if (points >= 200) { user.put("role", "admin"); } users.add(user); @@ -48,4 +50,56 @@ public class QueryUsers { }); } + + public void getUser(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 idUser = body.getInteger("idUser"); + Integer idUser = 4; + databaseService.pool + .preparedQuery("SELECT * FROM users WHERE id=?;") + .execute(Tuple.of(idUser)) + .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.size() == 0) { + context.response() + .setStatusCode(404) + .end(new JsonObject().put("error", "Utilisateur non trouvé").encode()); + return; + } + + Row row = rows.iterator().next(); + 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("pseudo",row.getString("pseudo")) + .put("points", points); + + if (points <= 60) { + user.put("role", "user"); + } else if (points <= 100) { + user.put("role", "complexe"); + } else if (points >= 200) { + user.put("role", "admin"); + } + + context.response() + .putHeader("content-type", "application/json; charset=UTF-8") + .end(user.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 index 6bcd9b2..47aa996 100644 --- a/Back-end/src/main/java/com/example/starter/SetUser.java +++ b/Back-end/src/main/java/com/example/starter/SetUser.java @@ -1,5 +1,6 @@ package com.example.starter; +import at.favre.lib.crypto.bcrypt.BCrypt; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.RoutingContext; import io.vertx.sqlclient.Tuple; @@ -10,6 +11,7 @@ public class SetUser { public SetUser(DatabaseService ddbs) { this.databaseService = ddbs; } + public void updateUserPoints(Integer userId, Integer points) { databaseService.pool .preparedQuery("UPDATE users SET points=points+? WHERE id=?") @@ -25,6 +27,105 @@ public class SetUser { } }); } + + public void changeUserPassword(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"); + String oldPassword = body.getString("oldPassword"); + String newPassword = body.getString("newPassword"); + + databaseService.pool + .preparedQuery("SELECT password FROM users WHERE id=?") + .execute(Tuple.of(id)) + .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", "Utilisateur non trouvé").encode()); + return; + } + + String currentPassword = rows.iterator().next().getString("password"); + BCrypt.Result verification = BCrypt.verifyer().verify(oldPassword.toCharArray(), currentPassword); + + if (!verification.verified) { + context.response() + .setStatusCode(401) + .end(new JsonObject().put("error", "Ancien mot de passe incorrect").encode()); + return; + } + String hashedPassword = BCrypt.withDefaults().hashToString(12, newPassword.toCharArray()); + + databaseService.pool + .preparedQuery("UPDATE users SET password=? WHERE id=?") + .execute(Tuple.of(hashedPassword, id)) + .onFailure(e -> { + System.err.println("Erreur lors de la mise à jour du mot de passe :" + e.getMessage()); + context.response() + .setStatusCode(500) + .end(new JsonObject() + .put("error", "Erreur lors de la mise à jour du mot de passe") + .encode()); + }) + .onSuccess(updateRows -> { + context.response() + .putHeader("content-type", "application/json: charset=UTF-8") + .end(new JsonObject().put("success", "Le mot de passe a bien été mis à jour") + .encode()); + }); + }); + } + + public void updateUserProfile(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"); + String name = body.getString("name"); + String surname = body.getString("surname"); + String pseudo = body.getString("pseudo"); + + databaseService.pool + .preparedQuery("UPDATE users SET name=?, surname=?, pseudo=? WHERE id=?") + .execute(Tuple.of(name, surname,pseudo, id)) + .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", "Utilisateur non trouvé").encode()); + return; + } + context.response() + .putHeader("content-type", "application/json: charset=UTF-8") + .end(new JsonObject() + .put("success", "Les informations de l'utilisateur ont bien été mises à jour") + .encode()); + return; + }); + } + public void setUserPoints(RoutingContext context) { JsonObject body = context.body().asJsonObject(); if (body == null) { @@ -59,36 +160,37 @@ public class SetUser { return; }); } - public void deleteUser(RoutingContext context){ + + public void deleteUser(RoutingContext context) { JsonObject body = context.body().asJsonObject(); - if(body== null){ + 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; } Integer id = body.getInteger("id"); databaseService.pool - .preparedQuery("DELETE FROM users WHERE id=?") - .execute(Tuple.of(id)) - .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){ + .preparedQuery("DELETE FROM users WHERE id=?") + .execute(Tuple.of(id)) + .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", "Utilisateur non trouvé").encode()); return; - } - context.response() - .putHeader("content-type","application/json: charset=UTF-8") - .end(new JsonObject().put("success", "L'utilisateur à bien été supprimé").encode()); - return; - }); + } + context.response() + .putHeader("content-type", "application/json: charset=UTF-8") + .end(new JsonObject().put("success", "L'utilisateur à bien été supprimé").encode()); + return; + }); } } diff --git a/Front-end/src/App.jsx b/Front-end/src/App.jsx index 18df2c9..46f897a 100644 --- a/Front-end/src/App.jsx +++ b/Front-end/src/App.jsx @@ -9,7 +9,7 @@ import Objet from "./pages/Gestion/Objet.jsx"; import AddObject from "./pages/Gestion/AddObject.jsx"; import Signup from "./pages/Signup.jsx"; import Login from "./pages/Login.jsx"; -import Settings from "./pages/Settings.jsx"; +import Profil from "./pages/Profil.jsx"; import Sidebar from "./pages/Admin/sidebar.jsx"; import User from "./pages/Admin/User.jsx"; import Dashboard from "./pages/Admin/Dashboard.jsx"; @@ -31,9 +31,9 @@ function App() { } /> } /> } />} /> - } /> + }/>} /> } /> - } /> + }/>} /> } /> } />} /> diff --git a/Front-end/src/components/Header.jsx b/Front-end/src/components/Header.jsx index 52dada0..35f0d20 100644 --- a/Front-end/src/components/Header.jsx +++ b/Front-end/src/components/Header.jsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from "react"; -import { X, Menu, LogIn, UserPlus, LogOut, Settings } from "lucide-react"; +import { X, Menu, LogIn, UserPlus, LogOut, User } from "lucide-react"; import { Link } from "react-router-dom"; import { useAuth } from "../AuthContext"; @@ -80,12 +80,12 @@ function Header() { <>
  • setIsMenuOpen(false)} className="flex items-center gap-2 text-gray-600 hover:text-indigo-600" > - - Paramètres + + Profil
  • @@ -127,11 +127,11 @@ function Header() { ) : (
    setIsMenuOpen(false)} className="flex items-center gap-2 text-gray-600 hover:text-indigo-600" > - + +
    + + +
    +
    + +
    +
    +

    {userData.name} {userData.surname} ({userData.pseudo})

    +

    {userData.email}

    +
    +
    + +
    +

    Points de fidélité: {userData.points} ({userData.role})

    +
    + + {editMode ? ( + <> +
    + + +
    + +
    + + +
    +
    + + +
    + +
    + +
    +
    + +
    + +
    +
    + + + + ) : ( +
    +
    +

    Prénom

    +

    {userData.name}

    +
    +
    +

    Nom

    +

    {userData.surname}

    +
    +
    +

    Email

    +

    {userData.email}

    +
    +
    + )} + + + + {/* Changement de mot de passe */} +
    +

    Modifier le mot de passe

    +
    +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    + + +
    +
    + + + + ); +} + +export default Profil; \ No newline at end of file diff --git a/Front-end/src/pages/Settings.jsx b/Front-end/src/pages/Settings.jsx deleted file mode 100644 index 924a6b4..0000000 --- a/Front-end/src/pages/Settings.jsx +++ /dev/null @@ -1,161 +0,0 @@ -import React, { useState } from 'react'; -import { Mail, User, Lock } from 'lucide-react'; -import { useNavigate, Link} from 'react-router-dom'; // Importation du hook useNavigate - -function Settings() { - const [formData, setFormData] = useState({ - name: '', - surname: '', - email: '', - gender: '', - password: '', - confirmPassword: '' - }); - const navigate = useNavigate(); // Initialisation de useNavigate - - const handleChange = (e) => { - const { name, value } = e.target; - setFormData(prev => ({ - ...prev, - [name]: value - })); - }; - - const handleSubmit = async (e) => { - e.preventDefault(); - - if (formData.password !== formData.confirmPassword) { - alert("Les mots de passe ne correspondent pas !"); - return; - } - - try { - const response = await fetch(`${API_BASE_URL}/settings`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(formData), - }); - - const data = await response.json(); - - if (!response.ok) { - throw new Error(data.error || "Erreur lors de la modification"); - } - - alert("Modification réussie !"); - - // Redirection vers la page d'accueil après une inscription réussie - navigate("/home"); // Remplace "/home" par l'URL de ta page d'accueil - } catch (error) { - alert(error.message); - } - }; - - return ( -
    -
    -

    Settings

    -
    - {/* (Formulaire changement Email, Mot de passe) */} - - - - {/* Email */} -
    - -
    -
    - -
    - -
    -
    - - {/* Mot de passe */} -
    - -
    -
    - -
    - -
    -
    - - {/* nouveau mot de passe */} -
    - -
    -
    - -
    - -
    -
    -
    - -
    -
    - -
    - -
    -
    - {/* Bouton d'inscription */} -
    - -
    -
    - -
    -
    - ); -} - -export default Settings; diff --git a/Front-end/src/pages/Signup.jsx b/Front-end/src/pages/Signup.jsx index e18140f..c6703db 100644 --- a/Front-end/src/pages/Signup.jsx +++ b/Front-end/src/pages/Signup.jsx @@ -7,6 +7,7 @@ function Signup() { const [formData, setFormData] = useState({ name: '', surname: '', + pseudo:'', email: '', gender: '', password: '', @@ -62,7 +63,7 @@ function Signup() { {/* Formulaire (Nom, Prénom, Sexe, Email, Mot de passe) */}
    @@ -81,7 +82,7 @@ function Signup() {
    @@ -98,6 +99,25 @@ function Signup() {
    +
    + +
    +
    + +
    + +
    +
    + {/* Sexe */}