Преглед изворни кода

Added API 'phenomenonIdSensorsGET'

Lukas Cerny пре 1 година
родитељ
комит
b3895336c8

+ 4 - 0
src/main/java/cz/senslog/telemetry/database/domain/Sensor.java

@@ -13,6 +13,10 @@ public class Sensor {
         return new Sensor(sensorId, name, type, ioID, phenomenon, description);
     }
 
+    public static Sensor of(long sensorId, String name, String type) {
+        return of(sensorId, name, type, -1, null, null);
+    }
+
     public static Sensor of(long sensorId, String name, int ioId) {
         return of(sensorId, name, null, ioId, null, null);
     }

+ 27 - 3
src/main/java/cz/senslog/telemetry/database/repository/MapLogRepository.java

@@ -186,19 +186,43 @@ public class MapLogRepository implements SensLogRepository {
         return client.query("SELECT sensor_id, sensor_name, sensor_type, io_id, phenomenon_id, description FROM maplog.sensor")
                 .execute()
                 .map(rs -> StreamSupport.stream(rs.spliterator(), false)
-                        .map(ROW_TO_BASIC_SENSOR).collect(Collectors.toList())
+                        .map((row) -> Sensor.of(
+                                row.getLong("sensor_id"),
+                                row.getString("sensor_name"),
+                                row.getString("sensor_type"),
+                                row.getInteger("io_id"),
+                                Phenomenon.of(row.getLong("phenomenon_id"), null),
+                                row.getString("description")
+                        )).collect(Collectors.toList())
                 );
     }
 
     @Override
     public Future<List<Sensor>> findSensorsByUnitId(long unitId) {
-        return client.preparedQuery("SELECT s.sensor_id, s.sensor_name, s.sensor_type, s.io_id, s.phenomenon_id, s.description " +
+        return client.preparedQuery("SELECT s.sensor_id, s.sensor_name, s.sensor_type " +
                         "FROM maplog.unit_to_sensor AS uts " +
                         "JOIN maplog.sensor s on s.sensor_id = uts.sensor_id " +
                         "WHERE UTS.unit_id = $1")
                 .execute(Tuple.of(unitId))
                 .map(rs -> StreamSupport.stream(rs.spliterator(), false)
-                        .map(ROW_TO_BASIC_SENSOR).collect(Collectors.toList())
+                        .map((row) -> Sensor.of(
+                                row.getLong("sensor_id"),
+                                row.getString("sensor_name"),
+                                row.getString("sensor_type")
+                        )).collect(Collectors.toList())
+                );
+    }
+
+    @Override
+    public Future<List<Sensor>> findSensorsByPhenomenonId(long phenomenonId) {
+        return client.preparedQuery("SELECT sensor_id, sensor_name, sensor_type FROM maplog.sensor WHERE phenomenon_id = $1")
+                .execute(Tuple.of(phenomenonId))
+                .map(rs -> StreamSupport.stream(rs.spliterator(), false)
+                        .map((row) -> Sensor.of(
+                                row.getLong("sensor_id"),
+                                row.getString("sensor_name"),
+                                row.getString("sensor_type")
+                        )).collect(Collectors.toList())
                 );
     }
 

+ 5 - 0
src/main/java/cz/senslog/telemetry/database/repository/MockMapLogRepository.java

@@ -136,6 +136,11 @@ public class MockMapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<List<Sensor>> findSensorsByPhenomenonId(long phenomenonId) {
+        return Future.succeededFuture(Collections.emptyList());
+    }
+
+    @Override
     public Future<List<Campaign>> findCampaignsByUnitId(long unitId, ZoneId zone) {
         return Future.succeededFuture(Collections.emptyList());
     }

+ 1 - 1
src/main/java/cz/senslog/telemetry/database/repository/SensLogRepository.java

@@ -31,12 +31,12 @@ public interface SensLogRepository {
     Future<Sensor> findSensorByIOAndUnitId(int ioID, long unitId);
     Future<Map<Long, Sensor>> findSensorsByUnitIdGroupById(long unitId);
     Future<List<Sensor>> findSensorsByUnitId(long unitId);
+    Future<List<Sensor>> findSensorsByPhenomenonId(long phenomenonId);
 
 
     Future<List<Phenomenon>> allPhenomenons();
     Future<Phenomenon> findPhenomenonById(long phenomenonId);
 
-
     Future<List<Campaign>> allCampaigns();
     Future<Campaign> findCampaignById(long campaignId);
     Future<List<Campaign>> findCampaignsByUnitId(long unitId, ZoneId zone);

+ 1 - 0
src/main/java/cz/senslog/telemetry/server/HttpVertxServer.java

@@ -73,6 +73,7 @@ public final class HttpVertxServer extends AbstractVerticle {
 
                     openAPIRouterBuilder.operation("phenomenonsGET").handler(apiHandler::phenomenonsGET);
                     openAPIRouterBuilder.operation("phenomenonIdGET").handler(apiHandler::phenomenonIdGET);
+                    openAPIRouterBuilder.operation("phenomenonIdSensorsGET").handler(apiHandler::phenomenonIdSensorsGET);
 
                     Router mainRouter = openAPIRouterBuilder.createRouter();
 //                    mainRouter.route().handler(LoggerHandler.create());

+ 22 - 1
src/main/java/cz/senslog/telemetry/server/OpenAPIHandler.java

@@ -474,7 +474,7 @@ public class OpenAPIHandler {
                         sensors.stream().map(s -> (navigationLinks ? JsonObject.of(
                                 "Sensor@NavigationLink", String.format("%s/sensors/%d",host, s.getSensorId())
                         ) : JsonObject.of()).mergeIn(JsonObject.of(
-                                "id", s.getSensorId(),
+                                "sensorId", s.getSensorId(),
                                 "name", s.getName(),
                                 "type", s.getType()
                         ))).collect(toList())
@@ -623,4 +623,25 @@ public class OpenAPIHandler {
                         ))).collect(toList())).encode()))
                 .onFailure(th -> rc.fail(400, th));
     }
+
+    public void phenomenonIdSensorsGET(RoutingContext rc) {
+        String host =  hostURLFull(rc.request());
+
+        long phenomenonId = Long.parseLong(rc.pathParam("phenomenonId"));
+
+        List<String> paramNavigationLinks = rc.queryParam("navigationLinks");
+        boolean navigationLinks = paramNavigationLinks.isEmpty() ? DEFAULT_NAVIGATION_LINKS : parseBoolean(paramNavigationLinks.get(0));
+
+        repo.findSensorsByPhenomenonId(phenomenonId)
+                .onSuccess(sensors -> rc.response().end(new JsonArray(
+                        sensors.stream().map(s -> (navigationLinks ? JsonObject.of(
+                                "Sensor@NavigationLink", String.format("%s/sensors/%d",host, s.getSensorId())
+                        ) : JsonObject.of()).mergeIn(JsonObject.of(
+                                "sensorId", s.getSensorId(),
+                                "name", s.getName(),
+                                "type", s.getType()
+                        ))).collect(toList())
+                ).encode()))
+                .onFailure(th -> rc.fail(400, th));
+    }
 }

+ 22 - 8
src/main/resources/openAPISpec.yaml

@@ -839,10 +839,24 @@ paths:
               schema:
                 $ref: '#/components/schemas/Error'
 
-  /phenomenons/{id}/sensors:
-    get:
+  /phenomenons/{phenomenonId}/sensors:
+    get: # done
       operationId: phenomenonIdSensorsGET
       summary: Publish info about sensors of the phenomenon
+      parameters:
+        - in: path
+          name: phenomenonId
+          schema:
+            type: integer
+            format: int64
+          required: true
+          description: Numeric ID of the phenomenon to get
+        - in: query
+          name: navigationLinks
+          schema:
+            type: boolean
+            default: true
+          description: Option to disable @NavigationLinks in a response
       responses:
         200:
           description: JSON Array of info about sensors
@@ -1428,14 +1442,14 @@ components:
     UnitSensorBasicInfo:
       type: object
       required:
-        - id
+        - sensorId
         - name
       properties:
         Sensor@NavigationLink:
           description: Navigation link to detail info of the sensor
           type: string
           format: uri
-        id:
+        sensorId:
           description: Identifier of the unit
           type: integer
           format: int64
@@ -1445,7 +1459,7 @@ components:
           type: string
       example:
         Sensor@NavigationLink: "<domain>/sensors/105"
-        id: 105
+        sensorId: 105
         name: "Sensor 105"
         type: "temperature"
 
@@ -1623,7 +1637,7 @@ components:
       required:
         - Phenomenon@NavigationLink
         - Sensor@NavigationLink
-        - id
+        - sensorId
         - name
       properties:
         Phenomenon@NavigationLink:
@@ -1632,7 +1646,7 @@ components:
         Sensor@NavigationLink:
           type: string
           format: uri
-        id:
+        sensorId:
           type: integer
           format: int64
         name:
@@ -1642,7 +1656,7 @@ components:
       example:
         Phenomenon@NavigationLink: "<domain>/phenomenons/15"
         Sensor@NavigationLink: "<domain>/sensors/105"
-        id: 105
+        sensorId: 105
         name: "Sensor 105"
         description: "Description of Sensor 105"