|
|
@@ -7,8 +7,6 @@ import cz.senslog.telemetry.database.domain.UnitLocation;
|
|
|
import cz.senslog.telemetry.database.domain.UnitTelemetry;
|
|
|
import cz.senslog.telemetry.database.repository.SensLogRepository;
|
|
|
import cz.senslog.telemetry.database.domain.Filter;
|
|
|
-import cz.senslog.telemetry.database.validation.UnitTelemetryValidation;
|
|
|
-import cz.senslog.telemetry.utils.FluentInvoke;
|
|
|
import cz.senslog.telemetry.utils.TernaryCondition;
|
|
|
import io.vertx.core.http.HttpServerRequest;
|
|
|
import io.vertx.core.json.JsonArray;
|
|
|
@@ -22,10 +20,9 @@ import java.util.*;
|
|
|
import java.util.function.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
-import static cz.senslog.telemetry.database.validation.UnitTelemetryValidation.telemetriesWithinCampaign;
|
|
|
+import static cz.senslog.telemetry.database.validation.UnitTelemetryValidation.*;
|
|
|
import static cz.senslog.telemetry.server.ws.ContentType.GEOJSON;
|
|
|
import static cz.senslog.telemetry.server.ws.ContentType.JSON;
|
|
|
-import static cz.senslog.telemetry.utils.ComparisonOperators.*;
|
|
|
import static cz.senslog.telemetry.utils.FluentInvoke.fluentlyOf;
|
|
|
import static cz.senslog.telemetry.utils.TernaryCondition.ternaryIf;
|
|
|
import static io.vertx.core.http.HttpHeaders.CONTENT_TYPE;
|
|
|
@@ -1523,54 +1520,52 @@ public class OpenAPIHandler {
|
|
|
public void campaignIdUnitsObservationsPOST(RoutingContext rc) {
|
|
|
long campaignId = Long.parseLong(rc.pathParam("campaignId"));
|
|
|
|
|
|
+ final Consumer<List<UnitTelemetry>> validateAndSave = originalTlms -> repo.findCampaignById(campaignId)
|
|
|
+ .onSuccess(campaign -> fluentlyOf(telemetriesWithinCampaign(campaign, originalTlms))
|
|
|
+ .then(tlmsWithinCamp -> repo.findSensorsByCampaignIdGroupByUnitId(campaign.getId())
|
|
|
+ .onSuccess(campUnitsID -> fluentlyOf(telemetriesAccToSensors(campUnitsID, tlmsWithinCamp))
|
|
|
+ .then(tlmsToSave -> repo.saveAllTelemetry(tlmsToSave)
|
|
|
+ .onSuccess(inserted -> rc.response()
|
|
|
+ .end(JsonObject.of(
|
|
|
+ "saved", inserted,
|
|
|
+ "errors", originalTlms.size() - inserted
|
|
|
+ ).encode()))
|
|
|
+ .onFailure(rc::fail)
|
|
|
+ ))
|
|
|
+ .onFailure(rc::fail)
|
|
|
+ ))
|
|
|
+ .onFailure(rc::fail);
|
|
|
+
|
|
|
switch (ContentType.ofType(rc.request().getHeader(CONTENT_TYPE))) {
|
|
|
case JSON -> Optional.of(rc.body().asJsonArray())
|
|
|
.map(jsonArray -> jsonArray.stream().filter(JsonObject.class::isInstance).map(JsonObject.class::cast)
|
|
|
- .map(f -> UnitTelemetry.of(
|
|
|
- f.getLong("unitId"),
|
|
|
- OffsetDateTime.parse(f.getString("timestamp")),
|
|
|
- Location.of(
|
|
|
- f.getJsonObject("location").getFloat("longitude"),
|
|
|
- f.getJsonObject("location").getFloat("latitude"),
|
|
|
- f.getJsonObject("location").getFloat("altitude")
|
|
|
- ),
|
|
|
- f.getInteger("speed"),
|
|
|
- f.getJsonObject("observedValues")
|
|
|
+ .map(tel -> UnitTelemetry.of(
|
|
|
+ tel.getLong("unitId"),
|
|
|
+ OffsetDateTime.parse(tel.getString("timestamp")),
|
|
|
+ Optional.of(tel.getJsonObject("location")).map(location -> Location.of(
|
|
|
+ location.getFloat("longitude"),
|
|
|
+ location.getFloat("latitude"),
|
|
|
+ location.getFloat("altitude")
|
|
|
+ )).get(),
|
|
|
+ tel.getInteger("speed"),
|
|
|
+ tel.getJsonObject("observedValues")
|
|
|
)).sorted(comparing(UnitTelemetry::getTimestamp)).collect(toList()))
|
|
|
- .ifPresent(orgTels -> repo.findCampaignById(campaignId)
|
|
|
- .onSuccess(campaign -> fluentlyOf(telemetriesWithinCampaign(campaign, orgTels))
|
|
|
- .then(flTels -> repo.saveAllTelemetry(flTels)
|
|
|
- .onSuccess(count -> rc.response().end(JsonObject.of(
|
|
|
- "saved", count,
|
|
|
- "errors", orgTels.size() - count
|
|
|
- ).encode()))
|
|
|
- .onFailure(rc::fail))
|
|
|
- )
|
|
|
- .onFailure(rc::fail));
|
|
|
+ .ifPresent(validateAndSave);
|
|
|
|
|
|
case GEOJSON -> Optional.of(rc.body().asJsonObject()).map(j -> j.getJsonArray("features"))
|
|
|
.map(jsonArray -> jsonArray.stream().filter(JsonObject.class::isInstance).map(JsonObject.class::cast)
|
|
|
.map(feature -> UnitTelemetry.of(
|
|
|
feature.getJsonObject("properties").getLong("unitId"),
|
|
|
OffsetDateTime.parse(feature.getJsonObject("properties").getString("timestamp")),
|
|
|
- Location.of(
|
|
|
- feature.getJsonObject("geometry").getJsonArray("coordinates").getFloat(0),
|
|
|
- feature.getJsonObject("geometry").getJsonArray("coordinates").getFloat(1),
|
|
|
- feature.getJsonObject("geometry").getJsonArray("coordinates").getFloat(2)
|
|
|
- ),
|
|
|
+ Optional.of(feature.getJsonObject("location")).map(location -> Location.of(
|
|
|
+ location.getFloat("longitude"),
|
|
|
+ location.getFloat("latitude"),
|
|
|
+ location.getFloat("altitude")
|
|
|
+ )).get(),
|
|
|
feature.getJsonObject("properties").getInteger("speed"),
|
|
|
feature.getJsonObject("observedValues")
|
|
|
)).sorted(comparing(UnitTelemetry::getTimestamp)).collect(toList()))
|
|
|
- .ifPresent(orgTels -> repo.findCampaignById(campaignId)
|
|
|
- .onSuccess(campaign -> fluentlyOf(telemetriesWithinCampaign(campaign, orgTels))
|
|
|
- .then(flTels -> repo.saveAllTelemetry(flTels)
|
|
|
- .onSuccess(count -> rc.response().end(JsonObject.of(
|
|
|
- "saved", count,
|
|
|
- "errors", orgTels.size() - count
|
|
|
- ).encode()))
|
|
|
- .onFailure(rc::fail))
|
|
|
- )
|
|
|
- .onFailure(rc::fail));
|
|
|
+ .ifPresent(validateAndSave);
|
|
|
}
|
|
|
}
|
|
|
}
|