Переглянути джерело

Added API 'campaignIdUnitIdSensorsGET'

Lukas Cerny 1 рік тому
батько
коміт
1bbaeac336

+ 17 - 0
src/main/java/cz/senslog/telemetry/database/repository/MapLogRepository.java

@@ -227,6 +227,23 @@ public class MapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<List<Sensor>> findSensorsByCampaignIdAndUnitId(long campaignId, long unitId) {
+        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 " +
+                        "JOIN maplog.unit_to_campaign utc ON utc.unit_id = uts.unit_id " +
+                        "WHERE utc.camp_id = $1 AND uts.unit_id = $2")
+                .execute(Tuple.of(campaignId, unitId))
+                .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())
+                );
+    }
+
+    @Override
     public Future<List<Phenomenon>> allPhenomenons() {
         return client.query("SELECT id, name FROM maplog.phenomenon")
                 .execute()

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

@@ -141,6 +141,11 @@ public class MockMapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<List<Sensor>> findSensorsByCampaignIdAndUnitId(long campaignId, long unitId) {
+        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

@@ -33,7 +33,7 @@ public interface SensLogRepository {
     Future<Map<Long, Sensor>> findSensorsByUnitIdGroupById(long unitId);
     Future<List<Sensor>> findSensorsByUnitId(long unitId);
     Future<List<Sensor>> findSensorsByPhenomenonId(long phenomenonId);
-
+    Future<List<Sensor>> findSensorsByCampaignIdAndUnitId(long campaignId, long unitId);
 
     Future<List<Phenomenon>> allPhenomenons();
     Future<Phenomenon> findPhenomenonById(long phenomenonId);

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

@@ -61,6 +61,7 @@ public final class HttpVertxServer extends AbstractVerticle {
                     openAPIRouterBuilder.operation("campaignIdUnitIdObservationsGET").handler(apiHandler::campaignIdUnitIdObservationsGET);
                     openAPIRouterBuilder.operation("campaignIdUnitIdLocationsGET").handler(apiHandler::campaignIdUnitIdLocationsGET);
                     openAPIRouterBuilder.operation("campaignIdUnitIdGET").handler(apiHandler::campaignIdUnitIdGET);
+                    openAPIRouterBuilder.operation("campaignIdUnitIdSensorsGET").handler(apiHandler::campaignIdUnitIdSensorsGET);
 
                     openAPIRouterBuilder.operation("unitsGET").handler(apiHandler::unitsGET);
                     openAPIRouterBuilder.operation("unitIdGET").handler(apiHandler::unitIdGET);

+ 23 - 3
src/main/java/cz/senslog/telemetry/server/OpenAPIHandler.java

@@ -15,7 +15,6 @@ import org.apache.logging.log4j.Logger;
 import java.time.OffsetDateTime;
 import java.time.ZoneId;
 import java.util.List;
-import java.util.Objects;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -255,8 +254,7 @@ public class OpenAPIHandler {
         });
 
         JsonObject navLinks = navigationLinks ? JsonObject.of(
-                "Campaign@NavigationLink", String.format("%s/campaigns/%d",host, campaignId),
-                "Unit@NavigationLink", String.format("%s/campaigns/%d/units/%d", host, campaignId, unitId)
+                "CampaignUnit@NavigationLink", String.format("%s/campaigns/%d/units/%d", host, campaignId, unitId)
         ) : JsonObject.of();
 
         Function<Long, String> createNextNavLink = dataSize -> {
@@ -676,4 +674,26 @@ public class OpenAPIHandler {
                         )).encode())
                         .onFailure(th -> rc.fail(400, th)));
     }
+
+    public void campaignIdUnitIdSensorsGET(RoutingContext rc) {
+        String host =  hostURLFull(rc.request());
+
+        long campaignId = Long.parseLong(rc.pathParam("campaignId"));
+        long unitId = Long.parseLong(rc.pathParam("unitId"));
+
+        List<String> paramNavigationLinks = rc.queryParam("navigationLinks");
+        boolean navigationLinks = paramNavigationLinks.isEmpty() ? DEFAULT_NAVIGATION_LINKS : parseBoolean(paramNavigationLinks.get(0));
+
+        repo.findSensorsByCampaignIdAndUnitId(campaignId, unitId)
+                .onSuccess(sensors -> rc.response().end(new JsonArray(
+                        sensors.stream().map(s -> (navigationLinks ? JsonObject.of(
+                                "CampaignSensor@NavigationLink", String.format("%s/campaigns/%d/units/%d/sensors/%d",host, campaignId, unitId, 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));
+    }
 }

+ 17 - 34
src/main/resources/openAPISpec.yaml

@@ -284,7 +284,7 @@ paths:
                 $ref: '#/components/schemas/Error'
 
   /campaigns/{campaignId}/units/{unitId}:
-    get:
+    get: # done
       operationId: campaignIdUnitIdGET
       summary: Publish info about the unit within its campaign's scope
       parameters:
@@ -509,6 +509,12 @@ paths:
             format: int64
           required: true
           description: Numeric ID of the unit to get
+        - in: query
+          name: navigationLinks
+          schema:
+            type: boolean
+            default: true
+          description: Option to disable @NavigationLinks in a response
       responses:
         200:
           description: JSON containing information of sensors assigned to the unit within its campaign
@@ -1066,45 +1072,26 @@ components:
     CampaignUnitBasicSensor:
       type: object
       required:
-        - Campaign@NavigationLink
-        - Unit@NavigationLink
-        - Observations@NavigationLink
-        - Sensor@NavigationLink
-        - id
+        - sensorId
         - name
+        - type
       properties:
-        Campaign@NavigationLink:
-          type: string
-          format: uri
-        Unit@NavigationLink:
-          description: Navigation link to the unit
-          type: string
-          format: uri
-        Observations@NavigationLink:
-          description: Navigation link to all campaign's data of the sensor assigned to unit
+        CampaignSensor@NavigationLink:
           type: string
           format: uri
-        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
         name:
           type: string
-        description:
+        type:
           type: string
       example:
-        Campaign@NavigationLink: "<domain>/campaigns/1"
-        Observations@NavigationLink: "<domain>/campaigns/1/units/25/sensors/105/observations"
-        Unit@NavigationLink: "<domain>/units/25"
-        Sensor@NavigationLink: "<domain>/sensors/105"
-        id: 105
+        CampaignSensor@NavigationLink: "<domain>/campaigns/1/units/25/sensors/105"
+        sensorId: 105
         name: "Sensor 105"
-        description: "Description of the sensor 105"
-
+        type: "X"
 
     CampaignObservation:
       type: object
@@ -1151,10 +1138,7 @@ components:
         - offset
         - data
       properties:
-        Campaign@NavigationLink:
-          type: string
-          format: uri
-        Unit@NavigationLink:
+        CampaignUnit@NavigationLink:
           type: string
           format: uri
         next@NavigationLink:
@@ -1174,8 +1158,7 @@ components:
           items:
             $ref: '#/components/schemas/UnitDataObservation'
       example:
-        Campaign@NavigationLink: "<domain>/campaigns/1"
-        Unit@NavigationLink: "<domain>/campaigns/1/units/25"
+        CampaignUnit@NavigationLink: "<domain>/campaigns/1/units/25"
         next@NavigationLink: "<domain>/campaigns/1/units/25/observations?offset=500"
         params: []
         size: 500