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 getNetexIdFetcher() { + return env -> { + if (env.getSource() instanceof IdentifiedEntity identifiedEntity) { + return identifiedEntity.getNetexId(); + } + return null; + }; + } + + private static DataFetcher getOriginalIdsFetcher(){ + return env -> { + if(env.getSource() instanceof DataManagedObjectStructure dataManagedObjectStructure){ + return dataManagedObjectStructure.getOriginalIds(); + } + return null; + }; + } + + private void registerDataFetcher(GraphQLCodeRegistry.Builder codeRegistryBuilder, String parentType, String fieldName, DataFetcher dataFetcher) { + FieldCoordinates coordinates = FieldCoordinates.coordinates(parentType, fieldName); + codeRegistryBuilder.dataFetcher(coordinates, dataFetcher); + } + private GraphQLObjectType createAddressablePlaceObjectType(List commonFieldsList) { return newObject() .name(OUTPUT_TYPE_ADDRESSABLE_PLACE) diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/fetchers/GroupOfStopPlacesUpdater.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/fetchers/GroupOfStopPlacesUpdater.java index be9aefe48..b97a5168d 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/fetchers/GroupOfStopPlacesUpdater.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/fetchers/GroupOfStopPlacesUpdater.java @@ -77,7 +77,7 @@ class GroupOfStopPlacesUpdater implements DataFetcher { @Override public GroupOfStopPlaces get(DataFetchingEnvironment environment) { - List fields = environment.getFields(); + List fields = environment.getMergedField().getFields(); CleanupHelper.trimValues(environment.getArguments()); for (Field field : fields) { if (field.getName().equals(MUTATE_GROUP_OF_STOP_PLACES)) { diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/MultiModalityOperationsBuilder.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/MultiModalityOperationsBuilder.java index 71711387f..aa8ea6a44 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/MultiModalityOperationsBuilder.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/MultiModalityOperationsBuilder.java @@ -21,18 +21,10 @@ import graphql.schema.GraphQLList; import graphql.schema.GraphQLNonNull; import graphql.schema.GraphQLObjectType; -import org.locationtech.jts.geom.Point; -import org.rutebanken.tiamat.model.EmbeddableMultilingualString; -import org.rutebanken.tiamat.model.ValidBetween; -import org.rutebanken.tiamat.rest.graphql.mappers.GeometryMapper; -import org.rutebanken.tiamat.rest.graphql.mappers.ValidBetweenMapper; -import org.rutebanken.tiamat.service.stopplace.MultiModalStopPlaceEditor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; -import java.util.Map; import static graphql.Scalars.GraphQLString; import static graphql.schema.GraphQLArgument.newArgument; @@ -50,7 +42,6 @@ import static org.rutebanken.tiamat.rest.graphql.GraphQLNames.STOP_PLACE_IDS; import static org.rutebanken.tiamat.rest.graphql.GraphQLNames.VALID_BETWEEN; import static org.rutebanken.tiamat.rest.graphql.GraphQLNames.VERSION_COMMENT; -import static org.rutebanken.tiamat.rest.graphql.mappers.EmbeddableMultilingualStringMapper.getEmbeddableString; import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.embeddableMultiLingualStringInputObjectType; import static org.rutebanken.tiamat.rest.graphql.types.CustomGraphQLTypes.geoJsonInputType; @@ -63,15 +54,6 @@ public class MultiModalityOperationsBuilder { private static final String INPUT = "input"; - @Autowired - private MultiModalStopPlaceEditor parentStopPlaceEditor; - - @Autowired - private ValidBetweenMapper validBetweenMapper; - - @Autowired - private GeometryMapper geometryMapper; - public List getMultiModalityOperations(GraphQLObjectType parentStopPlaceObjectType, GraphQLInputObjectType validBetweenInputObjectType) { List operations = new ArrayList<>(); @@ -96,23 +78,6 @@ public List getMultiModalityOperations(GraphQLObjectType .fields(createMultiModalStopPlaceFields) .build()) .build()) - .dataFetcher(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); - }) .build()); List addOrRemoveChildMultiModalStopPlaceFields = new ArrayList<>(); @@ -132,30 +97,6 @@ public List getMultiModalityOperations(GraphQLObjectType .fields(addOrRemoveChildMultiModalStopPlaceFields) .build()) .build()) - .dataFetcher(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); - }) .build()); operations.add(newFieldDefinition() @@ -164,7 +105,6 @@ public List getMultiModalityOperations(GraphQLObjectType .description("Removes a StopPlace from an existing ParentStopPlace") .argument(newArgument().name(PARENT_SITE_REF).type(new GraphQLNonNull(GraphQLString))) .argument(newArgument().name(STOP_PLACE_ID).type(new GraphQLList(GraphQLString))) - .dataFetcher(environment -> parentStopPlaceEditor.removeFromMultiModalStopPlace(environment.getArgument(PARENT_SITE_REF), environment.getArgument(STOP_PLACE_ID))) .build()); return operations; diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/ParkingOperationsBuilder.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/ParkingOperationsBuilder.java index ec1d6d09b..385a1a40f 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/ParkingOperationsBuilder.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/operations/ParkingOperationsBuilder.java @@ -17,8 +17,6 @@ import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLNonNull; -import org.rutebanken.tiamat.service.parking.ParkingDeleter; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -34,9 +32,6 @@ @Component public class ParkingOperationsBuilder { - @Autowired - private ParkingDeleter parkingDeleter; - public List getParkingOperations() { List operations = new ArrayList<>(); @@ -46,7 +41,6 @@ public List getParkingOperations() { .name(DELETE_PARKING) .description("!!! Deletes all versions of Parking from database - use with caution !!!") .argument(newArgument().name(PARKING_ID).type(new GraphQLNonNull(GraphQLString))) - .dataFetcher(environment -> parkingDeleter.deleteParking(environment.getArgument(PARKING_ID))) .build()); return operations; diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/CustomScalars.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/CustomScalars.java index 205ce314b..57ae57c2c 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/CustomScalars.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/CustomScalars.java @@ -17,6 +17,7 @@ import graphql.language.ArrayValue; import graphql.language.FloatValue; +import graphql.language.Value; import graphql.schema.Coercing; import graphql.schema.GraphQLScalarType; import org.locationtech.jts.geom.Coordinate; @@ -26,54 +27,56 @@ public class CustomScalars { - public static GraphQLScalarType GraphQLGeoJSONCoordinates = new GraphQLScalarType("Coordinates", null, new Coercing() { - @Override - public List> serialize(Object input) { - if (input instanceof Coordinate[]) { - Coordinate[] coordinates = ((Coordinate[]) input); - List> coordinateList = new ArrayList<>(); - for (Coordinate coordinate : coordinates) { - List coordinatePair = new ArrayList<>(); - coordinatePair.add(coordinate.x); - coordinatePair.add(coordinate.y); + public static GraphQLScalarType GraphQLGeoJSONCoordinates = new GraphQLScalarType.Builder() + .name("Coordinates") + .description("GeoJSON Coordinates") + .coercing(new Coercing() { + @Override + public List> serialize(Object input) { + if (input instanceof Coordinate[] coordinates) { + List> coordinateList = new ArrayList<>(); + for (Coordinate coordinate : coordinates) { + List coordinatePair = new ArrayList<>(); + coordinatePair.add(coordinate.x); + coordinatePair.add(coordinate.y); - coordinateList.add(coordinatePair); + coordinateList.add(coordinatePair); + } + return coordinateList; + } + return null; } - return coordinateList; - } - return null; - } @Override public Coordinate[] parseValue(Object input) { List> coordinateList = (List>) input; - Coordinate[] coordinates = new Coordinate[coordinateList.size()]; + Coordinate[] coordinates = new Coordinate[coordinateList.size()]; - for (int i = 0; i < coordinateList.size(); i++) { - coordinates[i] = new Coordinate(coordinateList.get(i).get(0), coordinateList.get(i).get(1)); - } + for (int i = 0; i < coordinateList.size(); i++) { + coordinates[i] = new Coordinate(coordinateList.get(i).get(0), coordinateList.get(i).get(1)); + } - return coordinates; - } + return coordinates; + } - @Override - public Object parseLiteral(Object input) { - if (input instanceof ArrayValue) { - ArrayList coordinateList = (ArrayList) ((ArrayValue) input).getValues(); - Coordinate[] coordinates = new Coordinate[coordinateList.size()]; + @Override + public Object parseLiteral(Object input) { + if (input instanceof ArrayValue arrayValue) { + List coordinateList = arrayValue.getValues(); + Coordinate[] coordinates = new Coordinate[coordinateList.size()]; - for (int i = 0; i < coordinateList.size(); i++) { - ArrayValue v = coordinateList.get(i); + for (int i = 0; i < coordinateList.size(); i++) { + List v = coordinateList.get(i).getChildren(); - FloatValue longitude = (FloatValue) v.getValues().get(0); - FloatValue latitude = (FloatValue) v.getValues().get(1); - coordinates[i] = new Coordinate(longitude.getValue().doubleValue(), latitude.getValue().doubleValue()); + FloatValue longitude = (FloatValue) v.get(0); + FloatValue latitude = (FloatValue) v.get(1); + coordinates[i] = new Coordinate(longitude.getValue().doubleValue(), latitude.getValue().doubleValue()); } return coordinates; } return null; } - }); + }).build(); } diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/DateScalar.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/DateScalar.java index 976cf3828..4de968ecd 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/DateScalar.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/scalars/DateScalar.java @@ -64,28 +64,31 @@ public GraphQLScalarType getGraphQLDateScalar() { } private GraphQLScalarType createGraphQLDateScalar() { - return new GraphQLScalarType("DateTime", DATE_SCALAR_DESCRIPTION, new Coercing() { - @Override - public String serialize(Object input) { - if (input instanceof Instant) { - return (((Instant) input)).atZone(exportTimeZone.getDefaultTimeZoneId()).format(FORMATTER); - } - return null; - } - - @Override - public Instant parseValue(Object input) { - return Instant.from(PARSER.parse((CharSequence) input)); - } - - @Override - public Object parseLiteral(Object input) { - if (input instanceof StringValue) { - return parseValue(((StringValue) input).getValue()); - } - return null; - } - }); + return new GraphQLScalarType.Builder() + .name("DateTime") + .description(DATE_SCALAR_DESCRIPTION) + .coercing(new Coercing() {@Override + public String serialize(Object input) { + if (input instanceof Instant instant) { + return instant.atZone(exportTimeZone.getDefaultTimeZoneId()).format(FORMATTER); + } + return null; + } + + @Override + public Instant parseValue(Object input) { + return Instant.from(PARSER.parse((CharSequence) input)); + } + + @Override + public Object parseLiteral(Object input) { + if (input instanceof StringValue stringValue) { + return parseValue((stringValue).getValue()); + } + return null; + } + }).build(); + } } diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/CustomGraphQLTypes.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/CustomGraphQLTypes.java index 57846dd24..057659221 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/CustomGraphQLTypes.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/CustomGraphQLTypes.java @@ -39,7 +39,6 @@ import org.rutebanken.tiamat.model.InstalledEquipment_VersionStructure; import org.rutebanken.tiamat.model.InterchangeWeightingEnumeration; import org.rutebanken.tiamat.model.LimitationStatusEnumeration; -import org.rutebanken.tiamat.model.Link; import org.rutebanken.tiamat.model.MetroSubmodeEnumeration; import org.rutebanken.tiamat.model.ModificationEnumeration; import org.rutebanken.tiamat.model.NameTypeEnumeration; @@ -67,7 +66,6 @@ import org.rutebanken.tiamat.model.WaitingRoomEquipment; import org.rutebanken.tiamat.model.WaterSubmodeEnumeration; import org.rutebanken.tiamat.model.ZoneTopologyEnumeration; -import org.rutebanken.tiamat.model.Zone_VersionStructure; import org.rutebanken.tiamat.model.identification.IdentifiedEntity; import org.rutebanken.tiamat.rest.graphql.fetchers.PrivateCodeFetcher; @@ -75,10 +73,10 @@ import java.util.ArrayList; import java.util.List; -import static graphql.Scalars.GraphQLBigInteger; import static graphql.Scalars.GraphQLBoolean; import static graphql.Scalars.GraphQLInt; import static graphql.Scalars.GraphQLString; +import static graphql.scalars.ExtendedScalars.GraphQLBigInteger; import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition; import static graphql.schema.GraphQLInputObjectField.newInputObjectField; import static graphql.schema.GraphQLObjectType.newObject; @@ -199,19 +197,7 @@ public static GraphQLEnumType createCustomEnumType(String name, Class c) { public static GraphQLFieldDefinition geometryFieldDefinition = newFieldDefinition() .name(GEOMETRY) .type(geoJsonObjectType) - .dataFetcher(env -> { - if (env.getSource() instanceof Zone_VersionStructure) { - Zone_VersionStructure source = env.getSource(); - if (source.getCentroid()!=null) { - return source.getCentroid(); - } - return source.getPolygon(); - } else if (env.getSource() instanceof Link) { - Link link = env.getSource(); - return link.getLineString(); - } - return null; - }).build(); + .build(); public static GraphQLObjectType embeddableMultilingualStringObjectType = newObject() .name(OUTPUT_TYPE_EMBEDDABLE_MULTILINGUAL_STRING) diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/FareZoneObjectTypeCreator.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/FareZoneObjectTypeCreator.java index af011358a..02301ceed 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/FareZoneObjectTypeCreator.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/FareZoneObjectTypeCreator.java @@ -70,7 +70,7 @@ public GraphQLObjectType create(List zoneCommonFieldList fareZoneFieldList.add(newFieldDefinition() .name(FARE_ZONES_AUTHORITY_REF) .type(GraphQLString) - .dataFetcher(env -> env.getSource() instanceof FareZone ? ((FareZone) env.getSource()).getTransportOrganisationRef() : null) + .dataFetcher(env -> env.getSource() instanceof FareZone fareZone ? fareZone.getTransportOrganisationRef() : null) .build()); fareZoneFieldList.add(privateCodeFieldDefinition); fareZoneFieldList.add(newFieldDefinition().name(FARE_ZONES_ZONE_TOPOLOGY).type(zoneTopologyEnumType).build()); diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/StopPlaceInterfaceCreator.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/StopPlaceInterfaceCreator.java index 10d85cdce..c4e7b2a30 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/StopPlaceInterfaceCreator.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/StopPlaceInterfaceCreator.java @@ -15,17 +15,13 @@ package org.rutebanken.tiamat.rest.graphql.types; -import graphql.schema.DataFetcher; + import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLInterfaceType; import graphql.schema.GraphQLList; import graphql.schema.GraphQLObjectType; import graphql.schema.GraphQLTypeReference; import graphql.schema.TypeResolver; -import org.rutebanken.tiamat.model.GroupOfStopPlaces; -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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -51,20 +47,12 @@ @Component public class StopPlaceInterfaceCreator { - @Autowired - private StopPlaceTariffZoneFetcher stopPlaceTariffZoneFetcher; - @Autowired - private StopPlaceFareZoneFetcher stopPlaceFareZoneFetcher; @Autowired private TagObjectTypeCreator tagObjectTypeCreator; - @Autowired - private DataFetcher> stopPlaceGroupsFetcher; - @Autowired - private TagFetcher tagFetcher; public List createCommonInterfaceFields(GraphQLObjectType tariffZoneObjectType, GraphQLObjectType fareZoneObjectType, @@ -92,22 +80,19 @@ public List createCommonInterfaceFields(GraphQLObjectTyp stopPlaceInterfaceFields.add(newFieldDefinition() .name(TARIFF_ZONES) .type(new GraphQLList(tariffZoneObjectType)) - .dataFetcher(stopPlaceTariffZoneFetcher) .build()); stopPlaceInterfaceFields.add(newFieldDefinition() .name(FARE_ZONES) .type(new GraphQLList(fareZoneObjectType)) - .dataFetcher(stopPlaceFareZoneFetcher) .build()); stopPlaceInterfaceFields.add(newFieldDefinition() .name(TAGS) .type(new GraphQLList(tagObjectTypeCreator.create())) - .dataFetcher(tagFetcher).build()); + .build()); stopPlaceInterfaceFields.add(newFieldDefinition() .name(STOP_PLACE_GROUPS) .type(new GraphQLList(new GraphQLTypeReference(OUTPUT_TYPE_GROUP_OF_STOPPLACES))) - .dataFetcher(stopPlaceGroupsFetcher) .build()); return stopPlaceInterfaceFields; } diff --git a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/ZoneCommonFieldListCreator.java b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/ZoneCommonFieldListCreator.java index 274eaf3bc..17816f8be 100644 --- a/src/main/java/org/rutebanken/tiamat/rest/graphql/types/ZoneCommonFieldListCreator.java +++ b/src/main/java/org/rutebanken/tiamat/rest/graphql/types/ZoneCommonFieldListCreator.java @@ -18,12 +18,6 @@ import graphql.schema.GraphQLFieldDefinition; import graphql.schema.GraphQLList; import graphql.schema.GraphQLObjectType; -import org.rutebanken.tiamat.rest.graphql.fetchers.KeyValuesDataFetcher; -import org.rutebanken.tiamat.rest.graphql.fetchers.OriginalIdsDataFetcher; -import org.rutebanken.tiamat.rest.graphql.fetchers.PolygonFetcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -47,18 +41,6 @@ @Component public class ZoneCommonFieldListCreator { - - private static final Logger logger = LoggerFactory.getLogger(ZoneCommonFieldListCreator.class); - - @Autowired - private OriginalIdsDataFetcher originalIdsDataFetcher; - - @Autowired - private KeyValuesDataFetcher keyValuesDataFetcher; - - @Autowired - private PolygonFetcher polygonFetcher; - public List create(GraphQLObjectType validBetweenObjectType) { List zoneFieldList = new ArrayList<>(); @@ -74,19 +56,16 @@ public List create(GraphQLObjectType validBetweenObjectT .name(IMPORTED_ID) .deprecate("Moved to keyValues") .type(new GraphQLList(GraphQLString)) - .dataFetcher(originalIdsDataFetcher) .build()); zoneFieldList.add(newFieldDefinition() .name(KEY_VALUES) .type(new GraphQLList(keyValuesObjectType)) - .dataFetcher(keyValuesDataFetcher) .build()); zoneFieldList.add(newFieldDefinition() .name(POLYGON) .type(geoJsonObjectType) - .dataFetcher(polygonFetcher) .build()); return zoneFieldList; diff --git a/src/test/java/org/rutebanken/tiamat/rest/graphql/GraphQLResourceStopPlaceIntegrationTest.java b/src/test/java/org/rutebanken/tiamat/rest/graphql/GraphQLResourceStopPlaceIntegrationTest.java index 8c79432ff..3549d2929 100644 --- a/src/test/java/org/rutebanken/tiamat/rest/graphql/GraphQLResourceStopPlaceIntegrationTest.java +++ b/src/test/java/org/rutebanken/tiamat/rest/graphql/GraphQLResourceStopPlaceIntegrationTest.java @@ -530,7 +530,7 @@ public void searchForExpiredStopPlace() { // Verify that pointInTime *before* validity-period returns null graphQlJsonQuery = """ { - stopPlace: stopPlace (query:"Gamleveien", pointInTime:"%s") { " + stopPlace: stopPlace (query:"Gamleveien", pointInTime:"%s") { name {value} } }""".formatted(stopPlace.getValidBetween().getFromDate().minusSeconds(100).toString());