diff --git a/src/main/java/org/entur/lamassu/controller/GraphQLQueryController.java b/src/main/java/org/entur/lamassu/controller/GraphQLQueryController.java index 1f6410bd..1b691449 100644 --- a/src/main/java/org/entur/lamassu/controller/GraphQLQueryController.java +++ b/src/main/java/org/entur/lamassu/controller/GraphQLQueryController.java @@ -23,6 +23,7 @@ import org.entur.lamassu.service.RangeQueryParameters; import org.entur.lamassu.service.StationFilterParameters; import org.entur.lamassu.service.VehicleFilterParameters; +import org.entur.lamassu.util.OperatorFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -62,8 +63,8 @@ public Collection getCodespaces() { .collect(Collectors.toSet()); } - public Collection getOperators() { - return feedProviderService.getOperators(); + public Collection getOperators(List formFactors) { + return feedProviderService.getOperators(new OperatorFilter(formFactors)); } public Collection getVehicles( diff --git a/src/main/java/org/entur/lamassu/service/FeedProviderService.java b/src/main/java/org/entur/lamassu/service/FeedProviderService.java index a1298940..b401361c 100644 --- a/src/main/java/org/entur/lamassu/service/FeedProviderService.java +++ b/src/main/java/org/entur/lamassu/service/FeedProviderService.java @@ -19,11 +19,13 @@ package org.entur.lamassu.service; import java.util.List; +import org.entur.lamassu.model.entities.FormFactor; import org.entur.lamassu.model.entities.Operator; import org.entur.lamassu.model.provider.FeedProvider; +import org.entur.lamassu.util.OperatorFilter; public interface FeedProviderService { List getFeedProviders(); - List getOperators(); + List getOperators(OperatorFilter operatorFilter); FeedProvider getFeedProviderBySystemId(String systemId); } diff --git a/src/main/java/org/entur/lamassu/service/impl/FeedProviderServiceImpl.java b/src/main/java/org/entur/lamassu/service/impl/FeedProviderServiceImpl.java index 3cf69693..984b201b 100644 --- a/src/main/java/org/entur/lamassu/service/impl/FeedProviderServiceImpl.java +++ b/src/main/java/org/entur/lamassu/service/impl/FeedProviderServiceImpl.java @@ -23,9 +23,11 @@ import java.util.stream.Collectors; import org.entur.lamassu.config.feedprovider.FeedProviderConfig; import org.entur.lamassu.mapper.entitymapper.TranslationMapper; +import org.entur.lamassu.model.entities.FormFactor; import org.entur.lamassu.model.entities.Operator; import org.entur.lamassu.model.provider.FeedProvider; import org.entur.lamassu.service.FeedProviderService; +import org.entur.lamassu.util.OperatorFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -55,9 +57,10 @@ public List getFeedProviders() { } @Override - public List getOperators() { + public List getOperators(OperatorFilter operatorFilter) { return getFeedProviders() .stream() + .filter(feedProvider -> operatorFilter.matches(feedProvider)) .map(this::mapOperator) .distinct() .collect(Collectors.toList()); diff --git a/src/main/java/org/entur/lamassu/util/OperatorFilter.java b/src/main/java/org/entur/lamassu/util/OperatorFilter.java new file mode 100644 index 00000000..024badb0 --- /dev/null +++ b/src/main/java/org/entur/lamassu/util/OperatorFilter.java @@ -0,0 +1,35 @@ +package org.entur.lamassu.util; + +import java.util.List; +import java.util.Locale; +import org.entur.lamassu.model.entities.FormFactor; +import org.entur.lamassu.model.provider.FeedProvider; + +public class OperatorFilter { + + private final List formFactors; + + public OperatorFilter(List formFactors) { + this.formFactors = formFactors; + } + + public boolean matches(FeedProvider feedProvider) { + return this.hasFormFactor(feedProvider); + } + + public boolean hasFormFactor(FeedProvider feedProvider) { + if ( + this.formFactors != null && + !this.formFactors.isEmpty() && + feedProvider + .getVehicleTypes() + .stream() + .noneMatch(vt -> + this.formFactors.contains(FormFactor.valueOf(vt.getFormFactor().name())) + ) + ) { + return false; + } + return true; + } +} diff --git a/src/main/resources/graphql/schema.graphqls b/src/main/resources/graphql/schema.graphqls index 9f4e8bf4..e5e73855 100644 --- a/src/main/resources/graphql/schema.graphqls +++ b/src/main/resources/graphql/schema.graphqls @@ -1,7 +1,10 @@ type Query { codespaces: [String] - operators: [Operator] + operators( + "Filter by form factors" + formFactors: [FormFactor] + ):[Operator] vehicle(id: String!): Vehicle diff --git a/src/test/java/org/entur/lamassu/util/OperatorFilterTest.java b/src/test/java/org/entur/lamassu/util/OperatorFilterTest.java new file mode 100644 index 00000000..b96eaa0f --- /dev/null +++ b/src/test/java/org/entur/lamassu/util/OperatorFilterTest.java @@ -0,0 +1,49 @@ +package org.entur.lamassu.util; + +import java.util.List; +import org.entur.gbfs.v2_3.vehicle_types.GBFSVehicleType; +import org.entur.lamassu.model.entities.FormFactor; +import org.entur.lamassu.model.provider.FeedProvider; +import org.junit.Assert; +import org.junit.Test; + +public class OperatorFilterTest { + + @Test + public void testFilterNoFormFactorGiven() { + OperatorFilter filter = new OperatorFilter(null); + Assert.assertTrue(filter.matches(carRentingMockProvider())); + } + + @Test + public void testFilterMatchingFormFactorGiven() { + OperatorFilter filter = new OperatorFilter(List.of(FormFactor.CAR)); + Assert.assertTrue(filter.matches(carRentingMockProvider())); + } + + @Test + public void testFilterNotMatchingFormFactorGiven() { + OperatorFilter filter = new OperatorFilter(List.of(FormFactor.BICYCLE)); + Assert.assertFalse(filter.matches(carRentingMockProvider())); + } + + @Test + public void testFilterMatchingOneOfMultipleFormFactorsGiven() { + OperatorFilter filter = new OperatorFilter( + List.of(FormFactor.BICYCLE, FormFactor.CAR) + ); + Assert.assertTrue(filter.matches(carRentingMockProvider())); + } + + private FeedProvider carRentingMockProvider() { + var feedProvider = new FeedProvider(); + feedProvider.setSystemId("testsystem"); + feedProvider.setCodespace("TST"); + feedProvider.setLanguage("en"); + + GBFSVehicleType carVehicleType = new GBFSVehicleType(); + carVehicleType.setFormFactor(GBFSVehicleType.FormFactor.CAR); + feedProvider.setVehicleTypes(List.of(carVehicleType)); + return feedProvider; + } +}