Kaynağa Gözat

Added API 'unitIdCampaignsGET'

Lukas Cerny 1 yıl önce
ebeveyn
işleme
cb03c8510e

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

@@ -165,11 +165,29 @@ public class MapLogRepository implements SensLogRepository {
                         "WHERE UTS.unit_id = $1")
                 .execute(Tuple.of(unitId))
                 .map(rs -> StreamSupport.stream(rs.spliterator(), false)
-                        .map(ROW_TO_SENSOR)
-                        .collect(Collectors.toList())
+                        .map(ROW_TO_SENSOR).collect(Collectors.toList())
                 );
     }
 
+    private static final Function<Row, Campaign> ROW_TO_BASIC_CAMPAIGN = (row) -> Campaign.of(
+            row.getLong("campaign_id"),
+            row.getString("description"),
+            row.getOffsetDateTime("from_time"),
+            row.getOffsetDateTime("to_time")
+    );
+
+    @Override
+    public Future<List<Campaign>> findCampaignsByUnitId(long unitId, ZoneId zone) {
+        return client.preparedQuery("SELECT c.campaign_id, c.description, utc.from_time, utc.to_time " +
+                        "FROM maplog.unit_to_campaign AS utc " +
+                        "JOIN maplog.campaign AS c on c.campaign_id = utc.camp_id " +
+                        "WHERE utc.unit_id = $1")
+                .execute(Tuple.of(unitId))
+                .map(rs -> StreamSupport.stream(rs.spliterator(), false)
+                        .map(ROW_TO_BASIC_CAMPAIGN).collect(Collectors.toList()))
+                .onFailure(logger::catching);
+    }
+
     private static final Function<Row, CampaignUnit> ROW_TO_CAMPAIGN_UNIT = (row) -> CampaignUnit.of(
             row.getLong("unit_id"),
             row.getString("description"),

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

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

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

@@ -41,7 +41,10 @@ public interface SensLogRepository {
     Future<PagingRetrieve<List<UnitLocation>>> findLocationsByCampaignIdAndUnitIdWithPaging(long campaignId, long unitId, OffsetDateTime from, OffsetDateTime to, ZoneId zone, int offset, int limit);
 
     Future<Map<Long, Sensor>> findSensorsByUnitIdGroupById(long unitId);
+
     Future<List<Sensor>> findSensorsByUnitId(long unitId);
+    Future<List<Campaign>> findCampaignsByUnitId(long unitId, ZoneId zone);
+
     Future<List<CampaignUnit>> findUnitsByCampaignId(long campaignId);
     Future<List<UnitLocation>> findUnitsLocationsByCampaignId(long campaignId, int limitPerUnit, OffsetDateTime from, OffsetDateTime to, ZoneId zone, SortType sort);
 }

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

@@ -65,6 +65,7 @@ public final class HttpVertxServer extends AbstractVerticle {
                     openAPIRouterBuilder.operation("unitsGET").handler(apiHandler::unitsGET);
                     openAPIRouterBuilder.operation("unitIdGET").handler(apiHandler::unitIdGET);
                     openAPIRouterBuilder.operation("unitIdSensorsGET").handler(apiHandler::unitIdSensorsGET);
+                    openAPIRouterBuilder.operation("unitIdCampaignsGET").handler(apiHandler::unitIdCampaignsGET);
 
                     Router mainRouter = openAPIRouterBuilder.createRouter();
 //                    mainRouter.route().handler(LoggerHandler.create());

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

@@ -497,4 +497,28 @@ public class OpenAPIHandler {
                         ))).collect(toList())).encode()))
                 .onFailure(th -> rc.fail(400, th));
     }
+
+    public void unitIdCampaignsGET(RoutingContext rc) {
+        String host =  hostURLFull(rc.request());
+
+        long unitId = Long.parseLong(rc.pathParam("unitId"));
+
+        List<String> paramZone = rc.queryParam("zone");
+        ZoneId zone = paramZone.isEmpty() ? DEFAULT_ZONE_ID : ZoneId.of(paramZone.get(0));
+
+        List<String> paramNavigationLinks = rc.queryParam("navigationLinks");
+        boolean navigationLinks = paramNavigationLinks.isEmpty() ? DEFAULT_NAVIGATION_LINKS : parseBoolean(paramNavigationLinks.get(0));
+
+        repo.findCampaignsByUnitId(unitId, zone)
+                .onSuccess(data -> rc.response().end(new JsonArray(
+                        data.stream().map(c -> (navigationLinks ? JsonObject.of(
+                                "Campaign@NavigationLink", String.format("%s/campaigns/%d", host, c.getId())
+                        ) : JsonObject.of()).mergeIn(JsonObject.of(
+                                "id", c.getId(),
+                                "description", c.getDescription(),
+                                "fromTime", DATE_TIME_FORMATTER.apply(c.getFromTime(), zone),
+                                "toTime", DATE_TIME_FORMATTER.apply(c.getToTime(), zone)
+                        ))).collect(toList())).encode()))
+                .onFailure(th -> rc.fail(400, th));
+    }
 }

+ 14 - 15
src/main/resources/openAPISpec.yaml

@@ -646,18 +646,30 @@ paths:
               schema:
                 $ref: '#/components/schemas/Error'
 
-  /units/{id}/campaigns:
+  /units/{unitId}/campaigns:
     get:
       operationId: unitIdCampaignsGET
       summary: Publish info about campaigns where the unit was/is assigned
       parameters:
         - in: path
-          name: id
+          name: unitId
           schema:
             type: integer
             format: int64
           required: true
           description: Numeric ID of the unit to get
+        - in: query
+          name: zone
+          schema:
+            type: string
+            default: UTC
+          required: false
+        - 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 campaigns
@@ -1396,9 +1408,6 @@ components:
     UnitCampaignBasicInfo:
       type: object
       required:
-        - Campaign@NavigationLink
-        - Unit@NavigationLink
-        - Observations@NavigationLink
         - id
         - fromTime
         - toTime
@@ -1407,14 +1416,6 @@ components:
           type: string
           format: uri
           description: Navigation link to the campaign info
-        Unit@NavigationLink:
-          type: string
-          format: uri
-          description: Navigation link to the unit info
-        Observations@NavigationLink:
-          type: string
-          format: uri
-          description: Navigation link to the observations
         id:
           type: integer
           format: int64
@@ -1432,8 +1433,6 @@ components:
           description: Time until the unit was active in the campaign
       example:
         Campaign@NavigationLink: "<domain>/campaigns/1"
-        Unit@NavigationLink: "<domain>/units/25"
-        Observations@NavigationLink: "<domain>/campaigns/1/units/25/observations"
         id: 1
         description: "Campaign 1"
         fromTime: "2023-01-25 15:35:32Z"