diff --git a/pom.xml b/pom.xml
index f2ef6f382..5b8d04758 100644
--- a/pom.xml
+++ b/pom.xml
@@ -53,8 +53,7 @@
4.8.3
27.2
1.5.4
-
- 11.0
+ 20.2
5.1.0
5.2.4
1.6.2
@@ -175,6 +174,12 @@
com.graphql-java
graphql-java
+ ${graphql-java.version}
+
+
+ com.graphql-java
+ graphql-java-extended-scalars
+ ${graphql-java.version}
diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLNames.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLNames.java
index 9c9827f17..b677cf33c 100644
--- a/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLNames.java
+++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLNames.java
@@ -417,6 +417,10 @@ public class GraphQLNames {
public static final String FIND_STOPPLACE = "stopPlace";
+ public static final String STOPPLACES_REGISTER = "StopPlaceRegister";
+ public static final String STOPPLACES_MUTATION = "StopPlaceMutation";
+ public static final String DELETE_GROUP_OF_STOPPLACES="deleteGroupOfStopPlaces";
+
/** Check if authorized to edit entity */
public static final String CHECK_AUTHORIZED = "checkAuthorized";
public static final String FIND_STOPPLACE_BY_BBOX = "stopPlaceBBox";
diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLResource.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLResource.java
index a676fccaa..c21d573fe 100644
--- a/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLResource.java
+++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/GraphQLResource.java
@@ -18,7 +18,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import com.google.common.collect.Sets;
-import graphql.ErrorType;
+import graphql.ErrorClassification;
import graphql.ExceptionWhileDataFetching;
import graphql.ExecutionInput;
import graphql.ExecutionResult;
@@ -57,6 +57,9 @@
import java.util.Map;
import java.util.Set;
+import static graphql.ErrorType.DataFetchingException;
+import static graphql.ErrorType.InvalidSyntax;
+import static graphql.ErrorType.ValidationError;
import static java.util.stream.Collectors.toList;
@Component
@@ -94,7 +97,6 @@ public void init() {
.instrumentation(new MaxQueryDepthInstrumentation(MAX_DEPTH))
.build();
-
}
private GraphQL graphQL;
@@ -149,7 +151,11 @@ private Response getGraphQLResponse(String query, Map variables,
Response.ResponseBuilder res = Response.status(Response.Status.OK);
HashMap content = new HashMap<>();
try {
- final ExecutionInput executionInput = ExecutionInput.newExecutionInput().query(query).variables(variables).build();
+ final ExecutionInput executionInput = ExecutionInput.newExecutionInput()
+ .query(query)
+ .root(null)
+ .variables(variables)
+ .build();
ExecutionResult executionResult = graphQL.execute(executionInput);
if (!executionResult.getErrors().isEmpty()) {
@@ -157,25 +163,22 @@ private Response getGraphQLResponse(String query, Map variables,
Response.Status status = Response.Status.INTERNAL_SERVER_ERROR;
for (GraphQLError error : errors) {
- switch (error.getErrorType()) {
- case InvalidSyntax:
- case ValidationError:
- status = Response.Status.BAD_REQUEST;
- break;
- case DataFetchingException:
- ExceptionWhileDataFetching exceptionWhileDataFetching = ((ExceptionWhileDataFetching) error);
- if (exceptionWhileDataFetching.getException() != null) {
- status = getStatusCodeFromThrowable(exceptionWhileDataFetching.getException());
- break;
- }
- status = Response.Status.OK;
- break;
+ final ErrorClassification errorClassification = error.getErrorType();
+ if (InvalidSyntax.equals(errorClassification) || ValidationError.equals(errorClassification)) {
+ status = Response.Status.BAD_REQUEST;
+ } else if (DataFetchingException.equals(errorClassification)) {
+ ExceptionWhileDataFetching exceptionWhileDataFetching = ((ExceptionWhileDataFetching) error);
+ if (exceptionWhileDataFetching.getException() != null) {
+ status = getStatusCodeFromThrowable(exceptionWhileDataFetching.getException());
+ continue;
+ }
+ status = Response.Status.OK;
}
}
res = Response.status(status);
- if (errors.stream().anyMatch(error -> error.getErrorType().equals(ErrorType.DataFetchingException))) {
+ if (errors.stream().anyMatch(error -> error.getErrorType().equals(DataFetchingException))) {
logger.warn("Detected DataFetchingException from errors: {} Setting transaction to rollback only", errors);
transactionStatus.setRollbackOnly();
}
diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/StopPlaceRegisterGraphQLSchema.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/StopPlaceRegisterGraphQLSchema.java
index 91562b70c..79294db30 100644
--- a/src/main/java/org/rutebanken/tiamat/rest/graphql/StopPlaceRegisterGraphQLSchema.java
+++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/StopPlaceRegisterGraphQLSchema.java
@@ -16,7 +16,9 @@
package org.rutebanken.tiamat.rest.graphql;
import graphql.schema.DataFetcher;
+import graphql.schema.FieldCoordinates;
import graphql.schema.GraphQLArgument;
+import graphql.schema.GraphQLCodeRegistry;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLInputObjectField;
import graphql.schema.GraphQLInputObjectType;
@@ -25,16 +27,29 @@
import graphql.schema.GraphQLNonNull;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;
+import org.locationtech.jts.geom.Point;
+import org.rutebanken.tiamat.model.DataManagedObjectStructure;
+import org.rutebanken.tiamat.model.EmbeddableMultilingualString;
import org.rutebanken.tiamat.model.FareZone;
import org.rutebanken.tiamat.model.GroupOfStopPlaces;
import org.rutebanken.tiamat.model.GroupOfTariffZones;
+import org.rutebanken.tiamat.model.Link;
import org.rutebanken.tiamat.model.PurposeOfGrouping;
import org.rutebanken.tiamat.model.Quay;
import org.rutebanken.tiamat.model.StopPlace;
import org.rutebanken.tiamat.model.TariffZone;
+import org.rutebanken.tiamat.model.ValidBetween;
+import org.rutebanken.tiamat.model.Zone_VersionStructure;
+import org.rutebanken.tiamat.model.identification.IdentifiedEntity;
import org.rutebanken.tiamat.rest.graphql.fetchers.AuthorizationCheckDataFetcher;
import org.rutebanken.tiamat.rest.graphql.fetchers.FareZoneAuthoritiesFetcher;
+import org.rutebanken.tiamat.rest.graphql.fetchers.KeyValuesDataFetcher;
+import org.rutebanken.tiamat.rest.graphql.fetchers.PolygonFetcher;
+import org.rutebanken.tiamat.rest.graphql.fetchers.StopPlaceFareZoneFetcher;
+import org.rutebanken.tiamat.rest.graphql.fetchers.StopPlaceTariffZoneFetcher;
import org.rutebanken.tiamat.rest.graphql.fetchers.TagFetcher;
+import org.rutebanken.tiamat.rest.graphql.mappers.GeometryMapper;
+import org.rutebanken.tiamat.rest.graphql.mappers.ValidBetweenMapper;
import org.rutebanken.tiamat.rest.graphql.operations.MultiModalityOperationsBuilder;
import org.rutebanken.tiamat.rest.graphql.operations.ParkingOperationsBuilder;
import org.rutebanken.tiamat.rest.graphql.operations.StopPlaceOperationsBuilder;
@@ -58,6 +73,8 @@
import org.rutebanken.tiamat.rest.graphql.types.TopographicPlaceObjectTypeCreator;
import org.rutebanken.tiamat.rest.graphql.types.ZoneCommonFieldListCreator;
import org.rutebanken.tiamat.service.TariffZoneTerminator;
+import org.rutebanken.tiamat.service.parking.ParkingDeleter;
+import org.rutebanken.tiamat.service.stopplace.MultiModalStopPlaceEditor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Component;
@@ -65,17 +82,20 @@
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
-import static graphql.Scalars.GraphQLBigDecimal;
import static graphql.Scalars.GraphQLBoolean;
import static graphql.Scalars.GraphQLInt;
import static graphql.Scalars.GraphQLString;
+import static graphql.scalars.ExtendedScalars.GraphQLBigDecimal;
import static graphql.schema.GraphQLArgument.newArgument;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;
import static graphql.schema.GraphQLInputObjectField.newInputObjectField;
import static graphql.schema.GraphQLInputObjectType.newInputObject;
import static graphql.schema.GraphQLObjectType.newObject;
import static org.rutebanken.tiamat.rest.graphql.GraphQLNames.*;
+import static org.rutebanken.tiamat.rest.graphql.mappers.EmbeddableMultilingualStringMapper.getEmbeddableString;
+import static org.rutebanken.tiamat.rest.graphql.operations.MultiModalityOperationsBuilder.ADD_TO_MULTI_MODAL_STOP_PLACE_INPUT;
import static org.rutebanken.tiamat.rest.graphql.types.AuthorizationCheckCreator.createAuthorizationCheckArguments;
import static org.rutebanken.tiamat.rest.graphql.types.AuthorizationCheckCreator.createAuthorizationCheckOutputType;
import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.accessibilityAssessmentInputObjectType;
@@ -201,6 +221,12 @@ public class StopPlaceRegisterGraphQLSchema {
@Autowired
private DataFetcher> tariffZonesFetcher;
+ @Autowired
+ private StopPlaceTariffZoneFetcher stopPlaceTariffZoneFetcher;
+
+ @Autowired
+ private StopPlaceFareZoneFetcher stopPlaceFareZoneFetcher;
+
@Autowired
private DataFetcher> fareZonesFetcher;
@@ -234,6 +260,27 @@ public class StopPlaceRegisterGraphQLSchema {
@Autowired
FareZoneAuthoritiesFetcher fareZoneAuthoritiesFetcher;
+ @Autowired
+ private DataFetcher> stopPlaceGroupsFetcher;
+
+ @Autowired
+ private KeyValuesDataFetcher keyValuesDataFetcher;
+
+ @Autowired
+ private PolygonFetcher polygonFetcher;
+
+ @Autowired
+ private ValidBetweenMapper validBetweenMapper;
+
+ @Autowired
+ private GeometryMapper geometryMapper;
+
+ @Autowired
+ private MultiModalStopPlaceEditor parentStopPlaceEditor;
+
+ @Autowired
+ private ParkingDeleter parkingDeleter;
+
@PostConstruct
public void init() {
@@ -245,14 +292,6 @@ public void init() {
commonFieldsList.add(newFieldDefinition()
.name(PLACE_EQUIPMENTS)
.type(equipmentType)
- .dataFetcher(env -> {
- if (env.getSource() instanceof StopPlace stopPlace) {
- return stopPlace.getPlaceEquipments();
- } else if (env.getSource() instanceof Quay quay) {
- return quay.getPlaceEquipments();
- }
- return null;
- })
.build());
commonFieldsList.add(newFieldDefinition()
.name(ACCESSIBILITY_ASSESSMENT)
@@ -326,39 +365,39 @@ public void init() {
.build();
GraphQLObjectType stopPlaceRegisterQuery = newObject()
- .name("StopPlaceRegister")
+ .name(STOPPLACES_REGISTER)
.description("Query and search for data")
.field(newFieldDefinition()
.type(new GraphQLList(stopPlaceInterface))
.name(FIND_STOPPLACE)
.description("Search for StopPlaces")
.argument(createFindStopPlaceArguments(allVersionsArgument))
- .dataFetcher(stopPlaceFetcher))
+ )
//Search by BoundingBox
.field(newFieldDefinition()
.type(new GraphQLList(stopPlaceInterface))
.name(FIND_STOPPLACE_BY_BBOX)
.description("Find StopPlaces within given BoundingBox.")
.argument(createBboxArguments())
- .dataFetcher(stopPlaceFetcher))
+ )
.field(newFieldDefinition()
.name(FIND_TOPOGRAPHIC_PLACE)
.type(new GraphQLList(topographicPlaceObjectType))
.description("Find topographic places")
.argument(createFindTopographicPlaceArguments(allVersionsArgument))
- .dataFetcher(topographicPlaceFetcher))
+ )
.field(newFieldDefinition()
.name(FIND_PATH_LINK)
.type(new GraphQLList(pathLinkObjectType))
.description("Find path links")
.argument(createFindPathLinkArguments(allVersionsArgument))
- .dataFetcher(pathLinkFetcher))
+ )
.field(newFieldDefinition()
.name(FIND_PARKING)
.type(new GraphQLList(parkingObjectType))
.description("Find parking")
.argument(createFindParkingArguments(allVersionsArgument))
- .dataFetcher(parkingFetcher))
+ )
.field(newFieldDefinition()
.name(VALID_TRANSPORT_MODES)
.type(new GraphQLList(transportModeSubmodeObjectType))
@@ -369,7 +408,7 @@ public void init() {
.type(createAuthorizationCheckOutputType())
.description(AUTHORIZATION_CHECK_DESCRIPTION)
.argument(createAuthorizationCheckArguments())
- .dataFetcher(authorizationCheckDataFetcher))
+ )
.field(newFieldDefinition()
.name(TAGS)
.type(new GraphQLList(tagObjectTypeCreator.create()))
@@ -378,21 +417,18 @@ public void init() {
.name(TAG_NAME)
.description(TAG_NAME_DESCRIPTION)
.type(new GraphQLNonNull(GraphQLString)))
- .dataFetcher(tagFetcher)
.build())
.field(newFieldDefinition()
.name(GROUP_OF_STOP_PLACES)
.type(new GraphQLList(groupOfStopPlacesObjectType))
.description("Group of stop places")
.argument(createFindGroupOfStopPlacesArguments())
- .dataFetcher(groupOfStopPlacesFetcher)
.build())
.field(newFieldDefinition()
.name(PURPOSE_OF_GROUPING)
.type(new GraphQLList(purposeOfGroupingType))
.description("List all purpose of grouping")
.argument(createFindPurposeOfGroupingArguments())
- .dataFetcher(purposeOfGroupingFetcher)
)
.field(newFieldDefinition()
@@ -400,27 +436,23 @@ public void init() {
.type(new GraphQLList(groupOfTariffZonesObjectType))
.description("Group of tariff zones")
.argument(createFindGroupOfTariffZonesArguments())
- .dataFetcher(groupOfTariffZonesFetcher)
.build())
.field(newFieldDefinition()
.name(TARIFF_ZONES)
.type(new GraphQLList(tariffZoneObjectType))
.description("Tariff zones")
.argument(createFindTariffZonesArguments())
- .dataFetcher(tariffZonesFetcher)
.build())
.field(newFieldDefinition()
.name(FARE_ZONES)
.type(new GraphQLList(fareZoneObjectType))
.description("Fare zones")
.argument(createFindFareZonesArguments())
- .dataFetcher(fareZonesFetcher)
.build())
.field(newFieldDefinition()
.name(FARE_ZONES_AUTHORITIES)
.type(new GraphQLList(GraphQLString))
.description("List all fare zone authorities.")
- .dataFetcher(fareZoneAuthoritiesFetcher)
.build())
.build();
@@ -443,7 +475,7 @@ public void init() {
GraphQLInputObjectType purposeOfGroupingInputObjectType =createPurposeOfGroupingInputObjectType();
GraphQLObjectType stopPlaceRegisterMutation = newObject()
- .name("StopPlaceMutation")
+ .name(STOPPLACES_MUTATION)
.description("Create and edit stopplaces")
.field(newFieldDefinition()
.type(new GraphQLList(stopPlaceObjectType))
@@ -452,7 +484,7 @@ public void init() {
.argument(GraphQLArgument.newArgument()
.name(OUTPUT_TYPE_STOPPLACE)
.type(stopPlaceInputObjectType))
- .dataFetcher(stopPlaceUpdater))
+ )
.field(newFieldDefinition()
.type(new GraphQLList(parentStopPlaceObjectType))
.name(MUTATE_PARENT_STOPPLACE)
@@ -460,7 +492,7 @@ public void init() {
.argument(GraphQLArgument.newArgument()
.name(OUTPUT_TYPE_PARENT_STOPPLACE)
.type(parentStopPlaceInputObjectType))
- .dataFetcher(stopPlaceUpdater))
+ )
.field(newFieldDefinition()
.name(MUTATE_GROUP_OF_STOP_PLACES)
.type(groupOfStopPlacesObjectType)
@@ -468,7 +500,7 @@ public void init() {
.argument(GraphQLArgument.newArgument()
.name(OUTPUT_TYPE_GROUP_OF_STOPPLACES)
.type(groupOfStopPlacesInputObjectType))
- .dataFetcher(groupOfStopPlacesUpdater))
+ )
.field(newFieldDefinition()
.name(MUTATE_PURPOSE_OF_GROUPING)
.type(purposeOfGroupingType)
@@ -476,7 +508,7 @@ public void init() {
.argument(GraphQLArgument.newArgument().
name(OUTPUT_TYPE_PURPOSE_OF_GROUPING)
.type(purposeOfGroupingInputObjectType))
- .dataFetcher(purposeOfGroupingUpdater))
+ )
.field(newFieldDefinition()
.type(new GraphQLList(pathLinkObjectType))
.name(MUTATE_PATH_LINK)
@@ -485,15 +517,14 @@ public void init() {
.name(OUTPUT_TYPE_PATH_LINK)
.type(new GraphQLList(pathLinkObjectInputType)))
.description("Create new or update existing " + OUTPUT_TYPE_PATH_LINK)
- .dataFetcher(pathLinkUpdater))
+ )
.field(newFieldDefinition()
.type(new GraphQLList(parkingObjectType))
.name(MUTATE_PARKING)
.argument(GraphQLArgument.newArgument()
.name(OUTPUT_TYPE_PARKING)
.type(new GraphQLList(parkingInputObjectType)))
- .description("Create new or update existing " + OUTPUT_TYPE_PARKING)
- .dataFetcher(parkingUpdater))
+ .description("Create new or update existing " + OUTPUT_TYPE_PARKING))
.field(newFieldDefinition()
.type(tariffZoneObjectType)
.name(TERMINATE_TARIFF_ZONE)
@@ -501,27 +532,223 @@ public void init() {
.argument(newArgument().name(TARIFF_ZONE_ID).type(new GraphQLNonNull(GraphQLString)))
.argument(newArgument().name(VALID_BETWEEN_TO_DATE).type(new GraphQLNonNull(dateScalar.getGraphQLDateScalar())))
.argument(newArgument().name(VERSION_COMMENT).type(GraphQLString))
- .dataFetcher(environment -> tariffZoneTerminator.terminateTariffZone(environment.getArgument(TARIFF_ZONE_ID), environment.getArgument(VALID_BETWEEN_TO_DATE), environment.getArgument(VERSION_COMMENT))))
+ )
.fields(tagOperationsBuilder.getTagOperations())
.fields(stopPlaceOperationsBuilder.getStopPlaceOperations(stopPlaceInterface))
.fields(parkingOperationsBuilder.getParkingOperations())
.fields(multiModalityOperationsBuilder.getMultiModalityOperations(parentStopPlaceObjectType, validBetweenInputObjectType))
.field(newFieldDefinition()
.type(GraphQLBoolean)
- .name("deleteGroupOfStopPlaces")
+ .name(DELETE_GROUP_OF_STOPPLACES)
.argument(GraphQLArgument.newArgument()
.name(ID)
.type(new GraphQLNonNull(GraphQLString)))
.description("Hard delete group of stop places by ID")
- .dataFetcher(groupOfStopPlacesDeleterFetcher))
+ )
.build();
stopPlaceRegisterSchema = GraphQLSchema.newSchema()
.query(stopPlaceRegisterQuery)
.mutation(stopPlaceRegisterMutation)
+ .codeRegistry(buildCodeRegistry())
.build();
}
+
+ public GraphQLCodeRegistry buildCodeRegistry() {
+ GraphQLCodeRegistry.Builder codeRegistryBuilder = GraphQLCodeRegistry.newCodeRegistry();
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, IMPORTED_ID, getOriginalIdsFetcher());
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, IMPORTED_ID, getOriginalIdsFetcher());
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_QUAY, IMPORTED_ID, getOriginalIdsFetcher());
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, ID, getNetexIdFetcher());
+
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, TARIFF_ZONES, stopPlaceTariffZoneFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, TARIFF_ZONES, stopPlaceTariffZoneFetcher);
+
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, TAGS, tagFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, TAGS, tagFetcher);
+
+ dataFetcherGeometry(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE);
+
+ dataFetcherGeometry(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE);
+
+ dataFetcherGeometry(codeRegistryBuilder, OUTPUT_TYPE_QUAY);
+
+ dataFetcherGeometry(codeRegistryBuilder, OUTPUT_TYPE_PARKING);
+
+
+ dataFetcherPlaceEquipments(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE);
+ dataFetcherPlaceEquipments(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE);
+ dataFetcherPlaceEquipments(codeRegistryBuilder, OUTPUT_TYPE_QUAY);
+
+
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, STOP_PLACE_GROUPS, stopPlaceGroupsFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, STOP_PLACE_GROUPS, stopPlaceGroupsFetcher);
+
+
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, FARE_ZONES, stopPlaceFareZoneFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, FARE_ZONES, stopPlaceFareZoneFetcher);
+
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, ID, getNetexIdFetcher());
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_QUAY, ID, getNetexIdFetcher());
+ registerDataFetcher(codeRegistryBuilder,OUTPUT_TYPE_GROUP_OF_STOPPLACES,ID,getNetexIdFetcher());
+
+ registerDataFetcher(codeRegistryBuilder,OUTPUT_TYPE_TARIFF_ZONE,ID,getNetexIdFetcher());
+ registerDataFetcher(codeRegistryBuilder,OUTPUT_TYPE_FARE_ZONE,ID,getNetexIdFetcher());
+
+ registerDataFetcher(codeRegistryBuilder,OUTPUT_TYPE_PARKING,ID,getNetexIdFetcher());
+
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, KEY_VALUES, keyValuesDataFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, KEY_VALUES, keyValuesDataFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_TARIFF_ZONE, KEY_VALUES, keyValuesDataFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_FARE_ZONE, KEY_VALUES, keyValuesDataFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_QUAY, KEY_VALUES, keyValuesDataFetcher);
+
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_STOPPLACE, POLYGON, polygonFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_PARENT_STOPPLACE, POLYGON, polygonFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_TARIFF_ZONE, POLYGON, polygonFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_FARE_ZONE, POLYGON, polygonFetcher);
+ registerDataFetcher(codeRegistryBuilder, OUTPUT_TYPE_QUAY, POLYGON, polygonFetcher);
+
+
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, FIND_STOPPLACE, stopPlaceFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, FIND_STOPPLACE_BY_BBOX, stopPlaceFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, FIND_TOPOGRAPHIC_PLACE, topographicPlaceFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, FIND_PATH_LINK, pathLinkFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, FIND_PARKING, parkingFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, CHECK_AUTHORIZED, authorizationCheckDataFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, TAGS, tagFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, GROUP_OF_STOP_PLACES, groupOfStopPlacesFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, PURPOSE_OF_GROUPING, purposeOfGroupingFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, GROUP_OF_TARIFF_ZONES, groupOfTariffZonesFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, TARIFF_ZONES, tariffZonesFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, FARE_ZONES, fareZonesFetcher);
+ registerDataFetcher(codeRegistryBuilder, STOPPLACES_REGISTER, FARE_ZONES_AUTHORITIES, fareZoneAuthoritiesFetcher);
+
+
+
+
+
+
+
+ //mutation
+
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,MUTATE_PARKING,parkingUpdater);
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,MUTATE_STOPPLACE,stopPlaceUpdater);
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,MUTATE_PARENT_STOPPLACE,stopPlaceUpdater);
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,MUTATE_GROUP_OF_STOP_PLACES,groupOfStopPlacesUpdater);
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,MUTATE_PURPOSE_OF_GROUPING,purposeOfGroupingUpdater);
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,MUTATE_PATH_LINK,pathLinkUpdater);
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,TERMINATE_TARIFF_ZONE, env -> tariffZoneTerminator.terminateTariffZone(env.getArgument(TARIFF_ZONE_ID), env.getArgument(VALID_BETWEEN_TO_DATE), env.getArgument(VERSION_COMMENT)));
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,DELETE_GROUP_OF_STOPPLACES,groupOfStopPlacesDeleterFetcher);
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,CREATE_MULTI_MODAL_STOPPLACE,
+ environment -> {
+ Map input = environment.getArgument("input");
+
+ if(input == null) {
+ throw new IllegalArgumentException("input is not specified");
+ }
+
+ ValidBetween validBetween = validBetweenMapper.map((Map) input.get(VALID_BETWEEN));
+ String versionComment = (String) input.get(VERSION_COMMENT);
+ Point geoJsonPoint = geometryMapper.createGeoJsonPoint((Map) input.get(GEOMETRY));
+ EmbeddableMultilingualString name = getEmbeddableString((Map) input.get(NAME));
+
+ @SuppressWarnings("unchecked")
+ List stopPlaceIds = (List) input.get(STOP_PLACE_IDS);
+
+ return parentStopPlaceEditor.createMultiModalParentStopPlace(stopPlaceIds, name, validBetween, versionComment, geoJsonPoint);
+ }
+ );
+
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,ADD_TO_MULTIMODAL_STOPPLACE,
+ environment -> {
+ Map input = environment.getArgument("input");
+
+ if(input == null) {
+ throw new IllegalArgumentException("input is not specified");
+ }
+
+ if(input.get(PARENT_SITE_REF) == null) {
+ throw new IllegalArgumentException("Parent site ref cannot be null for this operation" + ADD_TO_MULTI_MODAL_STOP_PLACE_INPUT);
+ }
+
+ String parentSiteRef = (String) input.get(PARENT_SITE_REF);
+
+ ValidBetween validBetween = validBetweenMapper.map((Map) input.get(VALID_BETWEEN));
+ String versionComment = (String) input.get(VERSION_COMMENT);
+
+ if(input.get(STOP_PLACE_IDS) == null) {
+ throw new IllegalArgumentException("List of " + STOP_PLACE_IDS + "cannot be null");
+ }
+ @SuppressWarnings("unchecked")
+ List stopPlaceIds = (List) input.get(STOP_PLACE_IDS);
+
+ return parentStopPlaceEditor.addToMultiModalParentStopPlace(parentSiteRef, stopPlaceIds, validBetween, versionComment);
+ }
+ );
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,REMOVE_FROM_MULTIMODAL_STOPPLACE,
+ environment -> parentStopPlaceEditor.removeFromMultiModalStopPlace(environment.getArgument(PARENT_SITE_REF), environment.getArgument(STOP_PLACE_ID))
+ );
+
+
+ registerDataFetcher(codeRegistryBuilder,STOPPLACES_MUTATION,DELETE_PARKING,
+ environment -> parkingDeleter.deleteParking(environment.getArgument(PARKING_ID))
+ );
+
+
+ return codeRegistryBuilder.build();
+ }
+
+ private void dataFetcherPlaceEquipments(GraphQLCodeRegistry.Builder codeRegistryBuilder, String source) {
+ registerDataFetcher(codeRegistryBuilder, source, PLACE_EQUIPMENTS, env -> {
+ if (env.getSource() instanceof StopPlace stopPlace) {
+ return stopPlace.getPlaceEquipments();
+ } else if (env.getSource() instanceof Quay quay) {
+ return quay.getPlaceEquipments();
+ }
+ return null;
+ });
+ }
+
+ private void dataFetcherGeometry(GraphQLCodeRegistry.Builder codeRegistryBuilder, String parentType) {
+ registerDataFetcher(codeRegistryBuilder, parentType, GEOMETRY, env -> {
+ if (env.getSource() instanceof Zone_VersionStructure source) {
+ if (source.getCentroid()!=null) {
+ return source.getCentroid();
+ }
+ return source.getPolygon();
+ } else if (env.getSource() instanceof Link link) {
+ return link.getLineString();
+ }
+ return null;
+ });
+ }
+
+
+ private static DataFetcher