|
@@ -6,14 +6,19 @@ import cz.senslog.telemetry.database.PagingRetrieve;
|
|
|
import cz.senslog.telemetry.database.SortType;
|
|
import cz.senslog.telemetry.database.SortType;
|
|
|
import cz.senslog.telemetry.database.domain.*;
|
|
import cz.senslog.telemetry.database.domain.*;
|
|
|
import cz.senslog.telemetry.database.repository.SensLogRepository;
|
|
import cz.senslog.telemetry.database.repository.SensLogRepository;
|
|
|
|
|
+import cz.senslog.telemetry.module.EventBusModulePaths;
|
|
|
import cz.senslog.telemetry.utils.CascadeCondition;
|
|
import cz.senslog.telemetry.utils.CascadeCondition;
|
|
|
import io.vertx.core.Future;
|
|
import io.vertx.core.Future;
|
|
|
|
|
+import io.vertx.core.Vertx;
|
|
|
|
|
+import io.vertx.core.eventbus.DeliveryOptions;
|
|
|
import io.vertx.core.http.HttpServerRequest;
|
|
import io.vertx.core.http.HttpServerRequest;
|
|
|
import io.vertx.core.json.Json;
|
|
import io.vertx.core.json.Json;
|
|
|
import io.vertx.core.json.JsonArray;
|
|
import io.vertx.core.json.JsonArray;
|
|
|
import io.vertx.core.json.JsonObject;
|
|
import io.vertx.core.json.JsonObject;
|
|
|
import io.vertx.ext.web.RoutingContext;
|
|
import io.vertx.ext.web.RoutingContext;
|
|
|
import io.vertx.json.schema.common.JsonUtil;
|
|
import io.vertx.json.schema.common.JsonUtil;
|
|
|
|
|
+import org.apache.logging.log4j.LogManager;
|
|
|
|
|
+import org.apache.logging.log4j.Logger;
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.time.OffsetDateTime;
|
|
import java.time.OffsetDateTime;
|
|
@@ -23,6 +28,7 @@ import java.util.function.*;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
import static cz.senslog.telemetry.database.validation.UnitTelemetryValidation.*;
|
|
import static cz.senslog.telemetry.database.validation.UnitTelemetryValidation.*;
|
|
|
|
|
+import static cz.senslog.telemetry.module.EventBusModulePaths.SENSLOG_ALERTS;
|
|
|
import static cz.senslog.telemetry.server.ws.AuthorizationScope.READ_INFRASTRUCTURE;
|
|
import static cz.senslog.telemetry.server.ws.AuthorizationScope.READ_INFRASTRUCTURE;
|
|
|
import static cz.senslog.telemetry.server.ws.AuthorizationScope.READ_PERSONAL;
|
|
import static cz.senslog.telemetry.server.ws.AuthorizationScope.READ_PERSONAL;
|
|
|
import static cz.senslog.telemetry.server.ws.AuthorizationType.BEARER;
|
|
import static cz.senslog.telemetry.server.ws.AuthorizationType.BEARER;
|
|
@@ -40,17 +46,24 @@ import static java.util.stream.Collectors.*;
|
|
|
|
|
|
|
|
public class OpenAPIHandler {
|
|
public class OpenAPIHandler {
|
|
|
|
|
|
|
|
- private static final BiFunction<OffsetDateTime, ZoneId, String> DATE_TIME_FORMATTER = (dateTime, zoneId) ->
|
|
|
|
|
|
|
+ private static final Logger logger = LogManager.getLogger(OpenAPIHandler.class);
|
|
|
|
|
+
|
|
|
|
|
+ private static final BiFunction<OffsetDateTime, ZoneId, String> DATE_TIME_FORMATTER_AT_ZONE = (dateTime, zoneId) ->
|
|
|
dateTime != null ? ofInstant(dateTime.toInstant(), zoneId).format(ISO_OFFSET_DATE_TIME) : null;
|
|
dateTime != null ? ofInstant(dateTime.toInstant(), zoneId).format(ISO_OFFSET_DATE_TIME) : null;
|
|
|
|
|
|
|
|
|
|
+ private static final Function<OffsetDateTime, String> DATE_TIME_FORMATTER = (dateTime) ->
|
|
|
|
|
+ dateTime != null ? dateTime.format(ISO_OFFSET_DATE_TIME) : null;
|
|
|
|
|
+
|
|
|
private final SensLogRepository repo;
|
|
private final SensLogRepository repo;
|
|
|
|
|
+ private final Vertx vertx;
|
|
|
|
|
|
|
|
- private OpenAPIHandler(SensLogRepository repo) {
|
|
|
|
|
|
|
+ private OpenAPIHandler(Vertx vertx, SensLogRepository repo) {
|
|
|
this.repo = repo;
|
|
this.repo = repo;
|
|
|
|
|
+ this.vertx = vertx;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public static OpenAPIHandler create(SensLogRepository repo) {
|
|
|
|
|
- return new OpenAPIHandler(repo);
|
|
|
|
|
|
|
+ public static OpenAPIHandler create(Vertx vertx, SensLogRepository repo) {
|
|
|
|
|
+ return new OpenAPIHandler(vertx, repo);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private static String hostURLFull(HttpServerRequest req) {
|
|
private static String hostURLFull(HttpServerRequest req) {
|
|
@@ -94,8 +107,8 @@ public class OpenAPIHandler {
|
|
|
) : JsonObject.of()).mergeIn(JsonObject.of(
|
|
) : JsonObject.of()).mergeIn(JsonObject.of(
|
|
|
"id", c.getId(),
|
|
"id", c.getId(),
|
|
|
"name", c.getName(),
|
|
"name", c.getName(),
|
|
|
- "fromTime", DATE_TIME_FORMATTER.apply(c.getFromTime(), zone),
|
|
|
|
|
- "toTime", DATE_TIME_FORMATTER.apply(c.getToTime(), zone)
|
|
|
|
|
|
|
+ "fromTime", DATE_TIME_FORMATTER_AT_ZONE.apply(c.getFromTime(), zone),
|
|
|
|
|
+ "toTime", DATE_TIME_FORMATTER_AT_ZONE.apply(c.getToTime(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -122,8 +135,8 @@ public class OpenAPIHandler {
|
|
|
"id", c.getId(),
|
|
"id", c.getId(),
|
|
|
"name", c.getName(),
|
|
"name", c.getName(),
|
|
|
"description", c.getDescription(),
|
|
"description", c.getDescription(),
|
|
|
- "fromTime", DATE_TIME_FORMATTER.apply(c.getFromTime(), zone),
|
|
|
|
|
- "toTime", DATE_TIME_FORMATTER.apply(c.getToTime(), zone)
|
|
|
|
|
|
|
+ "fromTime", DATE_TIME_FORMATTER_AT_ZONE.apply(c.getFromTime(), zone),
|
|
|
|
|
+ "toTime", DATE_TIME_FORMATTER_AT_ZONE.apply(c.getToTime(), zone)
|
|
|
)).encode()))
|
|
)).encode()))
|
|
|
.onFailure(rc::fail));
|
|
.onFailure(rc::fail));
|
|
|
}
|
|
}
|
|
@@ -149,8 +162,8 @@ public class OpenAPIHandler {
|
|
|
"unitId", u.getUnitId(),
|
|
"unitId", u.getUnitId(),
|
|
|
"name", u.getName(),
|
|
"name", u.getName(),
|
|
|
"description", u.getDescription(),
|
|
"description", u.getDescription(),
|
|
|
- "fromTime", DATE_TIME_FORMATTER.apply(u.getFromTime(), zone),
|
|
|
|
|
- "toTime", DATE_TIME_FORMATTER.apply(u.getToTime(), zone)
|
|
|
|
|
|
|
+ "fromTime", DATE_TIME_FORMATTER_AT_ZONE.apply(u.getFromTime(), zone),
|
|
|
|
|
+ "toTime", DATE_TIME_FORMATTER_AT_ZONE.apply(u.getToTime(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail));
|
|
.onFailure(rc::fail));
|
|
|
}
|
|
}
|
|
@@ -202,7 +215,7 @@ public class OpenAPIHandler {
|
|
|
"data", new JsonArray(
|
|
"data", new JsonArray(
|
|
|
paging.data().stream().map(o -> JsonObject.of(
|
|
paging.data().stream().map(o -> JsonObject.of(
|
|
|
"unitId", o.getUnitId(),
|
|
"unitId", o.getUnitId(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(o.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(o.getTimestamp(), zone),
|
|
|
"speed", o.getSpeed(),
|
|
"speed", o.getSpeed(),
|
|
|
"location", JsonObject.of(
|
|
"location", JsonObject.of(
|
|
|
"longitude", o.getLocation().getLongitude(),
|
|
"longitude", o.getLocation().getLongitude(),
|
|
@@ -234,7 +247,7 @@ public class OpenAPIHandler {
|
|
|
),
|
|
),
|
|
|
"properties", JsonObject.of(
|
|
"properties", JsonObject.of(
|
|
|
"unitId", o.getUnitId(),
|
|
"unitId", o.getUnitId(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(o.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(o.getTimestamp(), zone),
|
|
|
"speed", o.getSpeed(),
|
|
"speed", o.getSpeed(),
|
|
|
"observedValues", o.getObservedValues()
|
|
"observedValues", o.getObservedValues()
|
|
|
)
|
|
)
|
|
@@ -291,7 +304,7 @@ public class OpenAPIHandler {
|
|
|
"hasNext", paging.hasNext(),
|
|
"hasNext", paging.hasNext(),
|
|
|
"data", new JsonArray(
|
|
"data", new JsonArray(
|
|
|
paging.data().stream().map(o -> JsonObject.of(
|
|
paging.data().stream().map(o -> JsonObject.of(
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(o.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(o.getTimestamp(), zone),
|
|
|
"speed", o.getSpeed(),
|
|
"speed", o.getSpeed(),
|
|
|
"location", JsonObject.of(
|
|
"location", JsonObject.of(
|
|
|
"longitude", o.getLocation().getLongitude(),
|
|
"longitude", o.getLocation().getLongitude(),
|
|
@@ -320,7 +333,7 @@ public class OpenAPIHandler {
|
|
|
),
|
|
),
|
|
|
"properties", JsonObject.of(
|
|
"properties", JsonObject.of(
|
|
|
"unitId", o.getUnitId(),
|
|
"unitId", o.getUnitId(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(o.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(o.getTimestamp(), zone),
|
|
|
"speed", o.getSpeed(),
|
|
"speed", o.getSpeed(),
|
|
|
"observedValues", o.getObservedValues()
|
|
"observedValues", o.getObservedValues()
|
|
|
)
|
|
)
|
|
@@ -363,7 +376,7 @@ public class OpenAPIHandler {
|
|
|
"size", locations.size(),
|
|
"size", locations.size(),
|
|
|
"data", new JsonArray(locations.stream().map(l -> JsonObject.of(
|
|
"data", new JsonArray(locations.stream().map(l -> JsonObject.of(
|
|
|
"unitId", l.getUnitId(),
|
|
"unitId", l.getUnitId(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(l.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(l.getTimestamp(), zone),
|
|
|
"location", JsonObject.of(
|
|
"location", JsonObject.of(
|
|
|
"longitude", l.getLocation().getLongitude(),
|
|
"longitude", l.getLocation().getLongitude(),
|
|
|
"latitude", l.getLocation().getLatitude(),
|
|
"latitude", l.getLocation().getLatitude(),
|
|
@@ -380,8 +393,8 @@ public class OpenAPIHandler {
|
|
|
"type", "Feature",
|
|
"type", "Feature",
|
|
|
"properties", JsonObject.of(
|
|
"properties", JsonObject.of(
|
|
|
"unitId", entry.getKey(),
|
|
"unitId", entry.getKey(),
|
|
|
- "fromTime", firstOf(entry.getValue()).map(t -> DATE_TIME_FORMATTER.apply(t.getTimestamp(), zone)).orElse(null),
|
|
|
|
|
- "toTime", lastOf(entry.getValue()).map(t -> DATE_TIME_FORMATTER.apply(t.getTimestamp(), zone)).orElse(null)),
|
|
|
|
|
|
|
+ "fromTime", firstOf(entry.getValue()).map(t -> DATE_TIME_FORMATTER_AT_ZONE.apply(t.getTimestamp(), zone)).orElse(null),
|
|
|
|
|
+ "toTime", lastOf(entry.getValue()).map(t -> DATE_TIME_FORMATTER_AT_ZONE.apply(t.getTimestamp(), zone)).orElse(null)),
|
|
|
"geometry", JsonObject.of(
|
|
"geometry", JsonObject.of(
|
|
|
"type", "MultiPoint",
|
|
"type", "MultiPoint",
|
|
|
"coordinates", new JsonArray(entry.getValue().stream().map(l -> JsonArray.of(
|
|
"coordinates", new JsonArray(entry.getValue().stream().map(l -> JsonArray.of(
|
|
@@ -444,7 +457,7 @@ public class OpenAPIHandler {
|
|
|
"hasNext", paging.hasNext(),
|
|
"hasNext", paging.hasNext(),
|
|
|
"data", new JsonArray(
|
|
"data", new JsonArray(
|
|
|
paging.data().stream().map(l -> JsonObject.of(
|
|
paging.data().stream().map(l -> JsonObject.of(
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(l.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(l.getTimestamp(), zone),
|
|
|
"location", JsonObject.of(
|
|
"location", JsonObject.of(
|
|
|
"longitude", l.getLocation().getLongitude(),
|
|
"longitude", l.getLocation().getLongitude(),
|
|
|
"latitude", l.getLocation().getLatitude(),
|
|
"latitude", l.getLocation().getLatitude(),
|
|
@@ -460,8 +473,8 @@ public class OpenAPIHandler {
|
|
|
),
|
|
),
|
|
|
"properties", ofNonEmpty(paging.data()).map(locs -> JsonObject.of(
|
|
"properties", ofNonEmpty(paging.data()).map(locs -> JsonObject.of(
|
|
|
"unitId", firstOf(locs).map(UnitLocation::getUnitId).orElse(null),
|
|
"unitId", firstOf(locs).map(UnitLocation::getUnitId).orElse(null),
|
|
|
- "fromTime", firstOf(locs).map(t -> DATE_TIME_FORMATTER.apply(t.getTimestamp(), zone)).orElse(null),
|
|
|
|
|
- "toTime", lastOf(locs).map(t -> DATE_TIME_FORMATTER.apply(t.getTimestamp(), zone)).orElse(null)
|
|
|
|
|
|
|
+ "fromTime", firstOf(locs).map(t -> DATE_TIME_FORMATTER_AT_ZONE.apply(t.getTimestamp(), zone)).orElse(null),
|
|
|
|
|
+ "toTime", lastOf(locs).map(t -> DATE_TIME_FORMATTER_AT_ZONE.apply(t.getTimestamp(), zone)).orElse(null)
|
|
|
)).orElseGet(JsonObject::new),
|
|
)).orElseGet(JsonObject::new),
|
|
|
"geometry", JsonObject.of(
|
|
"geometry", JsonObject.of(
|
|
|
"type", "MultiPoint",
|
|
"type", "MultiPoint",
|
|
@@ -564,8 +577,8 @@ public class OpenAPIHandler {
|
|
|
) : JsonObject.of()).mergeIn(JsonObject.of(
|
|
) : JsonObject.of()).mergeIn(JsonObject.of(
|
|
|
"id", c.getId(),
|
|
"id", c.getId(),
|
|
|
"name", c.getName(),
|
|
"name", c.getName(),
|
|
|
- "fromTime", DATE_TIME_FORMATTER.apply(c.getFromTime(), zone),
|
|
|
|
|
- "toTime", DATE_TIME_FORMATTER.apply(c.getToTime(), zone)
|
|
|
|
|
|
|
+ "fromTime", DATE_TIME_FORMATTER_AT_ZONE.apply(c.getFromTime(), zone),
|
|
|
|
|
+ "toTime", DATE_TIME_FORMATTER_AT_ZONE.apply(c.getToTime(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail));
|
|
.onFailure(rc::fail));
|
|
|
}
|
|
}
|
|
@@ -731,8 +744,8 @@ public class OpenAPIHandler {
|
|
|
"name", u.getName(),
|
|
"name", u.getName(),
|
|
|
"imei", u.getImei(),
|
|
"imei", u.getImei(),
|
|
|
"description", u.getDescription(),
|
|
"description", u.getDescription(),
|
|
|
- "fromTime", DATE_TIME_FORMATTER.apply(u.getFromTime(), zone),
|
|
|
|
|
- "toTime", DATE_TIME_FORMATTER.apply(u.getToTime(), zone)
|
|
|
|
|
|
|
+ "fromTime", DATE_TIME_FORMATTER_AT_ZONE.apply(u.getFromTime(), zone),
|
|
|
|
|
+ "toTime", DATE_TIME_FORMATTER_AT_ZONE.apply(u.getToTime(), zone)
|
|
|
)).encode()))
|
|
)).encode()))
|
|
|
.onFailure(rc::fail));
|
|
.onFailure(rc::fail));
|
|
|
}
|
|
}
|
|
@@ -1149,8 +1162,8 @@ public class OpenAPIHandler {
|
|
|
) : JsonObject.of()).mergeIn(JsonObject.of(
|
|
) : JsonObject.of()).mergeIn(JsonObject.of(
|
|
|
"id", e.getId(),
|
|
"id", e.getId(),
|
|
|
"status", e.getStatus(),
|
|
"status", e.getStatus(),
|
|
|
- "fromTime", DATE_TIME_FORMATTER.apply(e.getFromTime(), zone),
|
|
|
|
|
- "toTime", DATE_TIME_FORMATTER.apply(e.getToTime(), zone)
|
|
|
|
|
|
|
+ "fromTime", DATE_TIME_FORMATTER_AT_ZONE.apply(e.getFromTime(), zone),
|
|
|
|
|
+ "toTime", DATE_TIME_FORMATTER_AT_ZONE.apply(e.getToTime(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -1182,8 +1195,8 @@ public class OpenAPIHandler {
|
|
|
"actionId", e.getActionId(),
|
|
"actionId", e.getActionId(),
|
|
|
"unitId", e.getUnitId(),
|
|
"unitId", e.getUnitId(),
|
|
|
"status", e.getStatus(),
|
|
"status", e.getStatus(),
|
|
|
- "fromTime", DATE_TIME_FORMATTER.apply(e.getFromTime(), zone),
|
|
|
|
|
- "toTime", DATE_TIME_FORMATTER.apply(e.getToTime(), zone)
|
|
|
|
|
|
|
+ "fromTime", DATE_TIME_FORMATTER_AT_ZONE.apply(e.getFromTime(), zone),
|
|
|
|
|
+ "toTime", DATE_TIME_FORMATTER_AT_ZONE.apply(e.getToTime(), zone)
|
|
|
)).encode()))
|
|
)).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -1235,7 +1248,7 @@ public class OpenAPIHandler {
|
|
|
"hasNext", paging.hasNext(),
|
|
"hasNext", paging.hasNext(),
|
|
|
"data", new JsonArray(
|
|
"data", new JsonArray(
|
|
|
paging.data().stream().map(o -> JsonObject.of(
|
|
paging.data().stream().map(o -> JsonObject.of(
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(o.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(o.getTimestamp(), zone),
|
|
|
"speed", o.getSpeed(),
|
|
"speed", o.getSpeed(),
|
|
|
"location", JsonObject.of(
|
|
"location", JsonObject.of(
|
|
|
"longitude", o.getLocation().getLongitude(),
|
|
"longitude", o.getLocation().getLongitude(),
|
|
@@ -1264,7 +1277,7 @@ public class OpenAPIHandler {
|
|
|
),
|
|
),
|
|
|
"properties", JsonObject.of(
|
|
"properties", JsonObject.of(
|
|
|
"unitId", o.getUnitId(),
|
|
"unitId", o.getUnitId(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(o.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(o.getTimestamp(), zone),
|
|
|
"speed", o.getSpeed(),
|
|
"speed", o.getSpeed(),
|
|
|
"observedValues", o.getObservedValues()
|
|
"observedValues", o.getObservedValues()
|
|
|
)
|
|
)
|
|
@@ -1320,7 +1333,7 @@ public class OpenAPIHandler {
|
|
|
"hasNext", paging.hasNext(),
|
|
"hasNext", paging.hasNext(),
|
|
|
"data", new JsonArray(
|
|
"data", new JsonArray(
|
|
|
paging.data().stream().map(l -> JsonObject.of(
|
|
paging.data().stream().map(l -> JsonObject.of(
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(l.getTimestamp(), zone),
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(l.getTimestamp(), zone),
|
|
|
"location", JsonObject.of(
|
|
"location", JsonObject.of(
|
|
|
"longitude", l.getLocation().getLongitude(),
|
|
"longitude", l.getLocation().getLongitude(),
|
|
|
"latitude", l.getLocation().getLatitude(),
|
|
"latitude", l.getLocation().getLatitude(),
|
|
@@ -1336,8 +1349,8 @@ public class OpenAPIHandler {
|
|
|
),
|
|
),
|
|
|
"properties", ofNonEmpty(paging.data()).map(locs -> JsonObject.of(
|
|
"properties", ofNonEmpty(paging.data()).map(locs -> JsonObject.of(
|
|
|
"unitId", firstOf(locs).map(UnitLocation::getUnitId).orElse(null),
|
|
"unitId", firstOf(locs).map(UnitLocation::getUnitId).orElse(null),
|
|
|
- "fromTime", firstOf(locs).map(t -> DATE_TIME_FORMATTER.apply(t.getTimestamp(), zone)).orElse(null),
|
|
|
|
|
- "toTime", lastOf(locs).map(t -> DATE_TIME_FORMATTER.apply(t.getTimestamp(), zone)).orElse(null)
|
|
|
|
|
|
|
+ "fromTime", firstOf(locs).map(t -> DATE_TIME_FORMATTER_AT_ZONE.apply(t.getTimestamp(), zone)).orElse(null),
|
|
|
|
|
+ "toTime", lastOf(locs).map(t -> DATE_TIME_FORMATTER_AT_ZONE.apply(t.getTimestamp(), zone)).orElse(null)
|
|
|
)).orElseGet(JsonObject::new),
|
|
)).orElseGet(JsonObject::new),
|
|
|
"geometry", JsonObject.of(
|
|
"geometry", JsonObject.of(
|
|
|
"type", "MultiPoint",
|
|
"type", "MultiPoint",
|
|
@@ -1377,7 +1390,7 @@ public class OpenAPIHandler {
|
|
|
public void campaignIdUnitsObservationsPOST(RoutingContext rc) {
|
|
public void campaignIdUnitsObservationsPOST(RoutingContext rc) {
|
|
|
AuthBearerUser user = AuthBearerUser.of(rc.user());
|
|
AuthBearerUser user = AuthBearerUser.of(rc.user());
|
|
|
WSParameters params = WSParameters.wrap(rc.queryParams(), rc.pathParams());
|
|
WSParameters params = WSParameters.wrap(rc.queryParams(), rc.pathParams());
|
|
|
- // TODO
|
|
|
|
|
|
|
+
|
|
|
long campaignId = params.pathParams().campaignId();
|
|
long campaignId = params.pathParams().campaignId();
|
|
|
|
|
|
|
|
final Consumer<List<UnitTelemetry>> validateAndSave = originalTlms -> repo.findCampaignById(campaignId)
|
|
final Consumer<List<UnitTelemetry>> validateAndSave = originalTlms -> repo.findCampaignById(campaignId)
|
|
@@ -1385,11 +1398,18 @@ public class OpenAPIHandler {
|
|
|
.then(tlmsWithinCamp -> repo.findSensorsByCampaignIdGroupByUnitId(campaign.getId())
|
|
.then(tlmsWithinCamp -> repo.findSensorsByCampaignIdGroupByUnitId(campaign.getId())
|
|
|
.onSuccess(campUnitsID -> fluentlyOf(telemetriesAccToSensors(campUnitsID, tlmsWithinCamp))
|
|
.onSuccess(campUnitsID -> fluentlyOf(telemetriesAccToSensors(campUnitsID, tlmsWithinCamp))
|
|
|
.then(tlmsToSave -> repo.saveAllTelemetry(tlmsToSave)
|
|
.then(tlmsToSave -> repo.saveAllTelemetry(tlmsToSave)
|
|
|
- .onSuccess(inserted -> rc.response()
|
|
|
|
|
- .end(JsonObject.of(
|
|
|
|
|
- "saved", inserted,
|
|
|
|
|
- "errors", originalTlms.size() - inserted
|
|
|
|
|
- ).encode()))
|
|
|
|
|
|
|
+ .onSuccess(savedTelemetries -> {
|
|
|
|
|
+ JsonArray sensLogObsArr = new JsonArray(UnitTelemetry.Converter
|
|
|
|
|
+ .toSensLogObservationAsStream(savedTelemetries)
|
|
|
|
|
+ .map(SensLogObservation::toJsonObject).toList()
|
|
|
|
|
+ );
|
|
|
|
|
+ vertx.eventBus().request(EventBusModulePaths.SENSLOG_OBSERVATIONS, sensLogObsArr)
|
|
|
|
|
+ .onSuccess(v -> logger.info(v.body())).onFailure(logger::error);
|
|
|
|
|
+ rc.response().end(JsonObject.of(
|
|
|
|
|
+ "saved", savedTelemetries.size(),
|
|
|
|
|
+ "errors", originalTlms.size() - savedTelemetries.size()
|
|
|
|
|
+ ).encode());
|
|
|
|
|
+ })
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
))
|
|
))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
@@ -1429,26 +1449,6 @@ public class OpenAPIHandler {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public void alertsGET(RoutingContext rc) {
|
|
|
|
|
- String host = hostURLFull(rc.request());
|
|
|
|
|
- AuthBearerUser user = AuthBearerUser.of(rc.user());
|
|
|
|
|
-
|
|
|
|
|
- JsonObject paramsJson = new JsonObject();
|
|
|
|
|
- WSParameters params = WSParameters.wrap(rc.queryParams(), rc.pathParams(), paramsJson);
|
|
|
|
|
-
|
|
|
|
|
- OffsetDateTime from = params.queryParams().from();
|
|
|
|
|
- OffsetDateTime to = params.queryParams().to();
|
|
|
|
|
- ZoneId zone = params.queryParams().zone();
|
|
|
|
|
-
|
|
|
|
|
- int offset = params.queryParams().offset();
|
|
|
|
|
- int limit = params.queryParams().limit();
|
|
|
|
|
-
|
|
|
|
|
- SortType sort = params.queryParams().sort();
|
|
|
|
|
- boolean navigationLinks = params.queryParams().navigationLinks();
|
|
|
|
|
-
|
|
|
|
|
- // TODO
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
public void alertIdGET(RoutingContext rc) {
|
|
public void alertIdGET(RoutingContext rc) {
|
|
|
String host = hostURLFull(rc.request());
|
|
String host = hostURLFull(rc.request());
|
|
|
AuthBearerUser user = AuthBearerUser.of(rc.user());
|
|
AuthBearerUser user = AuthBearerUser.of(rc.user());
|
|
@@ -1471,7 +1471,18 @@ public class OpenAPIHandler {
|
|
|
"unitId", a.getUnitId(),
|
|
"unitId", a.getUnitId(),
|
|
|
"message", a.getMessage(),
|
|
"message", a.getMessage(),
|
|
|
"status", a.getStatus(),
|
|
"status", a.getStatus(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(a.getTimestamp(), zone)
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(a.getTimestamp(), zone),
|
|
|
|
|
+ "observation", a.getObservation() == null ? null : JsonObject.of(
|
|
|
|
|
+ "unitId", a.getObservation().getUnitId(),
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(a.getObservation().getTimestamp(), zone),
|
|
|
|
|
+ "speed", a.getObservation().getSpeed(),
|
|
|
|
|
+ "location", JsonObject.of(
|
|
|
|
|
+ "longitude", a.getObservation().getLocation().getLongitude(),
|
|
|
|
|
+ "latitude", a.getObservation().getLocation().getLatitude(),
|
|
|
|
|
+ "altitude", a.getObservation().getLocation().getAltitude()
|
|
|
|
|
+ ),
|
|
|
|
|
+ "observedValues", a.getObservation().getObservedValues()
|
|
|
|
|
+ )
|
|
|
)).encode()))
|
|
)).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -1499,7 +1510,7 @@ public class OpenAPIHandler {
|
|
|
"id", a.getId(),
|
|
"id", a.getId(),
|
|
|
"message", a.getMessage(),
|
|
"message", a.getMessage(),
|
|
|
"status", a.getStatus(),
|
|
"status", a.getStatus(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(a.getTimestamp(), zone)
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(a.getTimestamp(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -1526,7 +1537,7 @@ public class OpenAPIHandler {
|
|
|
"id", a.getId(),
|
|
"id", a.getId(),
|
|
|
"message", a.getMessage(),
|
|
"message", a.getMessage(),
|
|
|
"status", a.getStatus(),
|
|
"status", a.getStatus(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(a.getTimestamp(), zone)
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(a.getTimestamp(), zone)
|
|
|
)).encode()))
|
|
)).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -1557,7 +1568,7 @@ public class OpenAPIHandler {
|
|
|
"unitId", a.getUnitId(),
|
|
"unitId", a.getUnitId(),
|
|
|
"message", a.getMessage(),
|
|
"message", a.getMessage(),
|
|
|
"status", a.getStatus(),
|
|
"status", a.getStatus(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(a.getTimestamp(), zone)
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(a.getTimestamp(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -1576,24 +1587,43 @@ public class OpenAPIHandler {
|
|
|
AlertStatus.CREATED
|
|
AlertStatus.CREATED
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- Object reqBody = Json.decodeValue(rc.body().buffer());
|
|
|
|
|
|
|
+ final Object reqBody = Json.decodeValue(rc.body().buffer());
|
|
|
|
|
+
|
|
|
|
|
+ final Function<UnitAlert, JsonObject> alertToJson = a -> JsonObject.of(
|
|
|
|
|
+ "id", a.getId(),
|
|
|
|
|
+ "message", a.getMessage(),
|
|
|
|
|
+ "status", a.getStatus(),
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER.apply(a.getTimestamp())
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
if (JsonUtil.isArray(reqBody)) {
|
|
if (JsonUtil.isArray(reqBody)) {
|
|
|
List<UnitAlert> alerts = ((JsonArray)reqBody).stream().map(JsonObject.class::cast).map(jsonToAlert).toList();
|
|
List<UnitAlert> alerts = ((JsonArray)reqBody).stream().map(JsonObject.class::cast).map(jsonToAlert).toList();
|
|
|
- // TODO send notifications
|
|
|
|
|
repo.saveAlerts(alerts)
|
|
repo.saveAlerts(alerts)
|
|
|
- .onSuccess(ids -> rc.response().end(JsonObject.of(
|
|
|
|
|
- "ids", new JsonArray(ids),
|
|
|
|
|
- "message", String.format("Saved: %s/%s", ids.size(), alerts.size())
|
|
|
|
|
- ).encode()))
|
|
|
|
|
|
|
+ .onSuccess(savedAlerts -> {
|
|
|
|
|
+ JsonArray alertsJson = new JsonArray(savedAlerts.stream().map(alertToJson).toList());
|
|
|
|
|
+ vertx.eventBus().request(SENSLOG_ALERTS, alertsJson, new DeliveryOptions()
|
|
|
|
|
+ .addHeader("campaignId", String.valueOf(campaignId))
|
|
|
|
|
+ .addHeader("userId", user != null ? user.getId() : null)
|
|
|
|
|
+ , reply -> {
|
|
|
|
|
+ if (reply.succeeded()) {
|
|
|
|
|
+ logger.info(reply.result().body());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ logger.error(reply.result().body());
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ rc.response().end(alertsJson.encode());
|
|
|
|
|
+ })
|
|
|
.onFailure(rc::fail);
|
|
.onFailure(rc::fail);
|
|
|
|
|
|
|
|
} else if (JsonUtil.isObject(reqBody)) {
|
|
} else if (JsonUtil.isObject(reqBody)) {
|
|
|
UnitAlert alert = jsonToAlert.apply((JsonObject) reqBody);
|
|
UnitAlert alert = jsonToAlert.apply((JsonObject) reqBody);
|
|
|
- // TODO send notifications
|
|
|
|
|
repo.saveAlert(alert)
|
|
repo.saveAlert(alert)
|
|
|
- .onSuccess(id -> rc.response().end(JsonObject.of(
|
|
|
|
|
- "id", 15
|
|
|
|
|
- ).encode()))
|
|
|
|
|
|
|
+ .onSuccess(savedAlert -> {
|
|
|
|
|
+ JsonObject alertJson = alertToJson.apply(savedAlert);
|
|
|
|
|
+ vertx.eventBus().request(SENSLOG_ALERTS, JsonArray.of(alertJson))
|
|
|
|
|
+ .onSuccess(msg -> logger.info(msg.body())).onFailure(logger::error);
|
|
|
|
|
+ rc.response().end(alertJson.encode());
|
|
|
|
|
+ })
|
|
|
.onFailure(rc::fail);
|
|
.onFailure(rc::fail);
|
|
|
|
|
|
|
|
} else {
|
|
} else {
|
|
@@ -1626,7 +1656,7 @@ public class OpenAPIHandler {
|
|
|
"id", a.getId(),
|
|
"id", a.getId(),
|
|
|
"message", a.getMessage(),
|
|
"message", a.getMessage(),
|
|
|
"status", a.getStatus(),
|
|
"status", a.getStatus(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(a.getTimestamp(), zone)
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(a.getTimestamp(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|
|
@@ -1656,7 +1686,7 @@ public class OpenAPIHandler {
|
|
|
"id", a.getId(),
|
|
"id", a.getId(),
|
|
|
"message", a.getMessage(),
|
|
"message", a.getMessage(),
|
|
|
"status", a.getStatus(),
|
|
"status", a.getStatus(),
|
|
|
- "timestamp", DATE_TIME_FORMATTER.apply(a.getTimestamp(), zone)
|
|
|
|
|
|
|
+ "timestamp", DATE_TIME_FORMATTER_AT_ZONE.apply(a.getTimestamp(), zone)
|
|
|
))).collect(toList())).encode()))
|
|
))).collect(toList())).encode()))
|
|
|
.onFailure(rc::fail)
|
|
.onFailure(rc::fail)
|
|
|
);
|
|
);
|