From d72fcf777f220d9a19ca217d84afab20c7789f4e Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Sun, 16 Feb 2020 21:07:16 +0100 Subject: [PATCH] #35 - Make StopRepository more fluent --- config/services.yaml | 2 +- resources/ts/components/picker.ts | 2 +- resources/ts/urls.ts | 6 +- .../Api/v1/DeparturesController.php | 5 +- src/Controller/Api/v1/StopsController.php | 51 +++++++---- src/Event/HandleDatabaseModifierEvent.php | 2 +- src/Event/HandleModifierEvent.php | 2 +- src/Event/PostProcessEvent.php | 27 ++++++ src/Exception/NonExistentServiceException.php | 5 +- src/Exception/NotSupportedException.php | 4 +- .../UnsupportedModifierException.php | 4 +- .../Database/FieldFilterDatabaseHandler.php | 52 +++++++++++ .../Database/IdFilterDatabaseHandler.php | 6 +- .../IncludeDestinationsDatabaseHandler.php | 76 ++++++++++++++++ .../Database/LimitDatabaseHandler.php | 6 +- src/{Handlers => Handler}/ModifierHandler.php | 2 +- src/Handler/PostProcessingHandler.php | 11 +++ src/Modifier/FieldFilter.php | 37 ++++++++ src/{Modifiers => Modifier}/IdFilter.php | 4 +- src/Modifier/IncludeDestinations.php | 7 ++ src/{Modifiers => Modifier}/Limit.php | 2 +- src/{Modifiers => Modifier}/Modifier.php | 2 +- src/Provider/Database/DatabaseRepository.php | 74 ++++++++++++--- .../Database/GenericLineRepository.php | 30 ++----- .../Database/GenericStopRepository.php | 89 ++++--------------- src/Provider/Dummy/DummyStopRepository.php | 11 +++ src/Provider/FluentRepository.php | 2 +- src/Provider/StopRepository.php | 6 +- .../ZtmGdanskDepartureRepository.php | 2 +- src/Service/IdUtils.php | 3 +- 30 files changed, 374 insertions(+), 158 deletions(-) create mode 100644 src/Event/PostProcessEvent.php create mode 100644 src/Handler/Database/FieldFilterDatabaseHandler.php rename src/{Handlers => Handler}/Database/IdFilterDatabaseHandler.php (91%) create mode 100644 src/Handler/Database/IncludeDestinationsDatabaseHandler.php rename src/{Handlers => Handler}/Database/LimitDatabaseHandler.php (85%) rename src/{Handlers => Handler}/ModifierHandler.php (84%) create mode 100644 src/Handler/PostProcessingHandler.php create mode 100644 src/Modifier/FieldFilter.php rename src/{Modifiers => Modifier}/IdFilter.php (91%) create mode 100644 src/Modifier/IncludeDestinations.php rename src/{Modifiers => Modifier}/Limit.php (95%) rename src/{Modifiers => Modifier}/Modifier.php (56%) diff --git a/config/services.yaml b/config/services.yaml index 853ef0a..4337891 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -23,7 +23,7 @@ services: # this creates a service per class whose id is the fully-qualified class name App\: resource: '../src/*' - exclude: '../src/{DependencyInjection,Entity,Model,Migrations,Tests,Functions,Kernel.php}' + exclude: '../src/{DependencyInjection,Exception,Modifiers,Entity,Model,Migrations,Tests,Functions,Kernel.php}' # controllers are imported separately to make sure services can be injected # as action arguments even if you don't extend any base controller class diff --git a/resources/ts/components/picker.ts b/resources/ts/components/picker.ts index 476d07a..93493d1 100644 --- a/resources/ts/components/picker.ts +++ b/resources/ts/components/picker.ts @@ -80,7 +80,7 @@ export class FinderComponent extends Vue { this.state = 'fetching'; - const response = await fetch(urls.prepare(urls.stops.grouped, { name: this.filter })); + const response = await fetch(urls.prepare(urls.stops.grouped, { name: this.filter, 'include-destinations': true })); if (response.ok) { this.found = (await response.json()).reduce((accumulator, { name, stops }) => Object.assign(accumulator, { [name]: stops }), {}); diff --git a/resources/ts/urls.ts b/resources/ts/urls.ts index e3bb5d1..106a0a1 100644 --- a/resources/ts/urls.ts +++ b/resources/ts/urls.ts @@ -8,7 +8,11 @@ export function query(params: UrlParams = { }) { function *simplify(name: string, param: any): IterableIterator { if (typeof param === 'string') { yield [ name, param ]; - } else if (typeof param === 'number') { + } else if (typeof param === 'boolean') { + if (param) { + yield [ name, '1' ]; + } + } else if (typeof param === 'number') { yield [ name, param.toString() ]; } else if (param instanceof Array) { for (let entry of param) { diff --git a/src/Controller/Api/v1/DeparturesController.php b/src/Controller/Api/v1/DeparturesController.php index 410a753..da07d63 100644 --- a/src/Controller/Api/v1/DeparturesController.php +++ b/src/Controller/Api/v1/DeparturesController.php @@ -5,6 +5,7 @@ namespace App\Controller\Api\v1; use App\Controller\Controller; use App\Model\Departure; +use App\Modifier\IdFilter; use App\Provider\DepartureRepository; use App\Provider\StopRepository; use App\Service\SerializerContextFactory; @@ -34,7 +35,7 @@ class DeparturesController extends Controller */ public function stop(DepartureRepository $departures, StopRepository $stops, $stop) { - $stop = $stops->getById($stop); + $stop = $stops->first(new IdFilter($stop)); return $this->json($departures->getForStop($stop)); } @@ -65,7 +66,7 @@ class DeparturesController extends Controller public function stops(DepartureRepository $departures, StopRepository $stops, Request $request) { $stops = $stops - ->getManyById($request->query->get('stop')) + ->all(new IdFilter($request->query->get('stop'))) ->flatMap(ref([ $departures, 'getForStop' ])) ->sortBy(property('departure')); diff --git a/src/Controller/Api/v1/StopsController.php b/src/Controller/Api/v1/StopsController.php index 76c19a1..0fca3e4 100644 --- a/src/Controller/Api/v1/StopsController.php +++ b/src/Controller/Api/v1/StopsController.php @@ -7,6 +7,9 @@ use App\Controller\Controller; use App\Model\Stop; use App\Model\Track; use App\Model\StopGroup; +use App\Modifier\IdFilter; +use App\Modifier\FieldFilter; +use App\Modifier\IncludeDestinations; use App\Provider\StopRepository; use App\Provider\TrackRepository; use App\Service\Proxy\ReferenceFactory; @@ -46,16 +49,9 @@ class StopsController extends Controller */ public function index(Request $request, StopRepository $stops) { - switch (true) { - case $request->query->has('id'): - $result = $stops->getManyById($request->query->get('id')); - break; + $modifiers = $this->getModifiersFromRequest($request); - default: - $result = $stops->getAll(); - } - - return $this->json($result->all()); + return $this->json($stops->all(...$modifiers)->toArray()); } /** @@ -76,16 +72,9 @@ class StopsController extends Controller */ public function groups(Request $request, StopRepository $stops) { - switch (true) { - case $request->query->has('name'): - $result = $stops->findByName($request->query->get('name')); - break; + $modifiers = $this->getModifiersFromRequest($request); - default: - $result = $stops->getAll(); - } - - return $this->json(static::group($result)->all()); + return $this->json(static::group($stops->all(...$modifiers))->toArray()); } /** @@ -106,7 +95,7 @@ class StopsController extends Controller */ public function one(Request $request, StopRepository $stops, $id) { - return $this->json($stops->getById($id)); + return $this->json($stops->first(new IdFilter($id), new IncludeDestinations())); } /** @@ -145,4 +134,28 @@ class StopsController extends Controller return $group; })->values(); } + + /** + * @param Request $request + * + * @return array + */ + private function getModifiersFromRequest(Request $request): array + { + $modifiers = []; + + if ($request->query->has('name')) { + $modifiers[] = FieldFilter::contains('name', $request->query->get('name')); + } + + if ($request->query->has('id')) { + $modifiers[] = new IdFilter($request->query->get('id')); + } + + if ($request->query->has('include-destinations')) { + $modifiers[] = new IncludeDestinations(); + } + + return $modifiers; + } } diff --git a/src/Event/HandleDatabaseModifierEvent.php b/src/Event/HandleDatabaseModifierEvent.php index 74bbc81..c548d59 100644 --- a/src/Event/HandleDatabaseModifierEvent.php +++ b/src/Event/HandleDatabaseModifierEvent.php @@ -3,7 +3,7 @@ namespace App\Event; use App\Event\HandleModifierEvent; -use App\Modifiers\Modifier; +use App\Modifier\Modifier; use App\Provider\Repository; use Doctrine\ORM\QueryBuilder; diff --git a/src/Event/HandleModifierEvent.php b/src/Event/HandleModifierEvent.php index af28988..5544af4 100644 --- a/src/Event/HandleModifierEvent.php +++ b/src/Event/HandleModifierEvent.php @@ -2,7 +2,7 @@ namespace App\Event; -use App\Modifiers\Modifier; +use App\Modifier\Modifier; use App\Provider\Repository; class HandleModifierEvent diff --git a/src/Event/PostProcessEvent.php b/src/Event/PostProcessEvent.php new file mode 100644 index 0000000..5d23040 --- /dev/null +++ b/src/Event/PostProcessEvent.php @@ -0,0 +1,27 @@ +data = $data; + } + + public function getData() + { + return $this->data; + } + + public function setData($data): void + { + $this->data = $data; + } +} diff --git a/src/Exception/NonExistentServiceException.php b/src/Exception/NonExistentServiceException.php index c2c6ba3..b19aef2 100644 --- a/src/Exception/NonExistentServiceException.php +++ b/src/Exception/NonExistentServiceException.php @@ -4,7 +4,6 @@ namespace App\Exception; -class NonExistentServiceException extends \Exception +class NonExistentServiceException extends \LogicException { - -} \ No newline at end of file +} diff --git a/src/Exception/NotSupportedException.php b/src/Exception/NotSupportedException.php index 4ab7b89..1af7250 100644 --- a/src/Exception/NotSupportedException.php +++ b/src/Exception/NotSupportedException.php @@ -2,6 +2,6 @@ namespace App\Exception; -class NotSupportedException extends \RuntimeException +class NotSupportedException extends \LogicException { -} \ No newline at end of file +} diff --git a/src/Exception/UnsupportedModifierException.php b/src/Exception/UnsupportedModifierException.php index 4dbd2bf..f1e7145 100644 --- a/src/Exception/UnsupportedModifierException.php +++ b/src/Exception/UnsupportedModifierException.php @@ -2,10 +2,10 @@ namespace App\Exception; -use App\Modifiers\Modifier; +use App\Modifier\Modifier; use App\Provider\Repository; -class UnsupportedModifierException extends \Exception +class UnsupportedModifierException extends \LogicException { public static function createFromModifier(Modifier $modifier, Repository $repository) { diff --git a/src/Handler/Database/FieldFilterDatabaseHandler.php b/src/Handler/Database/FieldFilterDatabaseHandler.php new file mode 100644 index 0000000..cb77a66 --- /dev/null +++ b/src/Handler/Database/FieldFilterDatabaseHandler.php @@ -0,0 +1,52 @@ + [ + 'name' => 'name', + ], + ]; + + public function process(HandleModifierEvent $event) + { + if (!$event instanceof HandleDatabaseModifierEvent) { + return; + } + + /** @var FieldFilter $modifier */ + $modifier = $event->getModifier(); + $builder = $event->getBuilder(); + $alias = $event->getMeta()['alias']; + + $field = $this->mapFieldName($event->getMeta()['type'], $modifier->getField()); + $operator = $modifier->getOperator(); + $value = $modifier->getValue(); + + $parameter = sprintf(":%s_%s", $alias, $field); + + $builder + ->where(sprintf("%s.%s %s %s", $alias, $field, $operator, $parameter)) + ->setParameter($parameter, $value) + ; + } + + protected function mapFieldName(string $class, string $field) + { + if (!isset($this->mapping[$class][$field])) { + throw new \InvalidArgumentException( + sprintf("Unable to map field %s of %s into entity field.", $field, $class) + ); + } + + return $this->mapping[$class][$field]; + } +} diff --git a/src/Handlers/Database/IdFilterDatabaseHandler.php b/src/Handler/Database/IdFilterDatabaseHandler.php similarity index 91% rename from src/Handlers/Database/IdFilterDatabaseHandler.php rename to src/Handler/Database/IdFilterDatabaseHandler.php index 58a89db..10f124c 100644 --- a/src/Handlers/Database/IdFilterDatabaseHandler.php +++ b/src/Handler/Database/IdFilterDatabaseHandler.php @@ -1,9 +1,9 @@ em = $entityManager; + $this->converter = $converter; + $this->id = $id; + } + + public function process(PostProcessEvent $event) + { + $provider = $event->getMeta()['provider']; + $stops = $event + ->getData() + ->map(t\property('id')) + ->map(f\apply([$this->id, 'generate'], $provider)) + ->all(); + + $destinations = collect($this->em->createQueryBuilder() + ->select('t', 'tl', 'f', 'fs', 'ts') + ->from(TrackEntity::class, 't') + ->join('t.stopsInTrack', 'ts') + ->join('t.line', 'tl') + ->where('ts.stop IN (:stops)') + ->join('t.final', 'f') + ->join('f.stop', 'fs') + ->getQuery() + ->execute(['stops' => $stops])) + ->reduce(function ($grouped, TrackEntity $track) { + foreach ($track->getStopsInTrack()->map(t\property('stop'))->map(t\property('id')) as $stop) { + $grouped[$stop] = ($grouped[$stop] ?? collect())->add($track); + } + + return $grouped; + }, collect()) + ->map(function (Collection $tracks) { + return $tracks + ->groupBy(function (TrackEntity $track) { + return $track->getFinal()->getStop()->getId(); + })->map(function (Collection $tracks, $id) { + return Destination::createFromArray([ + 'stop' => $this->converter->convert($tracks->first()->getFinal()->getStop()), + 'lines' => $tracks + ->map(t\property('line')) + ->unique(t\property('id')) + ->map(f\ref([$this->converter, 'convert'])) + ->values(), + ]); + })->values(); + }); + + $event->getData()->each(function (Stop $stop) use ($provider, $destinations) { + $stop->setDestinations($destinations[$this->id->generate($provider, $stop->getId())]); + }); + } +} diff --git a/src/Handlers/Database/LimitDatabaseHandler.php b/src/Handler/Database/LimitDatabaseHandler.php similarity index 85% rename from src/Handlers/Database/LimitDatabaseHandler.php rename to src/Handler/Database/LimitDatabaseHandler.php index 202ddce..3f445a9 100644 --- a/src/Handlers/Database/LimitDatabaseHandler.php +++ b/src/Handler/Database/LimitDatabaseHandler.php @@ -1,11 +1,11 @@ field = $field; + $this->value = $value; + $this->operator = $operator; + } + + public static function contains(string $field, string $value) + { + return new static($field, "%$value%", 'LIKE'); + } + + public function getField(): string + { + return $this->field; + } + + public function getValue() + { + return $this->value; + } + + public function getOperator(): string + { + return $this->operator; + } +} diff --git a/src/Modifiers/IdFilter.php b/src/Modifier/IdFilter.php similarity index 91% rename from src/Modifiers/IdFilter.php rename to src/Modifier/IdFilter.php index e2f570c..f7b6a13 100644 --- a/src/Modifiers/IdFilter.php +++ b/src/Modifier/IdFilter.php @@ -1,9 +1,9 @@ $this->provider, - ], $meta)); + $handler = $this->getHandler($modifier); - $class = get_class($modifier); + switch (true) { + case $handler instanceof PostProcessingHandler: + $reducers[] = function ($result) use ($meta, $modifier, $handler) { + $event = new PostProcessEvent($result, $modifier, $this, array_merge([ + 'provider' => $this->provider, + ], $meta)); - if (!$this->handlers->has($class)) { - throw UnsupportedModifierException::createFromModifier($modifier, $this); + $handler->process($event); + + return $event->getData(); + }; + break; + + default: + $event = new HandleDatabaseModifierEvent($modifier, $this, $builder, array_merge([ + 'provider' => $this->provider, + ], $meta)); + + $handler->process($event); + break; } - - $handler = $this->handlers->get($class); - - $handler->process($event); } + + return collect($reducers); + } + + protected function allFromQueryBuilder(QueryBuilder $builder, iterable $modifiers, array $meta = []) + { + $reducers = $this->processQueryBuilder($builder, $modifiers, $meta); + + return $reducers->reduce(function ($result, $reducer) { + return $reducer($result); + }, collect($builder->getQuery()->execute())->map(\Closure::fromCallable([$this, 'convert']))); + } + + public function first(Modifier ...$modifiers) + { + return $this->all(Limit::count(1), ...$modifiers)->first(); + } + + protected function getHandler(Modifier $modifier) + { + $class = get_class($modifier); + + if (!$this->handlers->has($class)) { + throw UnsupportedModifierException::createFromModifier($modifier, $this); + } + + return $this->handlers->get($class); } /** @@ -106,6 +154,10 @@ abstract class DatabaseRepository implements ServiceSubscriberInterface, Reposit */ public static function getSubscribedServices() { - return static::getHandlers(); + return array_merge([ + IdFilter::class => IdFilterDatabaseHandler::class, + Limit::class => LimitDatabaseHandler::class, + FieldFilter::class => FieldFilterDatabaseHandler::class, + ], static::getHandlers()); } } diff --git a/src/Provider/Database/GenericLineRepository.php b/src/Provider/Database/GenericLineRepository.php index 244b8e0..9ca147d 100644 --- a/src/Provider/Database/GenericLineRepository.php +++ b/src/Provider/Database/GenericLineRepository.php @@ -4,24 +4,19 @@ namespace App\Provider\Database; use App\Entity\LineEntity; use App\Event\HandleDatabaseModifierEvent; -use App\Handlers\Database\LimitDatabaseHandler; -use App\Handlers\Database\IdFilterDatabaseHandler; -use App\Handlers\ModifierHandler; +use App\Handler\Database\LimitDatabaseHandler; +use App\Handler\Database\IdFilterDatabaseHandler; +use App\Handler\ModifierHandler; use App\Model\Line; -use App\Modifiers\Limit; -use App\Modifiers\IdFilter; +use App\Modifier\Limit; +use App\Modifier\IdFilter; use App\Provider\LineRepository; -use App\Modifiers\Modifier; +use App\Modifier\Modifier; use Tightenco\Collect\Support\Collection; use Kadet\Functional as f; class GenericLineRepository extends DatabaseRepository implements LineRepository { - public function first(Modifier ...$modifiers) - { - return $this->all(Limit::count(1), ...$modifiers)->first(); - } - public function all(Modifier ...$modifiers): Collection { $builder = $this->em @@ -30,21 +25,10 @@ class GenericLineRepository extends DatabaseRepository implements LineRepository ->select('line') ; - $this->processQueryBuilder($builder, $modifiers, [ + return $this->allFromQueryBuilder($builder, $modifiers, [ 'alias' => 'line', 'entity' => LineEntity::class, 'type' => Line::class, ]); - - return collect($builder->getQuery()->execute())->map(f\ref([$this, 'convert'])); - } - - /** @return ModifierHandler[] */ - protected static function getHandlers() - { - return [ - IdFilter::class => IdFilterDatabaseHandler::class, - Limit::class => LimitDatabaseHandler::class, - ]; } } diff --git a/src/Provider/Database/GenericStopRepository.php b/src/Provider/Database/GenericStopRepository.php index fe7b017..62a7a90 100644 --- a/src/Provider/Database/GenericStopRepository.php +++ b/src/Provider/Database/GenericStopRepository.php @@ -3,89 +3,34 @@ namespace App\Provider\Database; use App\Entity\StopEntity; -use App\Entity\TrackEntity; -use App\Model\Destination; +use App\Handler\Database\IncludeDestinationsDatabaseHandler; use App\Model\Stop; +use App\Modifier\Modifier; +use App\Modifier\IncludeDestinations; use App\Provider\StopRepository; -use Kadet\Functional as f; -use Kadet\Functional\Transforms as t; use Tightenco\Collect\Support\Collection; class GenericStopRepository extends DatabaseRepository implements StopRepository { - public function getAll(): Collection + public function all(Modifier ...$modifiers): Collection { - $stops = $this->em->getRepository(StopEntity::class)->findAll(); + $builder = $this->em + ->createQueryBuilder() + ->from(StopEntity::class, 'stop') + ->select('stop') + ; - return collect($stops)->map(f\ref([$this, 'convert'])); - } - - public function getById($id): ?Stop - { - $id = $this->id->generate($this->provider, $id); - $stop = $this->em->getRepository(StopEntity::class)->find($id); - - return $this->convert($stop); - } - - public function getManyById($ids): Collection - { - $ids = collect($ids)->map(f\apply(f\ref([$this->id, 'generate']), $this->provider)); - $stops = $this->em->getRepository(StopEntity::class)->findBy(['id' => $ids->all()]); - - return collect($stops)->map(f\ref([$this, 'convert'])); - } - - public function findByName(string $name): Collection - { - $query = $this->em->createQueryBuilder() - ->select('s') - ->from(StopEntity::class, 's') - ->where('s.name LIKE :name') - ->getQuery(); - - $stops = collect($query->execute([':name' => "%$name%"])); - - $destinations = collect($this->em->createQueryBuilder() - ->select('t', 'tl', 'f', 'fs', 'ts') - ->from(TrackEntity::class, 't') - ->join('t.stopsInTrack', 'ts') - ->join('t.line', 'tl') - ->where('ts.stop IN (:stops)') - ->join('t.final', 'f') - ->join('f.stop', 'fs') - ->getQuery() - ->execute(['stops' => $stops->map(t\property('id'))->all()])) - ->reduce(function ($grouped, TrackEntity $track) { - foreach ($track->getStopsInTrack()->map(t\property('stop'))->map(t\property('id')) as $stop) { - $grouped[$stop] = ($grouped[$stop] ?? collect())->add($track); - } - - return $grouped; - }, collect()) - ->map(function (Collection $tracks) { - return $tracks - ->groupBy(function (TrackEntity $track) { - return $track->getFinal()->getStop()->getId(); - })->map(function (Collection $tracks, $id) { - return Destination::createFromArray([ - 'stop' => $this->convert($tracks->first()->getFinal()->getStop()), - 'lines' => $tracks - ->map(t\property('line')) - ->unique(t\property('id')) - ->map(f\ref([$this, 'convert'])) - ->values(), - ]); - })->values(); - }); - - return collect($stops)->map(f\ref([$this, 'convert']))->each(function (Stop $stop) use ($destinations) { - $stop->setDestinations($destinations[$this->id->generate($this->provider, $stop->getId())]); - }); + return $this->allFromQueryBuilder($builder, $modifiers, [ + 'alias' => 'stop', + 'entity' => StopEntity::class, + 'type' => Stop::class, + ]); } protected static function getHandlers() { - return []; + return array_merge(parent::getHandlers(), [ + IncludeDestinations::class => IncludeDestinationsDatabaseHandler::class, + ]); } } diff --git a/src/Provider/Dummy/DummyStopRepository.php b/src/Provider/Dummy/DummyStopRepository.php index caea318..959d5bd 100644 --- a/src/Provider/Dummy/DummyStopRepository.php +++ b/src/Provider/Dummy/DummyStopRepository.php @@ -3,6 +3,7 @@ namespace App\Provider\Dummy; use App\Model\Stop; +use App\Modifier\Modifier; use App\Provider\StopRepository; use App\Service\Proxy\ReferenceFactory; use Tightenco\Collect\Support\Collection; @@ -41,4 +42,14 @@ class DummyStopRepository implements StopRepository { return collect(); } + + public function first(Modifier ...$modifiers) + { + // TODO: Implement first() method. + } + + public function all(Modifier ...$modifiers): Collection + { + // TODO: Implement all() method. + } } diff --git a/src/Provider/FluentRepository.php b/src/Provider/FluentRepository.php index d0644fe..a02831c 100644 --- a/src/Provider/FluentRepository.php +++ b/src/Provider/FluentRepository.php @@ -2,7 +2,7 @@ namespace App\Provider; -use App\Modifiers\Modifier; +use App\Modifier\Modifier; use Tightenco\Collect\Support\Collection; interface FluentRepository extends Repository diff --git a/src/Provider/StopRepository.php b/src/Provider/StopRepository.php index ea87c03..bf6aa3f 100644 --- a/src/Provider/StopRepository.php +++ b/src/Provider/StopRepository.php @@ -7,10 +7,6 @@ namespace App\Provider; use App\Model\Stop; use Tightenco\Collect\Support\Collection; -interface StopRepository extends Repository +interface StopRepository extends FluentRepository { - public function getAll(): Collection; - public function getById($id): ?Stop; - public function getManyById($ids): Collection; - public function findByName(string $name): Collection; } diff --git a/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php b/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php index 165e571..e7f7dc6 100644 --- a/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php +++ b/src/Provider/ZtmGdansk/ZtmGdanskDepartureRepository.php @@ -6,7 +6,7 @@ use App\Model\Departure; use App\Model\Line; use App\Model\Stop; use App\Model\Vehicle; -use App\Modifiers\IdFilter; +use App\Modifier\IdFilter; use App\Provider\Database\GenericScheduleRepository; use App\Provider\DepartureRepository; use App\Provider\LineRepository; diff --git a/src/Service/IdUtils.php b/src/Service/IdUtils.php index 61bc00b..e652ad4 100644 --- a/src/Service/IdUtils.php +++ b/src/Service/IdUtils.php @@ -11,6 +11,7 @@ class IdUtils public function generate(ProviderEntity $provider, $id) { + // todo: use array cache if not fast enough return sprintf('%s%s%s', $provider->getId(), self::DELIMITER, $id); } @@ -23,4 +24,4 @@ class IdUtils { return $this->strip($entity->getId()); } -} \ No newline at end of file +}