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 1c64300..cf0ea07 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -47,7 +47,7 @@ public class MainVerticle extends AbstractVerticle { // Déclaration des routes router.get("/objets").handler(queryObjects::getObjects); - router.get("/objet").handler(queryObjects::getParticularObject); + router.post("/objet").handler(queryObjects::getParticularObject); router.post("/modifObjet").handler(setObjects::setInfoObjet); router.get("/wind").handler(queryWeather::getWindInfos); router.get("/meteo").handler(queryWeather::getMeteoInfos); 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 f984225..95a3427 100644 --- a/Back-end/src/main/java/com/example/starter/QueryObjects.java +++ b/Back-end/src/main/java/com/example/starter/QueryObjects.java @@ -41,9 +41,16 @@ public class QueryObjects { } public void getParticularObject(RoutingContext context) { - String id = context.request().getParam("id"); - // Integer idUser = body.getInteger("idUser"); - Integer idUser = 4; + 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 id = body.getString("id"); + + String idUser = body.getString("userId"); if (id == null) { context.response() .setStatusCode(400) @@ -66,10 +73,13 @@ public class QueryObjects { .end(new JsonObject().put("error", "Objet non trouvé").encode()); return; } - if (idUser != null) { - setUser.updateUserPoints(idUser, 1); + System.out.println(idUser); + + Boolean shouldUpdatePoints = body.getBoolean("shouldUpdatePoints", false); + + if (Boolean.TRUE.equals(shouldUpdatePoints) && idUser != null) { + setUser.updateUserPoints(Integer.parseInt(idUser), 1); } - ; context.response() .putHeader("content-type", "application/json: charset=UTF-8") .end(getInfosObjects(rows).encode()); 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 f9f744a..be4dae7 100644 --- a/Back-end/src/main/java/com/example/starter/QueryUsers.java +++ b/Back-end/src/main/java/com/example/starter/QueryUsers.java @@ -109,8 +109,7 @@ public class QueryUsers { .end(new JsonObject().put("error", "Corps de la requête manquant").encode()); return; } - //Integer idUser = body.getInteger("idUser"); - Integer idUser = 4; + Integer idUser = body.getInteger("idUser"); databaseService.pool .preparedQuery("SELECT * FROM users WHERE id=?;") .execute(Tuple.of(idUser)) 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 30045e4..ad16b15 100644 --- a/Back-end/src/main/java/com/example/starter/SetObjects.java +++ b/Back-end/src/main/java/com/example/starter/SetObjects.java @@ -7,12 +7,15 @@ 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){ + + public void setUserHandler(SetUser setUser) { this.setUser = setUser; } + public void setInfoObjet(RoutingContext context) { JsonObject body = context.body().asJsonObject(); if (body == null) { @@ -22,8 +25,7 @@ public class SetObjects { return; } Integer id = body.getInteger("id"); - // Integer idUser = body.getInteger("idUser"); - Integer idUser = 4; + Integer idUser = body.getInteger("idUser"); String description = body.getString("description"); String type = body.getString("type"); String location = body.getString("location"); @@ -46,57 +48,60 @@ public class SetObjects { .end(new JsonObject().put("error", "Objet non trouvé").encode()); return; } - if(idUser!=null){ - setUser.updateUserPoints(idUser,1); - }; + Boolean shouldUpdatePoints = body.getBoolean("shouldUpdatePoints", false); + + if (Boolean.TRUE.equals(shouldUpdatePoints) && 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()); return; }); } - public void deleteObject(RoutingContext context){ + + public void deleteObject(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; } String id = body.getString("id"); databaseService.pool - .preparedQuery("DELETE FROM weather_objects WHERE id=?") - .execute(Tuple.of(Integer.parseInt(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 weather_objects WHERE id=?") + .execute(Tuple.of(Integer.parseInt(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", "Objet non trouvé").encode()); return; - } - context.response() - .putHeader("content-type","application/json: charset=UTF-8") - .end(new JsonObject().put("success", "L'objet à bien été supprimé").encode()); - return; - }); + } + context.response() + .putHeader("content-type", "application/json: charset=UTF-8") + .end(new JsonObject().put("success", "L'objet à bien été supprimé").encode()); + return; + }); } - public void newObject(RoutingContext context){ + + public void newObject(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 idUser = body.getInteger("idUser"); - Integer idUser = 4; + Integer idUser = body.getInteger("proprio_id"); String name = body.getString("nom"); String description = body.getString("description"); String type = body.getString("type"); @@ -105,29 +110,31 @@ public class SetObjects { String batterieType = body.getString("batterieType"); Integer proprio_id = body.getInteger("proprio_id"); databaseService.pool - .preparedQuery("INSERT INTO weather_objects (name,description,type,location,status,type_batterie,proprio_id) VALUES (?,?,?,?,?,?,?)") - .execute(Tuple.of(name,description,type,location,status,batterieType,proprio_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( + "INSERT INTO weather_objects (name,description,type,location,status,type_batterie,proprio_id) VALUES (?,?,?,?,?,?,?)") + .execute(Tuple.of(name, description, type, location, status, batterieType, proprio_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", "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; - }); + } + 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/SetWeatherData.java b/Back-end/src/main/java/com/example/starter/SetWeatherData.java index d6ca45f..b6fb7c8 100644 --- a/Back-end/src/main/java/com/example/starter/SetWeatherData.java +++ b/Back-end/src/main/java/com/example/starter/SetWeatherData.java @@ -41,8 +41,7 @@ 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; + Integer idUser = body.getInteger("idUser"); databaseService.pool .preparedQuery( query) diff --git a/Front-end/src/App.jsx b/Front-end/src/App.jsx index fde0836..fbf874c 100644 --- a/Front-end/src/App.jsx +++ b/Front-end/src/App.jsx @@ -41,7 +41,6 @@ function App() { {/* Routes protégées pour tous les utilisateurs connectés */} } allowedRoles={['admin', 'complexe', 'user']} />} /> } allowedRoles={['admin', 'complexe', 'user']} />} /> - {/* Routes protégées pour les admins uniquement */} } allowedRoles={['admin']} />} /> } allowedRoles={['admin']} />} /> diff --git a/Front-end/src/ProtectedRoute.jsx b/Front-end/src/ProtectedRoute.jsx index 02d7308..b329341 100644 --- a/Front-end/src/ProtectedRoute.jsx +++ b/Front-end/src/ProtectedRoute.jsx @@ -4,19 +4,17 @@ import { useAuth } from "./AuthContext"; // Utilisation du contexte d'authentif function ProtectedRoute({ element, allowedRoles }) { const { token, user } = 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é mais n'a pas le bon rôle - if (allowedRoles && !allowedRoles.includes(user?.role)) { - return ; + if(user){ + if (allowedRoles && !allowedRoles.includes(user?.role)) { + return ; + } + return element; } - - // Si l'utilisateur est authentifié et a les bons rôles, permettez l'accès à la route - return element; } export default ProtectedRoute; diff --git a/Front-end/src/components/AlertInactive.jsx b/Front-end/src/components/AlertInactive.jsx index 5f06a76..72df6b0 100644 --- a/Front-end/src/components/AlertInactive.jsx +++ b/Front-end/src/components/AlertInactive.jsx @@ -1,9 +1,11 @@ import React, {useState} from "react"; import { TriangleAlert,X } from "lucide-react"; +import { useAuth } from "../AuthContext"; function AlertInactive({affAlert,setAffAlert}) { + const { user } = useAuth(); return ( - (affAlert&&( + (affAlert&&(user?.role!=="user")&&(
- + )}
+

Bienvenue dans le module Gestion.

+

- Ce module vous permet de gérer les capteur et stations connectés de France de manière simple et efficace. + Ce module vous permet de gérer les capteurs et stations connectés de France de manière simple et efficace.

@@ -42,6 +45,7 @@ function Gestion() { Explorer les objets
+
diff --git a/Front-end/src/pages/Gestion/ObjectManagement.jsx b/Front-end/src/pages/Gestion/ObjectManagement.jsx index a7fedd2..513bc0c 100644 --- a/Front-end/src/pages/Gestion/ObjectManagement.jsx +++ b/Front-end/src/pages/Gestion/ObjectManagement.jsx @@ -3,8 +3,9 @@ import { Search, ArrowRight, RadioTower,Plus } from "lucide-react"; import { useEffect, useState } from "react"; import axios from "axios"; import { API_BASE_URL } from "../../config"; - +import { useAuth } from "../../AuthContext"; function ObjectManagement() { + const {user} = useAuth(); const [searchQuery, setSearchQuery] = useState(""); const [activeFilter, setActiveFilter] = useState(""); const [objects, setObjects] = useState([]); @@ -34,7 +35,7 @@ function ObjectManagement() {

- Gestion des Objets connectés. + {(user?.role!=="user")?("Gestion"):("Visualisation")} des Objets connectés.

diff --git a/Front-end/src/pages/Gestion/Objet.jsx b/Front-end/src/pages/Gestion/Objet.jsx index cd40f07..2d484bd 100644 --- a/Front-end/src/pages/Gestion/Objet.jsx +++ b/Front-end/src/pages/Gestion/Objet.jsx @@ -12,7 +12,9 @@ import WindInfo from "../../components/WindInfo"; import MeteoInfos from "../../components/MeteoInfos"; import MeteoGraph from "../../components/MeteoGraph"; import BatterieInfo from "../../components/BatterieInfo"; +import { useAuth } from "../../AuthContext"; function Objet() { + const {user} =useAuth(); const identifiant = new URLSearchParams(window.location.search).get("id"); const [object, setObject] = useState({}); const [graphStates, setGraphStates] = useState({ @@ -28,12 +30,20 @@ function Objet() { humidity: useRef(null), wind: useRef(null), }; - useEffect(() => { - axios.get(`${API_BASE_URL}/objet?id=${identifiant}`).then((response) => { - setObject(response.data[0]); - }); - }, [identifiant]); + axios + .post(`${API_BASE_URL}/objet`, { + id: identifiant, + userId:user.id, + shouldUpdatePoints:true, + }) + .then((response) => { + setObject(response.data[0]); + }) + .catch((error) => { + console.error("Erreur lors de la récupération :", error); + }); + }, [user]); return object && object.id ? (
diff --git a/Front-end/src/pages/Login.jsx b/Front-end/src/pages/Login.jsx index 21e6fae..8eca535 100644 --- a/Front-end/src/pages/Login.jsx +++ b/Front-end/src/pages/Login.jsx @@ -11,8 +11,8 @@ function Login() { password: "", }); const [error, setError] = useState(""); - const { login } = useAuth(); // Utilisation du hook useAuth pour accéder à la fonction login - const navigate = useNavigate(); // Initialisation de useNavigate + const { login } = useAuth(); + const navigate = useNavigate(); const handleChange = (e) => { const { name, value } = e.target; @@ -20,13 +20,12 @@ function Login() { ...prev, [name]: value, })); - // Réinitialiser l'erreur lorsque l'utilisateur commence à modifier le formulaire if (error) setError(""); }; const handleSubmit = async (e) => { e.preventDefault(); - setError(""); // Réinitialiser les erreurs à chaque tentative + setError(""); try { const response = await axios.post(`${API_BASE_URL}/login`, formData, { @@ -46,7 +45,6 @@ function Login() { console.error("Erreur lors de la connexion", error); if (error.response) { - // Le serveur a répondu avec un statut d'erreur (4xx, 5xx) if (error.response.status === 401) { setError("Email ou mot de passe incorrect"); } else if (error.response.status === 422) { @@ -60,12 +58,10 @@ function Login() { ); } } else if (error.request) { - // La requête a été faite mais pas de réponse reçue setError( "Impossible de joindre le serveur. Vérifiez votre connexion internet." ); } else { - // Une erreur s'est produite lors de la configuration de la requête setError("Une erreur s'est produite. Veuillez réessayer."); } } diff --git a/Front-end/src/pages/Profil.jsx b/Front-end/src/pages/Profil.jsx index aa22826..fc1d89d 100644 --- a/Front-end/src/pages/Profil.jsx +++ b/Front-end/src/pages/Profil.jsx @@ -7,6 +7,7 @@ import axios from "axios"; function Profil() { const [userData, setUserData] = useState({}); + const { user } = useAuth(); useEffect(() => { if (user) {