浏览代码

Added API 'driverIdUnitIdActionIdGET'

Lukas Cerny 1 年之前
父节点
当前提交
1844c030e4

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

@@ -368,6 +368,17 @@ public class MapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<Action> findActionByIdAndDriverIdAndUnitId(int actionId, int driverId, long unitId) {
+        return client.preparedQuery("SELECT a.id, a.name FROM maplog.action AS a " +
+                        "JOIN maplog.driver_to_action AS dta ON a.id = dta.action_id " +
+                        "WHERE a.id = $1 AND dta.driver_id = $2 AND dta.unit_id = $3")
+                .execute(Tuple.of(actionId, driverId, unitId))
+                .map(RowSet::iterator)
+                .map(iterator -> iterator.hasNext() ? ROW_TO_ACTION.apply(iterator.next()) : null)
+                .onFailure(logger::catching);
+    }
+
+    @Override
     public Future<List<Unit>> findUnitsByDriverId(int driverId, OffsetDateTime from, OffsetDateTime to) {
         String whereTimestampClause;
         Tuple tupleParams;

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

@@ -191,6 +191,11 @@ public class MockMapLogRepository implements SensLogRepository {
     }
 
     @Override
+    public Future<Action> findActionByIdAndDriverIdAndUnitId(int actionId, int driverId, long unitId) {
+        return Future.succeededFuture(Action.of(actionId, "mock(name)"));
+    }
+
+    @Override
     public Future<List<Unit>> findUnitsByDriverId(int driverId, OffsetDateTime from, OffsetDateTime to) {
         return Future.succeededFuture(Collections.emptyList());
     }

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

@@ -55,7 +55,7 @@ public interface SensLogRepository {
     Future<List<Action>> findActionsByDriverIdAndUnitId(int driverId, long unitId);
     Future<List<Action>> findActionsByDriverId(int driverId);
     Future<Action> findActionByIdAndDriverId(int actionId, int driverId);
-
+    Future<Action> findActionByIdAndDriverIdAndUnitId(int actionId, int driverId, long unitId);
 
     Future<List<Unit>> findUnitsByDriverId(int driverId, OffsetDateTime from, OffsetDateTime to);
     Future<List<UnitTelemetry>> findObservationsByCampaignId(long campaignId, OffsetDateTime from, OffsetDateTime to, ZoneId zone, int offset, int limit);

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

@@ -87,6 +87,7 @@ public final class HttpVertxServer extends AbstractVerticle {
                     openAPIRouterBuilder.operation("driverIdActionIdGET").handler(apiHandler::driverIdActionIdGET);
                     openAPIRouterBuilder.operation("driverIdActionIdUnitsGET").handler(apiHandler::driverIdActionIdUnitsGET);
                     openAPIRouterBuilder.operation("driverIdActionIdUnitIdGET").handler(apiHandler::driverIdActionIdUnitIdGET);
+                    openAPIRouterBuilder.operation("driverIdUnitIdActionIdGET").handler(apiHandler::driverIdUnitIdActionIdGET);
 
                     Router mainRouter = openAPIRouterBuilder.createRouter();
 //                    mainRouter.route().handler(LoggerHandler.create());

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

@@ -1000,4 +1000,27 @@ public class OpenAPIHandler {
                         )).encode())
                         .onFailure(th -> rc.fail(400, th)));
     }
+
+    public void driverIdUnitIdActionIdGET(RoutingContext rc) {
+        String host =  hostURLFull(rc.request());
+
+        int driverId = Integer.parseInt(rc.pathParam("driverId"));
+        int actionId = Integer.parseInt(rc.pathParam("actionId"));
+        long unitId = Integer.parseInt(rc.pathParam("unitId"));
+
+        List<String> paramNavigationLinks = rc.queryParam("navigationLinks");
+        boolean navigationLinks = paramNavigationLinks.isEmpty() ? DEFAULT_NAVIGATION_LINKS : parseBoolean(paramNavigationLinks.get(0));
+
+        repo.findActionByIdAndDriverIdAndUnitId(actionId, driverId, unitId)
+                .onSuccess(a -> rc.response().end((navigationLinks ? JsonObject.of(
+                                "self@NavigationLink", String.format("%s/drivers/%d/units/%d/actions/%d", host, driverId, unitId, a.getId()),
+                                "Driver@NavigationLink", String.format("%s/drivers/%d", host, driverId),
+                                "DriverUnit@NavigationLink", String.format("%s/drivers/%d/units/%d", host, driverId, unitId),
+                                "Events@NavigationLink", String.format("%s/drivers/%d/units/%d/actions/%d/events", host, driverId, unitId, a.getId())
+                        ) : JsonObject.of()).mergeIn(JsonObject.of(
+                                "id", a.getId(),
+                                "name", a.getName()
+                        )).encode())
+                        .onFailure(th -> rc.fail(400, th)));
+    }
 }

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

@@ -2467,6 +2467,11 @@ components:
           format: uri
           x-graph-properties:
             linkTo: driverIdUnitIdGET
+        Events@NavigationLink:
+          type: string
+          format: uri
+          x-graph-properties:
+            linkTo: driverIdUnitIdActionIdEventsGET
       properties:
         self@NavigationLink:
           $ref: '#/components/schemas/DriverUnitActionDetailInfo/x-NavigationLinks/self@NavigationLink'
@@ -2474,6 +2479,8 @@ components:
           $ref: '#/components/schemas/DriverUnitActionDetailInfo/x-NavigationLinks/Driver@NavigationLink'
         DriverUnit@NavigationLink:
           $ref: '#/components/schemas/DriverUnitActionDetailInfo/x-NavigationLinks/DriverUnit@NavigationLink'
+        Events@NavigationLink:
+          $ref: '#/components/schemas/DriverUnitActionDetailInfo/x-NavigationLinks/Events@NavigationLink'
         id:
           type: integer
           format: int64
@@ -2483,6 +2490,7 @@ components:
         self@NavigationLink: "<domain>/drivers/42/units/25/actions/258"
         Driver@NavigationLink: "<domain>/drivers/42"
         DriverUnit@NavigationLink: "<domain>/drivers/42/units/25"
+        Events@NavigationLink: "<domain>/drivers/42/units/25/actions/258/events"
         id: 258
         name: "Delivering"