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

Added API 'driverIdUnitIdGET'

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

+ 1 - 1
src/main/java/cz/senslog/telemetry/database/repository/Driver.java → src/main/java/cz/senslog/telemetry/database/domain/Driver.java

@@ -1,4 +1,4 @@
-package cz.senslog.telemetry.database.repository;
+package cz.senslog.telemetry.database.domain;
 
 public class Driver {
 

+ 6 - 0
src/main/java/cz/senslog/telemetry/database/domain/DriverUnit.java

@@ -0,0 +1,6 @@
+package cz.senslog.telemetry.database.domain;
+
+public class DriverUnit {
+
+
+}

+ 12 - 2
src/main/java/cz/senslog/telemetry/database/repository/MapLogRepository.java

@@ -5,7 +5,6 @@ import cz.senslog.telemetry.database.PagingRetrieve;
 import cz.senslog.telemetry.database.SortType;
 import cz.senslog.telemetry.database.domain.*;
 import io.vertx.core.Future;
-import io.vertx.core.json.JsonObject;
 import io.vertx.pgclient.PgPool;
 import io.vertx.sqlclient.Row;
 import io.vertx.sqlclient.RowSet;
@@ -387,7 +386,7 @@ public class MapLogRepository implements SensLogRepository {
     );
 
     @Override
-    public Future<CampaignUnit> findUnitByIdAndCampaignId(long campaignId, long unitId) {
+    public Future<CampaignUnit> findUnitByIdAndCampaignId(long unitId, long campaignId) {
         return client.preparedQuery("SELECT u.unit_id, utc.camp_id, u.name, u.imei, u.unit_type_id, u.description, utc.from_time, utc.to_time " +
                         "FROM maplog.unit AS u " +
                         "JOIN maplog.unit_to_campaign utc on u.unit_id = utc.unit_id " +
@@ -398,6 +397,17 @@ public class MapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<Unit> findUnitByIdAndDriverId(long unitId, int driverId) {
+        return client.preparedQuery("SELECT u.unit_id, u.name, u.imei, u.description " +
+                        "FROM maplog.unit AS u " +
+                        "JOIN maplog.driver_to_action AS dta ON u.unit_id = dta.unit_id " +
+                        "WHERE dta.driver_id = $1 AND dta.unit_id = $2")
+                .execute(Tuple.of(driverId, unitId))
+                .map(RowSet::iterator)
+                .map(iterator -> iterator.hasNext() ? ROW_TO_UNIT.apply(iterator.next()) : null);
+    }
+
+    @Override
     public Future<Map<Long, Sensor>> findSensorsByUnitIdGroupById(long unitId) {
         return findSensorsByUnitId(unitId).map(sensors -> sensors.stream()
                 .collect(Collectors.toMap(Sensor::getSensorId, Function.identity())));

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

@@ -186,11 +186,16 @@ public class MockMapLogRepository implements SensLogRepository {
     }
 
     @Override
-    public Future<CampaignUnit> findUnitByIdAndCampaignId(long campaignId, long unitId) {
+    public Future<CampaignUnit> findUnitByIdAndCampaignId(long unitId, long campaignId) {
         return Future.succeededFuture(CampaignUnit.of(unitId, campaignId, "mock(name)", "mock(description)", OffsetDateTime.now(), OffsetDateTime.now().plusDays(1)));
     }
 
     @Override
+    public Future<Unit> findUnitByIdAndDriverId(long unitId, int driverId) {
+        return Future.succeededFuture(Unit.of(unitId, "mock(name)", "mock(imei)", "mock(description)"));
+    }
+
+    @Override
     public Future<List<UnitLocation>> findUnitsLocationsByCampaignId(long campaignId, int limitPerUnit, OffsetDateTime from, OffsetDateTime to, ZoneId zone, SortType sort) {
         return Future.succeededFuture(Collections.emptyList());
     }

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

@@ -25,7 +25,8 @@ public interface SensLogRepository {
     Future<Unit> findUnitByIMEI(String imei);
     Future<List<Unit>> findUnitsBySensorId(long sensorId);
     Future<List<CampaignUnit>> findUnitsByCampaignId(long campaignId);
-    Future<CampaignUnit> findUnitByIdAndCampaignId(long campaignId, long unitId);
+    Future<CampaignUnit> findUnitByIdAndCampaignId(long unitId, long campaignId);
+    Future<Unit> findUnitByIdAndDriverId(long unitId, int driverId);
     Future<List<Long>> findUnitIdsByCampaignId(long campaignId);
 
     Future<List<Sensor>> allSensors();

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

@@ -81,6 +81,7 @@ public final class HttpVertxServer extends AbstractVerticle {
                     openAPIRouterBuilder.operation("driversGET").handler(apiHandler::driversGET);
                     openAPIRouterBuilder.operation("driverIdGET").handler(apiHandler::driverIdGET);
                     openAPIRouterBuilder.operation("driverIdUnitsGET").handler(apiHandler::driverIdUnitsGET);
+                    openAPIRouterBuilder.operation("driverIdUnitIdGET").handler(apiHandler::driverIdUnitIdGET);
 
                     Router mainRouter = openAPIRouterBuilder.createRouter();
 //                    mainRouter.route().handler(LoggerHandler.create());

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

@@ -657,7 +657,7 @@ public class OpenAPIHandler {
         List<String> paramNavigationLinks = rc.queryParam("navigationLinks");
         boolean navigationLinks = paramNavigationLinks.isEmpty() ? DEFAULT_NAVIGATION_LINKS : parseBoolean(paramNavigationLinks.get(0));
 
-        repo.findUnitByIdAndCampaignId(campaignId, unitId)
+        repo.findUnitByIdAndCampaignId(unitId, campaignId)
                 .onSuccess(u -> rc.response().end((navigationLinks ? JsonObject.of(
                                 "self@NavigationLink", String.format("%s/campaigns/%d/units/%d", host, u.getCampaignId(), u.getUnitId()),
                                 "Unit@NavigationLink", String.format("%s/units/%d", host, u.getUnitId()),
@@ -868,4 +868,27 @@ public class OpenAPIHandler {
                 ).encode()))
                 .onFailure(th -> rc.fail(400, th));
     }
+
+    public void driverIdUnitIdGET(RoutingContext rc) {
+        String host =  hostURLFull(rc.request());
+
+        int driverId = Integer.parseInt(rc.pathParam("driverId"));
+        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.findUnitByIdAndDriverId(unitId, driverId)
+                .onSuccess(u -> rc.response().end((navigationLinks ? JsonObject.of(
+                                "self@NavigationLink", String.format("%s/drivers/%d/units/%d", host, driverId, u.getUnitId()),
+                                "Unit@NavigationLink", String.format("%s/units/%d", host, u.getUnitId()),
+                                "Actions@NavigationLink", String.format("%s/drivers/%d/units/%d/actions", host, driverId, u.getUnitId())
+                        ) : JsonObject.of()).mergeIn(JsonObject.of(
+                                "unitId", u.getUnitId(),
+                                "name", u.getName(),
+                                "imei", u.getImei(),
+                                "description", u.getDescription()
+                        )).encode())
+                        .onFailure(th -> rc.fail(400, th)));
+    }
 }