From 3ba205e1766b046850eee3bd798a3f75e449598b Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 11 Mar 2025 19:35:38 +0100 Subject: [PATCH] Refactored many things and removed unnecessary things like IDEA files and stuff --- .idea/.gitignore | 8 - .idea/compiler.xml | 13 - .idea/jarRepositories.xml | 20 - .idea/misc.xml | 14 - .idea/modules.xml | 8 - .idea/vcs.xml | 6 - .project | 11 - ContaminUS.iml | 10 - backend/{vertx => }/.classpath | 0 backend/{vertx => }/.project | 0 .../.settings/org.eclipse.jdt.core.prefs | 0 .../.settings/org.eclipse.m2e.core.prefs | 0 backend/{vertx => }/pom.xml | 0 .../contaminus/clase/BroadcastVerticle.java | 0 .../contaminus/clase/ConsumerVerticle1.java | 0 .../contaminus/clase/ConsumerVerticle2.java | 0 .../contaminus/clase/MainVerticleClase.java | 0 .../contaminus/common/ConfigManager.java | 0 .../miarma/contaminus/common/Constants.java | 53 +++ .../net/miarma/contaminus/common/Host.java | 0 .../common/LocalDateTimeSerializer.java | 29 ++ .../net/miarma/contaminus/common/OSType.java | 0 .../miarma/contaminus/common/SystemInfo.java | 0 .../contaminus/database/DatabaseManager.java | 0 .../contaminus/database/QueryBuilder.java | 21 +- .../miarma/contaminus/server/ApiVerticle.java | 359 ++++++++++++++++++ .../contaminus/server/DatabaseVerticle.java | 120 ++++++ .../contaminus/server/HttpServerVerticle.java | 0 .../contaminus/server/MainVerticle.java | 0 .../contaminus/server/MqttVerticle.java | 0 .../src/main/resources/default.properties | 0 .../webroot/assets/chartjs-C6LAl0aW.js | 0 .../webroot/assets/index-B9-ngIAm.js | 0 .../webroot/assets/index-DhzIL-fx.css | 0 .../webroot/assets/leaflet-DYDK0jU3.js | 0 .../webroot/assets/react-vendors-DbHEDQBy.js | 0 .../resources/webroot/config/settings.json | 0 .../main/resources/webroot/images/favicon.ico | Bin .../main/resources/webroot/images/logo.png | Bin .../src/main/resources/webroot/index.html | 0 backend/{vertx => }/target/classes/.gitignore | 0 .../target/classes/default.properties | 0 .../webroot/assets/chartjs-C6LAl0aW.js | 0 .../classes/webroot/assets/index-B9-ngIAm.js | 0 .../classes/webroot/assets/index-DhzIL-fx.css | 0 .../webroot/assets/leaflet-DYDK0jU3.js | 0 .../webroot/assets/react-vendors-DbHEDQBy.js | 0 .../classes/webroot/config/settings.json | 0 .../target/classes/webroot/images/favicon.ico | Bin .../target/classes/webroot/images/logo.png | Bin .../target/classes/webroot/index.html | 0 .../miarma/contaminus/common/Constants.java | 22 -- .../contaminus/database/models/Sensor.java | 83 ---- .../miarma/contaminus/server/ApiVerticle.java | 157 -------- .../contaminus/server/DatabaseVerticle.java | 83 ---- package-lock.json | 6 - 56 files changed, 580 insertions(+), 443 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml delete mode 100644 .project delete mode 100644 ContaminUS.iml rename backend/{vertx => }/.classpath (100%) rename backend/{vertx => }/.project (100%) rename backend/{vertx => }/.settings/org.eclipse.jdt.core.prefs (100%) rename backend/{vertx => }/.settings/org.eclipse.m2e.core.prefs (100%) rename backend/{vertx => }/pom.xml (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/clase/BroadcastVerticle.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle1.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle2.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/clase/MainVerticleClase.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/common/ConfigManager.java (100%) create mode 100644 backend/src/main/java/net/miarma/contaminus/common/Constants.java rename backend/{vertx => }/src/main/java/net/miarma/contaminus/common/Host.java (100%) create mode 100644 backend/src/main/java/net/miarma/contaminus/common/LocalDateTimeSerializer.java rename backend/{vertx => }/src/main/java/net/miarma/contaminus/common/OSType.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/common/SystemInfo.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/database/DatabaseManager.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/database/QueryBuilder.java (87%) create mode 100644 backend/src/main/java/net/miarma/contaminus/server/ApiVerticle.java create mode 100644 backend/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java rename backend/{vertx => }/src/main/java/net/miarma/contaminus/server/HttpServerVerticle.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/server/MainVerticle.java (100%) rename backend/{vertx => }/src/main/java/net/miarma/contaminus/server/MqttVerticle.java (100%) rename backend/{vertx => }/src/main/resources/default.properties (100%) rename backend/{vertx => }/src/main/resources/webroot/assets/chartjs-C6LAl0aW.js (100%) rename backend/{vertx => }/src/main/resources/webroot/assets/index-B9-ngIAm.js (100%) rename backend/{vertx => }/src/main/resources/webroot/assets/index-DhzIL-fx.css (100%) rename backend/{vertx => }/src/main/resources/webroot/assets/leaflet-DYDK0jU3.js (100%) rename backend/{vertx => }/src/main/resources/webroot/assets/react-vendors-DbHEDQBy.js (100%) rename backend/{vertx => }/src/main/resources/webroot/config/settings.json (100%) rename backend/{vertx => }/src/main/resources/webroot/images/favicon.ico (100%) rename backend/{vertx => }/src/main/resources/webroot/images/logo.png (100%) rename backend/{vertx => }/src/main/resources/webroot/index.html (100%) rename backend/{vertx => }/target/classes/.gitignore (100%) rename backend/{vertx => }/target/classes/default.properties (100%) rename backend/{vertx => }/target/classes/webroot/assets/chartjs-C6LAl0aW.js (100%) rename backend/{vertx => }/target/classes/webroot/assets/index-B9-ngIAm.js (100%) rename backend/{vertx => }/target/classes/webroot/assets/index-DhzIL-fx.css (100%) rename backend/{vertx => }/target/classes/webroot/assets/leaflet-DYDK0jU3.js (100%) rename backend/{vertx => }/target/classes/webroot/assets/react-vendors-DbHEDQBy.js (100%) rename backend/{vertx => }/target/classes/webroot/config/settings.json (100%) rename backend/{vertx => }/target/classes/webroot/images/favicon.ico (100%) rename backend/{vertx => }/target/classes/webroot/images/logo.png (100%) rename backend/{vertx => }/target/classes/webroot/index.html (100%) delete mode 100644 backend/vertx/src/main/java/net/miarma/contaminus/common/Constants.java delete mode 100644 backend/vertx/src/main/java/net/miarma/contaminus/database/models/Sensor.java delete mode 100644 backend/vertx/src/main/java/net/miarma/contaminus/server/ApiVerticle.java delete mode 100644 backend/vertx/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java delete mode 100644 package-lock.json diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 170b576..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index 712ab9d..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index dda4560..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index f261d12..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index d532189..0000000 --- a/.project +++ /dev/null @@ -1,11 +0,0 @@ - - - ContaminUS - - - - - - - - diff --git a/ContaminUS.iml b/ContaminUS.iml deleted file mode 100644 index 64f8ad0..0000000 --- a/ContaminUS.iml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/backend/vertx/.classpath b/backend/.classpath similarity index 100% rename from backend/vertx/.classpath rename to backend/.classpath diff --git a/backend/vertx/.project b/backend/.project similarity index 100% rename from backend/vertx/.project rename to backend/.project diff --git a/backend/vertx/.settings/org.eclipse.jdt.core.prefs b/backend/.settings/org.eclipse.jdt.core.prefs similarity index 100% rename from backend/vertx/.settings/org.eclipse.jdt.core.prefs rename to backend/.settings/org.eclipse.jdt.core.prefs diff --git a/backend/vertx/.settings/org.eclipse.m2e.core.prefs b/backend/.settings/org.eclipse.m2e.core.prefs similarity index 100% rename from backend/vertx/.settings/org.eclipse.m2e.core.prefs rename to backend/.settings/org.eclipse.m2e.core.prefs diff --git a/backend/vertx/pom.xml b/backend/pom.xml similarity index 100% rename from backend/vertx/pom.xml rename to backend/pom.xml diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/clase/BroadcastVerticle.java b/backend/src/main/java/net/miarma/contaminus/clase/BroadcastVerticle.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/clase/BroadcastVerticle.java rename to backend/src/main/java/net/miarma/contaminus/clase/BroadcastVerticle.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle1.java b/backend/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle1.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle1.java rename to backend/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle1.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle2.java b/backend/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle2.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle2.java rename to backend/src/main/java/net/miarma/contaminus/clase/ConsumerVerticle2.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/clase/MainVerticleClase.java b/backend/src/main/java/net/miarma/contaminus/clase/MainVerticleClase.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/clase/MainVerticleClase.java rename to backend/src/main/java/net/miarma/contaminus/clase/MainVerticleClase.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/common/ConfigManager.java b/backend/src/main/java/net/miarma/contaminus/common/ConfigManager.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/common/ConfigManager.java rename to backend/src/main/java/net/miarma/contaminus/common/ConfigManager.java diff --git a/backend/src/main/java/net/miarma/contaminus/common/Constants.java b/backend/src/main/java/net/miarma/contaminus/common/Constants.java new file mode 100644 index 0000000..c003e88 --- /dev/null +++ b/backend/src/main/java/net/miarma/contaminus/common/Constants.java @@ -0,0 +1,53 @@ +package net.miarma.contaminus.common; + +import java.io.File; + +import io.vertx.core.impl.logging.Logger; +import io.vertx.core.impl.logging.LoggerFactory; + +public class Constants { + public static final String APP_NAME = "ContaminUS"; + public static final String API_PREFIX = "/api/v1"; + public static final String HOME_DIR = System.getProperty("user.home") + File.separator; + public static final String BASE_DIR = HOME_DIR + + (SystemInfo.getOS() == OSType.WINDOWS ? ".contaminus" : + SystemInfo.getOS() == OSType.LINUX ? ".config" + File.separator + + "contaminus" : null); + public static final String CONFIG_FILE = BASE_DIR + File.separator + "config.properties"; + public static final Logger LOGGER = LoggerFactory.getLogger(APP_NAME); + + public static final String GET_GROUPS = API_PREFIX + "/groups"; + public static final String GET_GROUP_BY_ID = API_PREFIX + "/groups/:groupId"; + public static final String GET_GROUP_DEVICES = API_PREFIX + "/groups/:groupId/devices"; + public static final String POST_GROUPS = API_PREFIX + "/groups"; + public static final String PUT_GROUP_BY_ID = API_PREFIX + "/groups/:groupId"; + + public static final String GET_DEVICES = API_PREFIX + "/devices"; + public static final String GET_DEVICE_BY_ID = API_PREFIX + "/devices/:deviceId"; + public static final String GET_DEVICE_SENSORS = API_PREFIX + "/devices/:deviceId/sensors"; + public static final String POST_DEVICES = API_PREFIX + "/devices"; + public static final String PUT_DEVICE_BY_ID = API_PREFIX + "/devices/:deviceId"; + + public static final String GET_SENSORS = API_PREFIX + "/sensors"; + public static final String GET_SENSOR_BY_ID = API_PREFIX + "/sensors/:sensorId"; + public static final String GET_SENSOR_VALUES = API_PREFIX + "/sensors/:sensorId/values"; + public static final String POST_SENSORS = API_PREFIX + "/sensors"; + public static final String PUT_SENSOR_BY_ID = API_PREFIX + "/sensors/:sensorId"; + + public static final String GET_ACTUATORS = API_PREFIX + "/actuators"; + public static final String GET_ACTUATOR_BY_ID = API_PREFIX + "/actuators/:actuatorId"; + public static final String POST_ACTUATORS = API_PREFIX + "/actuators"; + public static final String PUT_ACTUATOR_BY_ID = API_PREFIX + "/actuators/:actuatorId"; + + public static final String GET_GPS_VALUES = API_PREFIX + "/gps-values"; + public static final String GET_GPS_VALUE_BY_ID = API_PREFIX + "/gps-values/:valueId"; + public static final String POST_GPS_VALUES = API_PREFIX + "/gps-values"; + + public static final String GET_AIR_VALUES = API_PREFIX + "/air-values"; + public static final String GET_AIR_VALUE_BY_ID = API_PREFIX + "/air-values/:valueId"; + public static final String POST_AIR_VALUES = API_PREFIX + "/air-values"; + + private Constants() { + throw new AssertionError("Utility class cannot be instantiated."); + } +} diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/common/Host.java b/backend/src/main/java/net/miarma/contaminus/common/Host.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/common/Host.java rename to backend/src/main/java/net/miarma/contaminus/common/Host.java diff --git a/backend/src/main/java/net/miarma/contaminus/common/LocalDateTimeSerializer.java b/backend/src/main/java/net/miarma/contaminus/common/LocalDateTimeSerializer.java new file mode 100644 index 0000000..a042151 --- /dev/null +++ b/backend/src/main/java/net/miarma/contaminus/common/LocalDateTimeSerializer.java @@ -0,0 +1,29 @@ +package net.miarma.contaminus.common; + +import java.lang.reflect.Type; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +public class LocalDateTimeSerializer implements JsonSerializer, JsonDeserializer { + + private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + + @Override + public JsonElement serialize(LocalDateTime src, Type typeOfSrc, JsonSerializationContext context) { + return new JsonPrimitive(src.format(FORMATTER)); + } + + @Override + public LocalDateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + return LocalDateTime.parse(json.getAsString(), FORMATTER); + } + +} diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/common/OSType.java b/backend/src/main/java/net/miarma/contaminus/common/OSType.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/common/OSType.java rename to backend/src/main/java/net/miarma/contaminus/common/OSType.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/common/SystemInfo.java b/backend/src/main/java/net/miarma/contaminus/common/SystemInfo.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/common/SystemInfo.java rename to backend/src/main/java/net/miarma/contaminus/common/SystemInfo.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/database/DatabaseManager.java b/backend/src/main/java/net/miarma/contaminus/database/DatabaseManager.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/database/DatabaseManager.java rename to backend/src/main/java/net/miarma/contaminus/database/DatabaseManager.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/database/QueryBuilder.java b/backend/src/main/java/net/miarma/contaminus/database/QueryBuilder.java similarity index 87% rename from backend/vertx/src/main/java/net/miarma/contaminus/database/QueryBuilder.java rename to backend/src/main/java/net/miarma/contaminus/database/QueryBuilder.java index dca117a..3a75c85 100644 --- a/backend/vertx/src/main/java/net/miarma/contaminus/database/QueryBuilder.java +++ b/backend/src/main/java/net/miarma/contaminus/database/QueryBuilder.java @@ -42,6 +42,21 @@ public class QueryBuilder { return qb; } + public static QueryBuilder update(String table) { + QueryBuilder qb = new QueryBuilder(); + qb.query.append("UPDATE ").append(table).append(" "); + return qb; + } + + public QueryBuilder set(String column, Object value) { + if(value instanceof String) { + query.append("SET ").append(column).append(" = '").append(value).append("' "); + } else { + query.append("SET ").append(column).append(" = ").append(value).append(" "); + } + return this; + } + public QueryBuilder values(Object... values) { StringJoiner joiner = new StringJoiner(", ", "VALUES (", ")"); for (Object value : values) { @@ -83,7 +98,7 @@ public class QueryBuilder { limit = limitParam.isPresent() ? "LIMIT " + limitParam.get() + " " : ""; return this; } - + public String build() { if (!conditions.isEmpty()) { query.append("WHERE "); @@ -104,4 +119,6 @@ public class QueryBuilder { } return query.toString().trim() + ";"; } -} \ No newline at end of file + + +} diff --git a/backend/src/main/java/net/miarma/contaminus/server/ApiVerticle.java b/backend/src/main/java/net/miarma/contaminus/server/ApiVerticle.java new file mode 100644 index 0000000..b7974b5 --- /dev/null +++ b/backend/src/main/java/net/miarma/contaminus/server/ApiVerticle.java @@ -0,0 +1,359 @@ +package net.miarma.contaminus.server; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import io.vertx.core.AbstractVerticle; +import io.vertx.core.Promise; +import io.vertx.core.eventbus.Message; +import io.vertx.core.http.HttpMethod; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.web.Router; +import io.vertx.ext.web.RoutingContext; +import io.vertx.ext.web.handler.BodyHandler; +import io.vertx.ext.web.handler.CorsHandler; +import net.miarma.contaminus.common.Constants; +import net.miarma.contaminus.common.Host; +import net.miarma.contaminus.database.QueryBuilder; + +public class ApiVerticle extends AbstractVerticle { + + @Override + public void start(Promise startPromise) { + Constants.LOGGER.info("🟢 Iniciando ApiVerticle..."); + Router router = Router.router(vertx); + + Set allowedMethods = new HashSet<>(Arrays.asList(HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT)); // Por ejemplo + Set allowedHeaders = new HashSet<>(Arrays.asList("Content-Type", "Authorization")); + + router.route().handler(CorsHandler.create() + .addOrigin(Host.getOrigin()) + .allowCredentials(true) + .allowedHeaders(allowedHeaders) + .allowedMethods(allowedMethods)); + router.route().handler(BodyHandler.create()); + + // Group Routes + router.route(HttpMethod.GET, Constants.GET_GROUPS).handler(this::getGroupsHandler); + router.route(HttpMethod.GET, Constants.GET_GROUP_BY_ID).handler(this::getGroupByIdHandler); + router.route(HttpMethod.GET, Constants.GET_GROUP_DEVICES).handler(this::getGroupDevicesHandler); + router.route(HttpMethod.POST, Constants.POST_GROUPS).handler(this::postGroupHandler); + router.route(HttpMethod.PUT, Constants.PUT_GROUP_BY_ID).handler(this::putGroupByIdHandler); + + // Device Routes + router.route(HttpMethod.GET, Constants.GET_DEVICES).handler(this::getDevicesHandler); + router.route(HttpMethod.GET, Constants.GET_DEVICE_BY_ID).handler(this::getDeviceByIdHandler); + router.route(HttpMethod.GET, Constants.GET_DEVICE_SENSORS).handler(this::getDeviceSensorsHandler); + router.route(HttpMethod.POST, Constants.POST_DEVICES).handler(this::postDeviceHandler); + router.route(HttpMethod.PUT, Constants.PUT_DEVICE_BY_ID).handler(this::putDeviceByIdHandler); + + // Sensor Routes + router.route(HttpMethod.GET, Constants.GET_SENSORS).handler(this::getSensorsHandler); + router.route(HttpMethod.GET, Constants.GET_SENSOR_BY_ID).handler(this::getSensorByIdHandler); + router.route(HttpMethod.GET, Constants.GET_SENSOR_VALUES).handler(this::getSensorValuesHandler); + router.route(HttpMethod.POST, Constants.POST_SENSORS).handler(this::postSensorHandler); + router.route(HttpMethod.PUT, Constants.PUT_SENSOR_BY_ID).handler(this::putSensorByIdHandler); + + // Actuator Routes + router.route(HttpMethod.GET, Constants.GET_ACTUATORS).handler(this::getActuatorsHandler); + router.route(HttpMethod.GET, Constants.GET_ACTUATOR_BY_ID).handler(this::getActuatorByIdHandler); + router.route(HttpMethod.POST, Constants.POST_ACTUATORS).handler(this::postActuatorHandler); + router.route(HttpMethod.PUT, Constants.PUT_ACTUATOR_BY_ID).handler(this::putActuatorByIdHandler); + + vertx.createHttpServer() + .requestHandler(router) + .listen( + Host.getApiPort(), + Host.getHost(), + result -> { + if (result.succeeded()) { + Constants.LOGGER.info(String.format( + "📡 ApiVerticle desplegado. (http://%s:%d)", Host.getHost(), Host.getApiPort() + )); + startPromise.complete(); + } else { + Constants.LOGGER.error("❌ Error al desplegar ApiVerticle", result.cause()); + startPromise.fail(result.cause()); + } + }); + } + + private void sendQuery(String query, RoutingContext context) { + vertx.eventBus().request("db.query", query, req -> { + if (req.succeeded()) { + Message msg = req.result(); + JsonArray jsonArray = new JsonArray(msg.body().toString()); + context.json(jsonArray); + } else { + context.fail(500, req.cause()); + } + }); + } + + + // Group Handlers + private void getGroupsHandler(RoutingContext context) { + String query = QueryBuilder.select("*").from("groups").build(); + sendQuery(query, context); + } + + private void getGroupByIdHandler(RoutingContext context) { + String groupId = context.request().getParam("groupId"); + String query = QueryBuilder + .select("*") + .from("groups") + .where("groupId = ?", groupId) + .build(); + sendQuery(query, context); + } + + private void getGroupDevicesHandler(RoutingContext context) { + String groupId = context.request().getParam("groupId"); + String query = QueryBuilder + .select("*") + .from("devices") + .where("groupId = ?", groupId) + .build(); + sendQuery(query, context); + } + + private void postGroupHandler(RoutingContext context) { + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + String groupName = body.getString("groupName"); + + String query = QueryBuilder + .insert("groups", "groupName") + .values(groupName) + .build(); + + sendQuery(query, context); + } + + private void putGroupByIdHandler(RoutingContext context) { + String groupId = context.request().getParam("groupId"); + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + String groupName = body.getString("groupName"); + + String query = QueryBuilder + .update("groups") + .set("groupName", groupName) + .where("groupId = ?", groupId) + .build(); + + sendQuery(query, context); + } + + // Device Handlers + private void getDevicesHandler(RoutingContext context) { + String query = QueryBuilder.select("*").from("devices").build(); + sendQuery(query, context); + } + + private void getDeviceByIdHandler(RoutingContext context) { + String deviceId = context.request().getParam("deviceId"); + String query = QueryBuilder + .select("*") + .from("devices") + .where("deviceId = ?", deviceId) + .build(); + sendQuery(query, context); + } + + private void getDeviceSensorsHandler(RoutingContext context) { + String deviceId = context.request().getParam("deviceId"); + String query = QueryBuilder + .select("*") + .from("sensors") + .where("deviceId = ?", deviceId) + .build(); + sendQuery(query, context); + } + + private void postDeviceHandler(RoutingContext context) { + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + Integer groupId = body.getInteger("groupId"); + String deviceName = body.getString("groupName"); + + String query = QueryBuilder + .insert("devices", "groupId", "deviceName") + .values(groupId, deviceName) + .build(); + + sendQuery(query, context); + } + + private void putDeviceByIdHandler(RoutingContext context) { + String deviceId = context.request().getParam("deviceId"); + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + Integer groupId = body.getInteger("groupId"); + String deviceName = body.getString("deviceName"); + + String query = QueryBuilder + .update("devices") + .set("groupId", groupId) + .set("deviceName", deviceName) + .where("deviceId = ?", deviceId) + .build(); + + sendQuery(query, context); + } + + // Sensor Handlers + private void getSensorsHandler(RoutingContext context) { + String query = QueryBuilder.select("*").from("sensors").build(); + sendQuery(query, context); + } + + private void getSensorByIdHandler(RoutingContext context) { + String sensorId = context.request().getParam("sensorId"); + String query = QueryBuilder + .select("*") + .from("sensors") + .where("sensorId = ?", sensorId) + .build(); + sendQuery(query, context); + } + + private void getSensorValuesHandler(RoutingContext context) { + String sensorId = context.request().getParam("sensorId"); + String query = QueryBuilder + .select("*") + .from("v_sensor_values") + .where("sensorId = ?", sensorId) + .build(); + sendQuery(query, context); + } + + private void postSensorHandler(RoutingContext context) { + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + Integer deviceId = body.getInteger("deviceId"); + String sensorType = body.getString("sensorType"); + String unit = body.getString("unit"); + Integer status = body.getInteger("status"); + + String query = QueryBuilder + .insert("sensors", "deviceId", "sensorType", "unit", "status") + .values(deviceId, sensorType, unit, status) + .build(); + + sendQuery(query, context); + } + + private void putSensorByIdHandler(RoutingContext context) { + String sensorId = context.request().getParam("sensorId"); + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + Integer deviceId = body.getInteger("deviceId"); + String sensorType = body.getString("sensorType"); + String unit = body.getString("unit"); + Integer status = body.getInteger("status"); + + String query = QueryBuilder + .update("sensors") + .set("deviceId", deviceId) + .set("sensorType", sensorType) + .set("unit", unit) + .set("status", status) + .where("sensorId = ?", sensorId) + .build(); + + sendQuery(query, context); + } + + // Actuator Handlers + private void getActuatorsHandler(RoutingContext context) { + String query = QueryBuilder.select("*").from("actuators").build(); + sendQuery(query, context); + } + + private void getActuatorByIdHandler(RoutingContext context) { + String actuatorId = context.request().getParam("actuatorId"); + + String query = QueryBuilder + .select("*") + .from("actuators") + .where("actuatorId = ?", actuatorId) + .build(); + + sendQuery(query, context); + } + + private void postActuatorHandler(RoutingContext context) { + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + Integer deviceId = body.getInteger("deviceId"); + Integer status = body.getInteger("status"); + + String query = QueryBuilder + .insert("actuators", "deviceId", "status") + .values(deviceId, status) + .build(); + + sendQuery(query, context); + } + + private void putActuatorByIdHandler(RoutingContext context) { + String actuatorId = context.request().getParam("actuatorId"); + JsonObject body = context.body().asJsonObject(); + + if(body == null) { + context.fail(400, new IllegalArgumentException("Bad request")); + return; + } + + Integer deviceId = body.getInteger("deviceId"); + Integer status = body.getInteger("status"); + + String query = QueryBuilder + .update("actuators") + .set("deviceId", deviceId) + .set("status", status) + .where("actuatorId = ?", actuatorId) + .build(); + + sendQuery(query, context); + } + +} \ No newline at end of file diff --git a/backend/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java b/backend/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java new file mode 100644 index 0000000..b5c6e89 --- /dev/null +++ b/backend/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java @@ -0,0 +1,120 @@ +package net.miarma.contaminus.server; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import io.vertx.core.AbstractVerticle; +import io.vertx.core.Promise; +import io.vertx.core.eventbus.EventBus; +import io.vertx.core.eventbus.Message; +import io.vertx.core.json.JsonObject; +import io.vertx.jdbcclient.JDBCPool; +import io.vertx.sqlclient.Row; +import net.miarma.contaminus.common.Constants; +import net.miarma.contaminus.common.LocalDateTimeSerializer; +import net.miarma.contaminus.database.DatabaseManager; + +public class DatabaseVerticle extends AbstractVerticle { + private JDBCPool pool; + private EventBus eventBus; + private Gson gson = new GsonBuilder() + .registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer()) + .create();; + + + @SuppressWarnings("unused") + @Override + public void start(Promise startPromise) { + Constants.LOGGER.info("🟢 Iniciando DatabaseVerticle..."); + + DatabaseManager dbManager = new DatabaseManager(vertx); + pool = dbManager.getPool(); + eventBus = vertx.eventBus(); + + pool.query("SELECT 1") + .execute() + .onSuccess(_res -> { + Constants.LOGGER.info("✅ Database connection ok"); + Constants.LOGGER.info("📡 DatabaseVerticle desplegado"); + startPromise.complete(); + }) + .onFailure(err -> { + Constants.LOGGER.error("❌ Database connection failed"); + Constants.LOGGER.error("❌ Error al desplegar DatabaseVerticle", err); + startPromise.fail(err); + }); + + eventBus.consumer("db.query", this::handleDatabaseQuery); + } + + private void handleDatabaseQuery(Message msg) { + String query = msg.body(); + Constants.LOGGER.info("📥 Query: " + query); + + if(query == null || query.isEmpty()) { + msg.fail(400, "Empty query"); + return; + } + + if(query.startsWith("SELECT")) { + handleSelectQuery(query, msg); + } else if(query.startsWith("INSERT")) { + handleInsertQuery(query, msg); + } else if(query.startsWith("UPDATE")) { + handleUpdateQuery(query, msg); + } else { + msg.fail(400, "Invalid operation"); + } + } + + private void handleSelectQuery(String query, Message msg) { + pool.query(query).execute() + .onSuccess(res -> { + List> rowsList = new ArrayList<>(); + + for (Row row : res) { + Map rowMap = new HashMap<>(); + for (int i = 0; i < row.size(); i++) { + String columnName = res.columnsNames().get(i); + Object columnValue = row.getValue(i); + rowMap.put(columnName, columnValue); + } + rowsList.add(rowMap); + } + + String jsonResponse = gson.toJson(rowsList); + msg.reply(jsonResponse); + }) + .onFailure(err -> msg.fail(500, err.getMessage())); + } + + @SuppressWarnings("unused") + private void handleInsertQuery(String query, Message msg) { + pool.query(query).execute() + .onSuccess(_res -> { + JsonObject response = new JsonObject(); + response.put("status", "success"); + String jsonResponse = gson.toJson(response); + msg.reply(jsonResponse); + }) + .onFailure(err -> msg.fail(500, err.getMessage())); + } + + @SuppressWarnings("unused") + private void handleUpdateQuery(String query, Message msg) { + pool.query(query).execute() + .onSuccess(_res -> { + JsonObject response = new JsonObject(); + response.put("status", "updated"); + String jsonResponse = gson.toJson(response); + msg.reply(jsonResponse); + }) + .onFailure(err -> msg.fail(500, err.getMessage())); + } +} diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/server/HttpServerVerticle.java b/backend/src/main/java/net/miarma/contaminus/server/HttpServerVerticle.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/server/HttpServerVerticle.java rename to backend/src/main/java/net/miarma/contaminus/server/HttpServerVerticle.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/server/MainVerticle.java b/backend/src/main/java/net/miarma/contaminus/server/MainVerticle.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/server/MainVerticle.java rename to backend/src/main/java/net/miarma/contaminus/server/MainVerticle.java diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/server/MqttVerticle.java b/backend/src/main/java/net/miarma/contaminus/server/MqttVerticle.java similarity index 100% rename from backend/vertx/src/main/java/net/miarma/contaminus/server/MqttVerticle.java rename to backend/src/main/java/net/miarma/contaminus/server/MqttVerticle.java diff --git a/backend/vertx/src/main/resources/default.properties b/backend/src/main/resources/default.properties similarity index 100% rename from backend/vertx/src/main/resources/default.properties rename to backend/src/main/resources/default.properties diff --git a/backend/vertx/src/main/resources/webroot/assets/chartjs-C6LAl0aW.js b/backend/src/main/resources/webroot/assets/chartjs-C6LAl0aW.js similarity index 100% rename from backend/vertx/src/main/resources/webroot/assets/chartjs-C6LAl0aW.js rename to backend/src/main/resources/webroot/assets/chartjs-C6LAl0aW.js diff --git a/backend/vertx/src/main/resources/webroot/assets/index-B9-ngIAm.js b/backend/src/main/resources/webroot/assets/index-B9-ngIAm.js similarity index 100% rename from backend/vertx/src/main/resources/webroot/assets/index-B9-ngIAm.js rename to backend/src/main/resources/webroot/assets/index-B9-ngIAm.js diff --git a/backend/vertx/src/main/resources/webroot/assets/index-DhzIL-fx.css b/backend/src/main/resources/webroot/assets/index-DhzIL-fx.css similarity index 100% rename from backend/vertx/src/main/resources/webroot/assets/index-DhzIL-fx.css rename to backend/src/main/resources/webroot/assets/index-DhzIL-fx.css diff --git a/backend/vertx/src/main/resources/webroot/assets/leaflet-DYDK0jU3.js b/backend/src/main/resources/webroot/assets/leaflet-DYDK0jU3.js similarity index 100% rename from backend/vertx/src/main/resources/webroot/assets/leaflet-DYDK0jU3.js rename to backend/src/main/resources/webroot/assets/leaflet-DYDK0jU3.js diff --git a/backend/vertx/src/main/resources/webroot/assets/react-vendors-DbHEDQBy.js b/backend/src/main/resources/webroot/assets/react-vendors-DbHEDQBy.js similarity index 100% rename from backend/vertx/src/main/resources/webroot/assets/react-vendors-DbHEDQBy.js rename to backend/src/main/resources/webroot/assets/react-vendors-DbHEDQBy.js diff --git a/backend/vertx/src/main/resources/webroot/config/settings.json b/backend/src/main/resources/webroot/config/settings.json similarity index 100% rename from backend/vertx/src/main/resources/webroot/config/settings.json rename to backend/src/main/resources/webroot/config/settings.json diff --git a/backend/vertx/src/main/resources/webroot/images/favicon.ico b/backend/src/main/resources/webroot/images/favicon.ico similarity index 100% rename from backend/vertx/src/main/resources/webroot/images/favicon.ico rename to backend/src/main/resources/webroot/images/favicon.ico diff --git a/backend/vertx/src/main/resources/webroot/images/logo.png b/backend/src/main/resources/webroot/images/logo.png similarity index 100% rename from backend/vertx/src/main/resources/webroot/images/logo.png rename to backend/src/main/resources/webroot/images/logo.png diff --git a/backend/vertx/src/main/resources/webroot/index.html b/backend/src/main/resources/webroot/index.html similarity index 100% rename from backend/vertx/src/main/resources/webroot/index.html rename to backend/src/main/resources/webroot/index.html diff --git a/backend/vertx/target/classes/.gitignore b/backend/target/classes/.gitignore similarity index 100% rename from backend/vertx/target/classes/.gitignore rename to backend/target/classes/.gitignore diff --git a/backend/vertx/target/classes/default.properties b/backend/target/classes/default.properties similarity index 100% rename from backend/vertx/target/classes/default.properties rename to backend/target/classes/default.properties diff --git a/backend/vertx/target/classes/webroot/assets/chartjs-C6LAl0aW.js b/backend/target/classes/webroot/assets/chartjs-C6LAl0aW.js similarity index 100% rename from backend/vertx/target/classes/webroot/assets/chartjs-C6LAl0aW.js rename to backend/target/classes/webroot/assets/chartjs-C6LAl0aW.js diff --git a/backend/vertx/target/classes/webroot/assets/index-B9-ngIAm.js b/backend/target/classes/webroot/assets/index-B9-ngIAm.js similarity index 100% rename from backend/vertx/target/classes/webroot/assets/index-B9-ngIAm.js rename to backend/target/classes/webroot/assets/index-B9-ngIAm.js diff --git a/backend/vertx/target/classes/webroot/assets/index-DhzIL-fx.css b/backend/target/classes/webroot/assets/index-DhzIL-fx.css similarity index 100% rename from backend/vertx/target/classes/webroot/assets/index-DhzIL-fx.css rename to backend/target/classes/webroot/assets/index-DhzIL-fx.css diff --git a/backend/vertx/target/classes/webroot/assets/leaflet-DYDK0jU3.js b/backend/target/classes/webroot/assets/leaflet-DYDK0jU3.js similarity index 100% rename from backend/vertx/target/classes/webroot/assets/leaflet-DYDK0jU3.js rename to backend/target/classes/webroot/assets/leaflet-DYDK0jU3.js diff --git a/backend/vertx/target/classes/webroot/assets/react-vendors-DbHEDQBy.js b/backend/target/classes/webroot/assets/react-vendors-DbHEDQBy.js similarity index 100% rename from backend/vertx/target/classes/webroot/assets/react-vendors-DbHEDQBy.js rename to backend/target/classes/webroot/assets/react-vendors-DbHEDQBy.js diff --git a/backend/vertx/target/classes/webroot/config/settings.json b/backend/target/classes/webroot/config/settings.json similarity index 100% rename from backend/vertx/target/classes/webroot/config/settings.json rename to backend/target/classes/webroot/config/settings.json diff --git a/backend/vertx/target/classes/webroot/images/favicon.ico b/backend/target/classes/webroot/images/favicon.ico similarity index 100% rename from backend/vertx/target/classes/webroot/images/favicon.ico rename to backend/target/classes/webroot/images/favicon.ico diff --git a/backend/vertx/target/classes/webroot/images/logo.png b/backend/target/classes/webroot/images/logo.png similarity index 100% rename from backend/vertx/target/classes/webroot/images/logo.png rename to backend/target/classes/webroot/images/logo.png diff --git a/backend/vertx/target/classes/webroot/index.html b/backend/target/classes/webroot/index.html similarity index 100% rename from backend/vertx/target/classes/webroot/index.html rename to backend/target/classes/webroot/index.html diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/common/Constants.java b/backend/vertx/src/main/java/net/miarma/contaminus/common/Constants.java deleted file mode 100644 index 4ecd3b7..0000000 --- a/backend/vertx/src/main/java/net/miarma/contaminus/common/Constants.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.miarma.contaminus.common; - -import java.io.File; - -import io.vertx.core.impl.logging.Logger; -import io.vertx.core.impl.logging.LoggerFactory; - -public class Constants { - public static final String APP_NAME = "ContaminUS"; - public static final String API_PREFIX = "/api/v1"; - public static final String HOME_DIR = System.getProperty("user.home") + File.separator; - public static final String BASE_DIR = HOME_DIR + - (SystemInfo.getOS() == OSType.WINDOWS ? ".contaminus" : - SystemInfo.getOS() == OSType.LINUX ? ".config" + File.separator + - "contaminus" : null); - public static final String CONFIG_FILE = BASE_DIR + File.separator + "config.properties"; - public static final Logger LOGGER = LoggerFactory.getLogger(APP_NAME); - - private Constants() { - throw new AssertionError("Utility class cannot be instantiated."); - } -} diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/database/models/Sensor.java b/backend/vertx/src/main/java/net/miarma/contaminus/database/models/Sensor.java deleted file mode 100644 index 1568880..0000000 --- a/backend/vertx/src/main/java/net/miarma/contaminus/database/models/Sensor.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.miarma.contaminus.database.models; - -import java.sql.Timestamp; - -public class Sensor { - private int id; - private String sensorType; - private float value; - private float lat; - private float lon; - private Timestamp timestamp; - - public Sensor() {} - - public Sensor(int id, String sensorType, float value, float lat, float lon, Timestamp timestamp) { - this.id = id; - this.sensorType = sensorType; - this.value = value; - this.lat = lat; - this.lon = lon; - this.timestamp = timestamp; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getSensorType() { - return sensorType; - } - - public void setSensorType(String sensorType) { - this.sensorType = sensorType; - } - - public float getValue() { - return value; - } - - public void setValue(float value) { - this.value = value; - } - - public float getLat() { - return lat; - } - - public void setLat(float lat) { - this.lat = lat; - } - - public float getLon() { - return lon; - } - - public void setLon(float lon) { - this.lon = lon; - } - - public Timestamp getTimestamp() { - return timestamp; - } - - public void setTimestamp(Timestamp timestamp) { - this.timestamp = timestamp; - } - - @Override - public String toString() { - return "Sensor{" + - "id=" + id + - ", sensorType='" + sensorType + '\'' + - ", value=" + value + - ", lat=" + lat + - ", lon=" + lon + - ", timestamp=" + timestamp + - '}'; - } -} diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/server/ApiVerticle.java b/backend/vertx/src/main/java/net/miarma/contaminus/server/ApiVerticle.java deleted file mode 100644 index 4da4c25..0000000 --- a/backend/vertx/src/main/java/net/miarma/contaminus/server/ApiVerticle.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.miarma.contaminus.server; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -import io.vertx.core.AbstractVerticle; -import io.vertx.core.Promise; -import io.vertx.core.eventbus.Message; -import io.vertx.core.http.HttpMethod; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.ext.web.Router; -import io.vertx.ext.web.RoutingContext; -import io.vertx.ext.web.handler.BodyHandler; -import io.vertx.ext.web.handler.CorsHandler; -import net.miarma.contaminus.common.Constants; -import net.miarma.contaminus.common.Host; -import net.miarma.contaminus.database.QueryBuilder; - -public class ApiVerticle extends AbstractVerticle { - - @Override - public void start(Promise startPromise) { - Constants.LOGGER.info("🟢 Iniciando ApiVerticle..."); - Router router = Router.router(vertx); - - Set allowedMethods = new HashSet<>(Arrays.asList(HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT)); // Por ejemplo - Set allowedHeaders = new HashSet<>(Arrays.asList("Content-Type", "Authorization")); - - router.route().handler(CorsHandler.create() - .addOrigin(Host.getOrigin()) - .allowCredentials(true) - .allowedHeaders(allowedHeaders) - .allowedMethods(allowedMethods)); - router.route().handler(BodyHandler.create()); - router.get(Constants.API_PREFIX + "/devices").blockingHandler(this::getAllDevices); - router.get(Constants.API_PREFIX + "/devices/:id").blockingHandler(this::getDeviceById); - router.post(Constants.API_PREFIX + "/devices").blockingHandler(this::insertSensor); - router.get(Constants.API_PREFIX + "/status").handler(ctx -> ctx.json(new JsonObject().put("status", "OK"))); - - vertx.createHttpServer() - .requestHandler(router) - .listen( - Host.getApiPort(), - Host.getHost(), - result -> { - if (result.succeeded()) { - Constants.LOGGER.info(String.format( - "📡 ApiVerticle desplegado. (http://%s:%d)", Host.getHost(), Host.getApiPort() - )); - startPromise.complete(); - } else { - Constants.LOGGER.error("❌ Error al desplegar ApiVerticle", result.cause()); - startPromise.fail(result.cause()); - } - }); - } - - private void getAllDevices(RoutingContext context) { - Optional sort = Optional.ofNullable(context.request().getParam("_sort")); - Optional order = Optional.ofNullable(context.request().getParam("_order")); - Optional limit = Optional.ofNullable(context.request().getParam("_limit")) - .map(s -> { - try { - return Integer.parseInt(s); - } catch (NumberFormatException e) { - return null; - } - }); - - String query = QueryBuilder - .select("*") - .from("v_DevicesMeasures") - .orderBy(sort, order) - .limit(limit) - .build(); - - vertx.eventBus().request("db.query", query, req -> { - if (req.succeeded()) { - Message result = req.result(); - JsonArray jsonArray = (JsonArray) result.body(); - context.json(jsonArray); - } else { - context.fail(500, req.cause()); - } - }); - } - - private void getDeviceById(RoutingContext context) { - Optional sort = Optional.ofNullable(context.request().getParam("_sort")); - Optional order = Optional.ofNullable(context.request().getParam("_order")); - Optional limit = Optional.ofNullable(context.request().getParam("_limit")) - .map(s -> { - try { - return Integer.parseInt(s); - } catch (NumberFormatException e) { - return null; - } - }); - - String id = context.request().getParam("id"); - String query = QueryBuilder - .select("*") - .from("v_DevicesMeasures") - .where("deviceId = ?", id) - .orderBy(sort, order) - .limit(limit) - .build(); - - vertx.eventBus().request("db.query", query, req -> { - if (req.succeeded()) { - Message result = req.result(); - JsonArray jsonArray = (JsonArray) result.body(); - context.json(jsonArray); - } else { - context.fail(500, req.cause()); - } - }); - } - - private void insertSensor(RoutingContext context) { - JsonObject body = context.body().asJsonObject(); - - if (body == null) { - context.fail(400, new IllegalArgumentException("Body is missing or invalid")); - return; - } - - Integer deviceId = body.getInteger("deviceId"); - String sensorType = body.getString("sensorType"); - Float lat = body.getFloat("lat"); - Float lon = body.getFloat("lon"); - Float value = body.getFloat("value"); - - if (sensorType == null || lat == null || lon == null || value == null) { - context.fail(400, new IllegalArgumentException("Missing required fields")); - return; - } - - String query = QueryBuilder - .insert("measures", "deviceId", "sensorType", "lat", "lon", "value") - .values(deviceId, sensorType, lat, lon, value) - .build(); - - vertx.eventBus().request("db.query", query, req -> { - if (req.succeeded()) { - context.json(new JsonObject().put("result", "OK")); - } else { - context.fail(500, req.cause()); - } - }); - } - - -} \ No newline at end of file diff --git a/backend/vertx/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java b/backend/vertx/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java deleted file mode 100644 index 22d4a23..0000000 --- a/backend/vertx/src/main/java/net/miarma/contaminus/server/DatabaseVerticle.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.miarma.contaminus.server; - -import io.vertx.core.AbstractVerticle; -import io.vertx.core.Promise; -import io.vertx.core.eventbus.EventBus; -import io.vertx.core.eventbus.Message; -import io.vertx.core.json.JsonArray; -import io.vertx.core.json.JsonObject; -import io.vertx.jdbcclient.JDBCPool; -import io.vertx.sqlclient.Row; -import io.vertx.sqlclient.RowSet; -import net.miarma.contaminus.common.Constants; -import net.miarma.contaminus.database.DatabaseManager; - -public class DatabaseVerticle extends AbstractVerticle { - private JDBCPool pool; - private EventBus eventBus; - - @SuppressWarnings("unused") - @Override - public void start(Promise startPromise) { - Constants.LOGGER.info("🟢 Iniciando DatabaseVerticle..."); - - DatabaseManager dbManager = new DatabaseManager(vertx); - pool = dbManager.getPool(); - eventBus = vertx.eventBus(); - - pool.query("SELECT 1") - .execute() - .onSuccess(_res -> { - Constants.LOGGER.info("✅ Database connection ok"); - Constants.LOGGER.info("📡 DatabaseVerticle desplegado"); - startPromise.complete(); - }) - .onFailure(err -> { - Constants.LOGGER.error("❌ Database connection failed"); - Constants.LOGGER.error("❌ Error al desplegar DatabaseVerticle", err); - startPromise.fail(err); - }); - - eventBus.consumer("db.query", this::handleDatabaseQuery); - } - - @SuppressWarnings("unused") - private void handleDatabaseQuery(Message msg) { - String query = msg.body(); - Constants.LOGGER.info("📥 Query: " + query); - - if(query == null || query.isEmpty()) { - msg.fail(400, "Empty query"); - return; - } - - if(query.startsWith("SELECT")) { - pool.query(query).execute() - .onSuccess(res -> { - RowSet rows = res; - JsonArray jsonArray = new JsonArray(); - for (Row row : rows) { - jsonArray.add(new JsonObject() - .put("deviceId", row.getInteger("deviceId")) - .put("deviceName", row.getString("deviceName")) - .put("measureId", row.getInteger("measureId")) - .put("sensorType", row.getString("sensorType")) - .put("lat", row.getFloat("lat")) - .put("lon", row.getFloat("lon")) - .put("value", row.getFloat("value")) - .put("timestamp", row.getLocalDateTime("timestamp").toString()) - ); - } - msg.reply(jsonArray); - }) - .onFailure(err -> msg.fail(500, err.getMessage())); - } else if(query.startsWith("INSERT")) { - pool.query(msg.body()).execute() - .onSuccess(_res -> msg.reply(new JsonObject().put("status", "success"))) - .onFailure(err -> msg.fail(500, err.getMessage())); - } else { - msg.fail(400, "Invalid operation"); - } - - } -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 61f10bc..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "ContaminUS", - "lockfileVersion": 3, - "requires": true, - "packages": {} -}