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 66b020c..839e041 100644 --- a/Back-end/src/main/java/com/example/starter/MainVerticle.java +++ b/Back-end/src/main/java/com/example/starter/MainVerticle.java @@ -69,6 +69,8 @@ public class MainVerticle extends AbstractVerticle { router.post("/changePassword").handler(setUser::changeUserPassword); router.post("/publicUser").handler(queryUsers::getPublicUser); router.get("/getCategories").handler(queryObjects::getCategories); + router.get("/getLocations").handler(queryObjects::getLocations); + router.post("/getMeteoHome").handler(queryWeather::getMeteoInfosHomePage); router.post("/addCategories").handler(setObjects::newCategorie); router.post("/deleteCategories").handler(setObjects::deleteCategories); router.post("/requestDeleteObject").handler(RequestDeleteObject::deleteObject); 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 61d60dc..e30f2a2 100644 --- a/Back-end/src/main/java/com/example/starter/QueryObjects.java +++ b/Back-end/src/main/java/com/example/starter/QueryObjects.java @@ -40,6 +40,33 @@ public class QueryObjects { }); } + public void getLocations(RoutingContext context) { + databaseService.pool + .query("SELECT DISTINCT location FROM weather_objects;") + .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 -> { + if (!rows.iterator().hasNext()) { + context.response() + .setStatusCode(404) + .end(new JsonObject().put("error", "Aucun lieu trouvé dans la base de données").encode()); + return; + } + + JsonArray types = new JsonArray(); + rows.forEach(row -> types.add(row.getString("location"))); + + context.response() + .putHeader("content-type", "application/json; charset=UTF-8") + .end(types.encode()); + }); + } + public void getCategories(RoutingContext context) { databaseService.pool .query("SELECT name FROM categories;") diff --git a/Back-end/src/main/java/com/example/starter/QueryWeatherData.java b/Back-end/src/main/java/com/example/starter/QueryWeatherData.java index 4a0dbb6..ee07190 100644 --- a/Back-end/src/main/java/com/example/starter/QueryWeatherData.java +++ b/Back-end/src/main/java/com/example/starter/QueryWeatherData.java @@ -48,6 +48,42 @@ public class QueryWeatherData { .end((convertRowsToJson(rows)).encode()); }); } + + public void getMeteoInfosHomePage(RoutingContext context) { + JsonObject body = context.body().asJsonObject(); + String location = body.getString("location"); + if (location == null) { + context.response() + .setStatusCode(400) + .end(new JsonObject().put("error", "Paramètre 'location' manquant").encode()); + return; + } + System.out.println("Paramètre passé à la requête : '" + location + "'"); + databaseService.pool + .query("SELECT wd.wind_speed, wd.temperature, wd.humidity, wd.pressure FROM weather_data wd " + + "JOIN weather_objects s ON wd.station_id = s.id WHERE s.location = '" + location + + "' ORDER BY wd.timestamp DESC LIMIT 1;") + .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 -> { + if (rows.size() == 0) { + context.response() + .setStatusCode(404) + .end(new JsonObject().put("error", "Aucune donnée trouvée pour cette location").encode()); + return; + } + + context.response() + .putHeader("content-type", "application/json; charset=UTF-8") + .end(convertRowsToJson(rows).encode()); + }); + } + public void getMeteoInfos(RoutingContext context) { String id = context.request().getParam("id"); if (id == null) { @@ -78,35 +114,37 @@ public class QueryWeatherData { .end((convertRowsToJson(rows)).encode()); }); } - public void getRangeData(RoutingContext context){ - String id= context.request().getParam("id"); - if(id==null){ + + public void getRangeData(RoutingContext context) { + String id = context.request().getParam("id"); + if (id == null) { context.response() - .setStatusCode(400) - .end(new JsonObject().put("error","Paramètre 'id' manquant").encode()); + .setStatusCode(400) + .end(new JsonObject().put("error", "Paramètre 'id' manquant").encode()); return; } databaseService.pool - .preparedQuery("SELECT temperature_min,temperature_max,pressure_min,pressure_max,humidity_min,humidity_max FROM range_data WHERE station_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()); - return; - }) - .onSuccess(rows->{ - if(rows.size() == 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((convertRowsToJson(rows)).encode()); - }); + .preparedQuery( + "SELECT temperature_min,temperature_max,pressure_min,pressure_max,humidity_min,humidity_max FROM range_data WHERE station_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()); + return; + }) + .onSuccess(rows -> { + if (rows.size() == 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((convertRowsToJson(rows)).encode()); + }); } private JsonArray convertRowsToJson(RowSet rows) { @@ -116,14 +154,14 @@ public class QueryWeatherData { JsonObject jsonObject = new JsonObject(); for (int i = 0; i < row.size(); i++) { String column = row.getColumnName(i); - if(column.compareTo("timestamp") == 0){ - jsonObject.put("timestamp",row.getLocalDateTime("timestamp").format(formatter)); - }else{ + if (column.compareTo("timestamp") == 0) { + jsonObject.put("timestamp", row.getLocalDateTime("timestamp").format(formatter)); + } else { jsonObject.put(column, row.getValue(column)); } } - jsonArray.add(jsonObject); + jsonArray.add(jsonObject); } return jsonArray; } -} \ No newline at end of file +} \ No newline at end of file diff --git a/Front-end/src/pages/Home.jsx b/Front-end/src/pages/Home.jsx index 5e1499f..937bbd2 100644 --- a/Front-end/src/pages/Home.jsx +++ b/Front-end/src/pages/Home.jsx @@ -20,13 +20,17 @@ import { TowerControl, } from "lucide-react"; import { useAuth } from "../AuthContext"; +import axios from "axios"; +import { API_BASE_URL } from "../config"; function EnhancedWeatherHome() { const [searchQuery, setSearchQuery] = useState(""); + const [locations, setLocations] = useState([]); + const [infoMeteo,setInfoMeteo] = useState([]); const [activeFilter, setActiveFilter] = useState("all"); const [currentTime, setCurrentTime] = useState(new Date()); const { user, token } = useAuth(); - + const [ville, setVille] = useState("Paris, France"); const isDayTime = currentTime.getHours() > 6 && currentTime.getHours() < 20; useEffect(() => { @@ -36,7 +40,41 @@ function EnhancedWeatherHome() { return () => clearInterval(timer); }, []); - + useEffect(() => { + axios + .post(`${API_BASE_URL}/getMeteoHome`, { + location:ville, + }) + .then((response) => { + if (response.data.length === 0) { + console.warn("Aucun infos disponible."); + } else { + console.log(response.data[0]); + setInfoMeteo(response.data[0]); + } + }) + .catch((error) => { + console.error("Erreur lors de la récupération des infos :", error); + }); + }, [ville]); + useEffect(() => { + axios + .get(`${API_BASE_URL}/getLocations`) + .then((response) => { + if (response.data.length === 0) { + console.warn("Aucun lieu disponible."); + } else { + console.log(response.data); + setLocations(response.data); + } + }) + .catch((error) => { + console.error("Erreur lors de la récupération des catégories :", error); + }); + }, []); + const filteredLocations = locations.filter((loc) => + loc.toLowerCase().includes(searchQuery.toLowerCase()) + ); const formatDate = (date) => { const options = { weekday: "long", day: "numeric", month: "long" }; return date.toLocaleDateString("fr-FR", options); @@ -45,7 +83,7 @@ function EnhancedWeatherHome() { const hourlyForecast = [ { time: "Maintenant", - temp: "21°", + temp: infoMeteo.temperature+"°", icon: , }, { @@ -166,7 +204,7 @@ function EnhancedWeatherHome() { /> setSearchQuery(e.target.value)} /> - + {searchQuery.length > 0 && ( + + )} @@ -204,7 +261,7 @@ function EnhancedWeatherHome() { isDayTime ? "text-gray-700" : "text-gray-200" }`} > - Paris, France + {ville}

- 21°C + {infoMeteo.temperature}°C

- 23°C + {infoMeteo.temperature-2}°C @@ -292,7 +349,7 @@ function EnhancedWeatherHome() { isDayTime ? "text-gray-900" : "text-white" }`} > - 68% + {infoMeteo.humidity}% @@ -320,7 +377,7 @@ function EnhancedWeatherHome() { isDayTime ? "text-gray-900" : "text-white" }`} > - 12 km/h + {infoMeteo.wind_speed} km/h @@ -721,8 +778,7 @@ function EnhancedWeatherHome() { : "text-indigo-400 hover:text-indigo-300" }`} > - Ajouter un objet{" "} - + Ajouter un objet @@ -757,7 +813,8 @@ function EnhancedWeatherHome() { isDayTime ? "text-gray-600" : "text-gray-300" } mb-4`} > - Vous pourrez gérer les utilisateurs du site mais aussi les objets connectés + Vous pourrez gérer les utilisateurs du site mais aussi les + objets connectés

- Tableau d'Administration + Tableau d'Administration{" "} + @@ -799,7 +857,8 @@ function EnhancedWeatherHome() { isDayTime ? "text-gray-600" : "text-gray-300" } mb-4`} > - Ce module vous permet de gérer les capteurs 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.

- Gestion des objets{" "} - + Gestion des objets