ソースを参照

Added API 'unitIdGET'

Lukas Cerny 1 年間 前
コミット
6e21a4fa80

+ 1 - 0
sql/init.sql

@@ -149,6 +149,7 @@ ALTER TABLE maplog.system_user OWNER TO senslog;
 CREATE TABLE maplog.unit (
     unit_id BIGINT NOT NULL PRIMARY KEY,
     imei CHARACTER VARYING(20) NOT NULL UNIQUE,
+    name CHARACTER VARYING(100) NOT NULL,
     description TEXT,
     is_mobile boolean DEFAULT true NOT NULL,
     unit_type_id CHARACTER VARYING(2) DEFAULT 'X'::CHARACTER VARYING NOT NULL

+ 18 - 26
src/main/java/cz/senslog/telemetry/database/domain/Unit.java

@@ -1,49 +1,41 @@
 package cz.senslog.telemetry.database.domain;
 
-import java.util.Collections;
-import java.util.List;
 
 public class Unit {
 
-    private long unitId;
+    private final long unitId;
+    private final String name;
+    private final String imei;
+    private final String description;
 
-    private String imei;
-
-    private List<Sensor> sensors;
-
-    public static Unit of(long unitId, String imei, List<Sensor> sensors) {
-        Unit u = new Unit();
-        u.setUnitId(unitId);
-        u.setImei(imei);
-        u.setSensors(sensors);
-        return u;
+    public static Unit of(long unitId, String name, String imei, String description) {
+        return new Unit(unitId, name, imei, description);
     }
 
     public static Unit of(long unitId, String imei) {
-        return of(unitId, imei, Collections.emptyList());
+        return of(unitId, null, imei, null);
+    }
+
+    private Unit(long unitId, String name, String imei, String description) {
+        this.unitId = unitId;
+        this.name = name;
+        this.imei = imei;
+        this.description = description;
     }
 
     public long getUnitId() {
         return unitId;
     }
 
-    public void setUnitId(long unitId) {
-        this.unitId = unitId;
+    public String getName() {
+        return name;
     }
 
     public String getImei() {
         return imei;
     }
 
-    public void setImei(String imei) {
-        this.imei = imei;
-    }
-
-    public List<Sensor> getSensors() {
-        return sensors;
-    }
-
-    public void setSensors(List<Sensor> sensors) {
-        this.sensors = sensors;
+    public String getDescription() {
+        return description;
     }
 }

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

@@ -215,6 +215,23 @@ public class MapLogRepository implements SensLogRepository {
                 .map(p -> p.orElseThrow(() -> new DataNotFoundException(String.format("Campaign ID '%d' not found.", campaignId))));
     }
 
+    public static final Function<Row, Unit> ROW_TO_UNIT = (row) -> Unit.of(
+            row.getLong("unit_id"),
+            row.getString("name"),
+            row.getString("imei"),
+            row.getString("description")
+    );
+
+    @Override
+    public Future<Unit> findUnitById(long unitId) {
+        return client.preparedQuery("SELECT unit_id, name, imei, description FROM maplog.unit WHERE unit_id = $1")
+                .execute(Tuple.of(unitId))
+                .map(RowSet::iterator)
+                .map(iterator -> iterator.hasNext() ? ROW_TO_UNIT.apply(iterator.next()) : null)
+                .map(Optional::ofNullable)
+                .map(p -> p.orElseThrow(() -> new DataNotFoundException(String.format("Unit ID '%d' not found.", unitId))));
+    }
+
     @Override
     public Future<List<Long>> findUnitIdsByCampaignId(long campaignId) {
         return client.preparedQuery("SELECT unit_id FROM maplog.unit_to_campaign WHERE camp_id = $1")

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

@@ -42,6 +42,11 @@ public class MockMapLogRepository implements SensLogRepository {
         return Future.succeededFuture(Collections.emptyList());
     }
 
+    @Override
+    public Future<Unit> findUnitById(long unitId) {
+        return Future.succeededFuture(Unit.of(unitId, "mock unit", "imei", "description"));
+    }
+
     public Future<Unit> findUnitByIMEI(String imei) {
         return Future.succeededFuture(Unit.of(1000L, imei));
     }

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

@@ -22,6 +22,8 @@ public interface SensLogRepository {
     Future<List<Unit>> loadAllUnits();
 
 
+    Future<Unit> findUnitById(long unitId);
+
     Future<Unit> findUnitByIMEI(String imei);
     Future<Sensor> findSensorByIOAndUnitId(int ioID, long unitId);
     Future<List<Campaign>> allCampaigns();

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

@@ -62,6 +62,8 @@ public final class HttpVertxServer extends AbstractVerticle {
                     openAPIRouterBuilder.operation("campaignIdUnitIdObservationsGET").handler(apiHandler::campaignIdUnitIdObservationsGET);
                     openAPIRouterBuilder.operation("campaignIdUnitIdLocationsGET").handler(apiHandler::campaignIdUnitIdLocationsGET);
 
+                    openAPIRouterBuilder.operation("unitIdGET").handler(apiHandler::unitIdGET);
+
                     Router mainRouter = openAPIRouterBuilder.createRouter();
 //                    mainRouter.route().handler(LoggerHandler.create());
 //                    mainRouter.route().handler(rc -> logger.info("HTTP Request '{}'.", rc.request().absoluteURI()));

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

@@ -20,7 +20,6 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static java.lang.Boolean.parseBoolean;
-import static java.time.format.DateTimeFormatter.ISO_DATE_TIME;
 import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME;
 import static java.util.stream.Collectors.toList;
 
@@ -437,4 +436,26 @@ public class OpenAPIHandler {
              */
         }
     }
+
+    public void unitIdGET(RoutingContext rc) {
+        String host =  hostURLFull(rc.request());
+
+        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.findUnitById(unitId)
+                .onSuccess(u -> rc.response().end((navigationLinks ? JsonObject.of(
+                                "self@NavigationLink", String.format("%s/units/%d", host, u.getUnitId()),
+                                "Sensors@NavigationLink", String.format("%s/units/%d/sensors", host, u.getUnitId()),
+                                "Campaigns@NavigationLink", String.format("%s/units/%d/campaigns", host, u.getUnitId())
+                        ) : JsonObject.of()).mergeIn(JsonObject.of(
+                                "id", u.getUnitId(),
+                                "name", u.getName(),
+                                "imei", u.getImei(),
+                                "description", u.getDescription()
+                        )).encode())
+                        .onFailure(th -> rc.fail(400, th)));
+    }
 }

+ 6 - 5
src/main/resources/openAPISpec.yaml

@@ -579,13 +579,13 @@ paths:
               schema:
                 $ref: '#/components/schemas/Error'
 
-  /units/{id}:
+  /units/{unitId}:
     get:
       operationId: unitIdGET
       summary: Publish info about the unit
       parameters:
         - in: path
-          name: id
+          name: unitId
           schema:
             type: integer
             format: int64
@@ -1325,11 +1325,9 @@ components:
     UnitDetailInfo:
       type: object
       required:
-        - self@NavigationLink
-        - Sensors@NavigationLink
-        - Campaigns@NavigationLink
         - id
         - name
+        - imei
       properties:
         self@NavigationLink:
           type: string
@@ -1346,6 +1344,8 @@ components:
           format: int64
         name:
           type: string
+        imei:
+          type: string
         description:
           type: string
       example:
@@ -1355,6 +1355,7 @@ components:
         id: 25
         name: "Mobile Unit"
         description: "Mobile Unit 25"
+        imei: "3434535323345"
 
     UnitSensorBasicInfo:
       type: object