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 cb0d0cd..e3a31c3 100644 --- a/Back-end/src/main/java/com/example/starter/AuthHandler.java +++ b/Back-end/src/main/java/com/example/starter/AuthHandler.java @@ -94,11 +94,11 @@ public class AuthHandler { if (verification.verified) { JsonObject claims = new JsonObject().put("sub", email); - if(nbPointsUser<=30){ + if(nbPointsUser<=60){ claims.put("role", "user"); - }else if(nbPointsUser<=60){ + }else if(nbPointsUser<=100){ claims.put("role", "complexe"); - }else if(nbPointsUser>=100){ + }else if(nbPointsUser>=200){ claims.put("role", "admin"); } 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 052e187..b669774 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -41,6 +41,9 @@ public class MainVerticle extends AbstractVerticle { AuthHandler authHandler = new AuthHandler(databaseService, jwtAuth); QueryUsers queryUsers = new QueryUsers(databaseService); SetUser setUser = new SetUser(databaseService); + setObjects.setUserHandler(setUser); + queryObjects.setUserHandler(setUser); + // Déclaration des routes router.get("/objets").handler(queryObjects::getObjects); @@ -54,6 +57,8 @@ public class MainVerticle extends AbstractVerticle { router.post("/deleteObject").handler(setObjects::deleteObject); router.get("/users").handler(queryUsers::getUsers); router.post("/setUserPoints").handler(setUser::setUserPoints); + router.post("/deleteUser").handler(setUser::deleteUser); + // 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 8d90bf0..029a497 100644 --- a/Back-end/src/main/java/com/example/starter/QueryObjects.java +++ b/Back-end/src/main/java/com/example/starter/QueryObjects.java @@ -10,14 +10,20 @@ import java.time.format.DateTimeFormatter; import io.vertx.ext.web.RoutingContext; - public class QueryObjects { - private DatabaseService databaseService; - public QueryObjects(DatabaseService dtbS){ - this.databaseService = dtbS; - } + private DatabaseService databaseService; - public void getObjects(RoutingContext context) { + public QueryObjects(DatabaseService dtbS) { + this.databaseService = dtbS; + } + + private SetUser setUser; + + public void setUserHandler(SetUser setUser) { + this.setUser = setUser; + } + + public void getObjects(RoutingContext context) { databaseService.pool .query("SELECT * FROM weather_objects;") .execute() @@ -36,6 +42,8 @@ public class QueryObjects { public void getParticularObject(RoutingContext context) { String id = context.request().getParam("id"); + // Integer idUser = body.getInteger("idUser"); + Integer idUser = 4; if (id == null) { context.response() .setStatusCode(400) @@ -58,6 +66,10 @@ public class QueryObjects { .end(new JsonObject().put("error", "Objet non trouvé").encode()); return; } + if (idUser != null) { + setUser.updateUserPoints(idUser, 1); + } + ; context.response() .putHeader("content-type", "application/json: charset=UTF-8") .end(getInfosObjects(rows).encode()); @@ -77,9 +89,9 @@ public class QueryObjects { .put("location", row.getString("location")) .put("last_update", row.getLocalDateTime("last_update").format(formatter)) .put("status", row.getString("status")) - .put("batterie",row.getInteger("batterie")) - .put("type_batterie",row.getString("type_batterie")) - .put("proprio",row.getString("proprio")); + .put("batterie", row.getInteger("batterie")) + .put("type_batterie", row.getString("type_batterie")) + .put("proprio", row.getString("proprio")); objects.add(object); } return objects; 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 a3cca49..e065c02 100644 --- a/Back-end/src/main/java/com/example/starter/QueryUsers.java +++ b/Back-end/src/main/java/com/example/starter/QueryUsers.java @@ -33,11 +33,11 @@ public class QueryUsers { .put("email", row.getString("email")) .put("gender", row.getString("gender")) .put("points",points); - if(points<=30){ + if(points<=60){ user.put("role", "user"); - }else if(points<=60){ + }else if(points<=100){ user.put("role", "complexe"); - }else if(points>=100){ + }else if(points>=200){ user.put("role", "admin"); } users.add(user); 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 e3a6de6..a1bb0e6 100644 --- a/Back-end/src/main/java/com/example/starter/SetObjects.java +++ b/Back-end/src/main/java/com/example/starter/SetObjects.java @@ -6,11 +6,13 @@ import io.vertx.sqlclient.Tuple; public class SetObjects { private DatabaseService databaseService; - + private SetUser setUser; public SetObjects(DatabaseService ddbs) { this.databaseService = ddbs; } - + public void setUserHandler(SetUser setUser){ + this.setUser = setUser; + } public void setInfoObjet(RoutingContext context) { JsonObject body = context.body().asJsonObject(); if (body == null) { @@ -20,6 +22,8 @@ public class SetObjects { return; } Integer id = body.getInteger("id"); + // Integer idUser = body.getInteger("idUser"); + Integer idUser = 4; String description = body.getString("description"); String type = body.getString("type"); String location = body.getString("location"); @@ -42,6 +46,9 @@ public class SetObjects { .end(new JsonObject().put("error", "Objet non trouvé").encode()); return; } + if(idUser!=null){ + setUser.updateUserPoints(idUser,1); + }; context.response() .putHeader("content-type", "application/json: charset=UTF-8") .end(new JsonObject().put("success", "L'objet à bien été mis à jour").encode()); @@ -88,6 +95,8 @@ public class SetObjects { .end(new JsonObject().put("error","Corps de la requête manquant").encode()); return; } + // Integer idUser = body.getInteger("idUser"); + Integer idUser = 4; String name = body.getString("nom"); String description = body.getString("description"); String type = body.getString("type"); @@ -111,12 +120,14 @@ public class SetObjects { .end(new JsonObject().put("error", "Objet non trouvé").encode()); return; } + if(idUser!=null){ + setUser.updateUserPoints(idUser,2); + }; context.response() .putHeader("content-type","application/json: charset=UTF-8") .end(new JsonObject().put("success", "L'objet à bien été ajouté").encode()); return; }); - } } 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 9d104fd..6bcd9b2 100644 --- a/Back-end/src/main/java/com/example/starter/SetUser.java +++ b/Back-end/src/main/java/com/example/starter/SetUser.java @@ -10,7 +10,21 @@ 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=?") + .execute(Tuple.of(points, userId)) + .onFailure(e -> { + System.err.println("Erreur de mise à jour des points :" + e.getMessage()); + }) + .onSuccess(rows -> { + if (rows.rowCount() > 0) { + System.out.println("Points de l'utilisateur mis à jour avec succès"); + } else { + System.out.println("Utilisateur non trouvé pour la mise à jour des points"); + } + }); + } public void setUserPoints(RoutingContext context) { JsonObject body = context.body().asJsonObject(); if (body == null) { @@ -21,11 +35,10 @@ public class SetUser { } Integer id = body.getInteger("id"); Integer points = body.getInteger("points"); - databaseService.pool .preparedQuery( "UPDATE users SET points=? WHERE id=?") - .execute(Tuple.of(points,id)) + .execute(Tuple.of(points, id)) .onFailure(e -> { System.err.println("Erreur de récupération de la BDD :" + e.getMessage()); context.response() @@ -41,8 +54,41 @@ public class SetUser { } 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()); + .end(new JsonObject().put("success", "Les points de l'utilisateur ont bien été mis à jour") + .encode()); return; }); } + public void deleteUser(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"); + 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){ + 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; + }); + + } } diff --git a/Back-end/src/main/java/com/example/starter/SetWeatherData.java b/Back-end/src/main/java/com/example/starter/SetWeatherData.java index 4c2fb56..d6ca45f 100644 --- a/Back-end/src/main/java/com/example/starter/SetWeatherData.java +++ b/Back-end/src/main/java/com/example/starter/SetWeatherData.java @@ -6,11 +6,15 @@ import io.vertx.sqlclient.Tuple; public class SetWeatherData { private DatabaseService databaseService; + private SetUser setUser; + public SetWeatherData(DatabaseService ddbs) { this.databaseService = ddbs; } - + public void setUserHandler(SetUser setUser) { + this.setUser = setUser; + } public void setRangeData(RoutingContext context) { JsonObject body = context.body().asJsonObject(); if (body == null) { @@ -37,7 +41,8 @@ public class SetWeatherData { return; } String query = String.format("UPDATE range_data SET %s_min=?, %s_max=? WHERE station_id=?", type, type); - + // Integer idUser = body.getInteger("idUser"); + Integer idUser = 4; databaseService.pool .preparedQuery( query) @@ -55,6 +60,9 @@ public class SetWeatherData { .end(new JsonObject().put("error", "Objet non trouvé").encode()); return; } + if (idUser != null) { + setUser.updateUserPoints(idUser, 1); + } context.response() .putHeader("content-type", "application/json: charset=UTF-8") .end(new JsonObject().put("success", "Les limites ont bien été mis à jour").encode()); diff --git a/Front-end/src/App.jsx b/Front-end/src/App.jsx index 5b1d6c8..18df2c9 100644 --- a/Front-end/src/App.jsx +++ b/Front-end/src/App.jsx @@ -14,6 +14,7 @@ import Sidebar from "./pages/Admin/sidebar.jsx"; import User from "./pages/Admin/User.jsx"; import Dashboard from "./pages/Admin/Dashboard.jsx"; import AdminObjet from "./pages/Admin/AdminObjet.jsx"; +import ProtectedRoute from './ProtectedRoute.jsx'; // Correction de l'import function App() { return ( @@ -24,17 +25,17 @@ function App() { } /> } /> - } /> - } /> - } /> + } />} /> + } />} /> + } />} /> } /> } /> - } /> + } />} /> } /> } /> } /> } /> - } /> + } />} /> diff --git a/Front-end/src/ProtectedRoute.jsx b/Front-end/src/ProtectedRoute.jsx new file mode 100644 index 0000000..9df0306 --- /dev/null +++ b/Front-end/src/ProtectedRoute.jsx @@ -0,0 +1,16 @@ +import { useAuth } from './AuthContext'; // Utilisation du contexte d'authentification +import { Navigate } from 'react-router-dom'; // Utilisation de React Router pour la redirection + +function ProtectedRoute({ element }) { + const { token } = useAuth(); // Vérifier si un token existe, donc si l'utilisateur est authentifié + + // Si l'utilisateur n'est pas authentifié, redirigez-le vers la page de login + if (!token) { + return ; + } + + // Si l'utilisateur est authentifié, permettez l'accès à la route + return element; +} + +export default ProtectedRoute; // Export de la fonction diff --git a/Front-end/src/components/AlertInactive.jsx b/Front-end/src/components/AlertInactive.jsx index 917694b..5f06a76 100644 --- a/Front-end/src/components/AlertInactive.jsx +++ b/Front-end/src/components/AlertInactive.jsx @@ -4,7 +4,7 @@ import { TriangleAlert,X } from "lucide-react"; function AlertInactive({affAlert,setAffAlert}) { return ( (affAlert&&( -
+
@@ -13,7 +13,7 @@ function AlertInactive({affAlert,setAffAlert}) {

Cet objet peut être inactif dû à son manque de données. Vous pouvez le - rendre inactif en appuyant ici. + rendre inactif en changeant son status.

))); diff --git a/Front-end/src/components/Header.jsx b/Front-end/src/components/Header.jsx index 3c4c93b..d510c46 100644 --- a/Front-end/src/components/Header.jsx +++ b/Front-end/src/components/Header.jsx @@ -33,21 +33,33 @@ function Header() { {!token ? ( -
- +
+ setIsMenuOpen(false)} + className="hover:text-indigo-600 flex items-center gap-2" + > Connexion setIsMenuOpen(false)} className="flex items-center gap-2 bg-indigo-600 text-white px-4 py-2 rounded-lg hover:bg-indigo-700" > @@ -150,8 +174,12 @@ function Header() {
) : ( -
- +
+ setIsMenuOpen(false)} + className="flex items-center gap-2 text-gray-600 hover:text-indigo-600" + > @@ -227,6 +244,7 @@ function User() { className="p-2 bg-red-600 text-white rounded-md" > Supprimer + Supprimer diff --git a/Front-end/src/pages/Gestion/ObjectManagement.jsx b/Front-end/src/pages/Gestion/ObjectManagement.jsx index a440258..a7fedd2 100644 --- a/Front-end/src/pages/Gestion/ObjectManagement.jsx +++ b/Front-end/src/pages/Gestion/ObjectManagement.jsx @@ -2,6 +2,7 @@ import React from "react"; import { Search, ArrowRight, RadioTower,Plus } from "lucide-react"; import { useEffect, useState } from "react"; import axios from "axios"; +import { API_BASE_URL } from "../../config"; function ObjectManagement() { const [searchQuery, setSearchQuery] = useState(""); @@ -24,7 +25,7 @@ function ObjectManagement() { }); useEffect(() => { - axios.get("http://localhost:8888/objets").then((response) => { + axios.get(`${API_BASE_URL}/objets`).then((response) => { setObjects(response.data); }); }, []); diff --git a/Front-end/src/pages/Login.jsx b/Front-end/src/pages/Login.jsx index 5aab8e4..7a06d01 100644 --- a/Front-end/src/pages/Login.jsx +++ b/Front-end/src/pages/Login.jsx @@ -1,13 +1,14 @@ -import React, { useState } from 'react'; -import { Mail, Lock } from 'lucide-react'; -import { useNavigate, Link } from 'react-router-dom'; -import axios from 'axios'; // Assurez-vous d'avoir axios importé -import { useAuth } from '../AuthContext'; +import React, { useState } from "react"; +import { Mail, Lock } from "lucide-react"; +import { useNavigate, Link } from "react-router-dom"; +import axios from "axios"; // Assurez-vous d'avoir axios importé +import { useAuth } from "../AuthContext"; +import { API_BASE_URL } from "../config"; function Login() { const [formData, setFormData] = useState({ - email: '', - password: '' + email: "", + password: "", }); const { login } = useAuth(); // Utilisation du hook useAuth pour accéder à la fonction login const navigate = useNavigate(); // Initialisation de useNavigate @@ -16,7 +17,7 @@ function Login() { const { name, value } = e.target; setFormData((prev) => ({ ...prev, - [name]: value + [name]: value, })); }; @@ -24,7 +25,7 @@ function Login() { e.preventDefault(); try { - const response = await fetch("http://localhost:8888/login", { + const response = await fetch(`${API_BASE_URL}/login`, { method: "POST", headers: { "Content-Type": "application/json", @@ -41,18 +42,20 @@ function Login() { login(data.token); // Rediriger vers la page d'accueil après la connexion - navigate('/'); + navigate("/"); } else { - console.error('Token manquant dans la réponse'); + console.error("Token manquant dans la réponse"); } } catch (error) { - console.error('Erreur lors de la connexion', error); + console.error("Erreur lors de la connexion", error); } }; return (
-
-

Connexion

+
+

+ Connexion +

{/* Email */}
@@ -108,8 +111,14 @@ function Login() { {/* Lien vers la page d'inscription */}

- Vous n'avez pas de compte ? - Inscrivez-vous ici + Vous n'avez pas de compte ? + + {" "} + Inscrivez-vous ici +

diff --git a/Front-end/src/pages/Settings.jsx b/Front-end/src/pages/Settings.jsx index b749a20..924a6b4 100644 --- a/Front-end/src/pages/Settings.jsx +++ b/Front-end/src/pages/Settings.jsx @@ -30,7 +30,7 @@ function Settings() { } try { - const response = await fetch("http://localhost:8888/settings", { + const response = await fetch(`${API_BASE_URL}/settings`, { method: "POST", headers: { "Content-Type": "application/json", diff --git a/Front-end/src/pages/Signup.jsx b/Front-end/src/pages/Signup.jsx index 595e7ec..e18140f 100644 --- a/Front-end/src/pages/Signup.jsx +++ b/Front-end/src/pages/Signup.jsx @@ -1,6 +1,7 @@ import React, { useState } from 'react'; import { Mail, User, Lock } from 'lucide-react'; import { useNavigate, Link} from 'react-router-dom'; // Importation du hook useNavigate +import { API_BASE_URL } from "../config.js"; function Signup() { const [formData, setFormData] = useState({ @@ -11,7 +12,7 @@ function Signup() { password: '', confirmPassword: '' }); - const navigate = useNavigate(); // Initialisation de useNavigate + const navigate = useNavigate(); const handleChange = (e) => { const { name, value } = e.target; @@ -30,7 +31,7 @@ function Signup() { } try { - const response = await fetch("http://localhost:8888/signup", { + const response = await fetch(`${API_BASE_URL}/signup`, { method: "POST", headers: { "Content-Type": "application/json", @@ -46,8 +47,8 @@ function Signup() { alert("Inscription 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 + + navigate("/"); } catch (error) { alert(error.message); } @@ -55,7 +56,7 @@ function Signup() { return (
-
+

Inscription

{/* Formulaire (Nom, Prénom, Sexe, Email, Mot de passe) */}