diff --git a/composer.json b/composer.json index c101081..c6db7b4 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,8 @@ "autoload": { "psr-4": { "App\\": "src/" - } + }, + "files": ["./src/Functions/index.php"] }, "autoload-dev": { "psr-4": { diff --git a/config/services.yaml b/config/services.yaml index 78fc17e..e1787fc 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,Kernel.php}' + exclude: '../src/{DependencyInjection,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/src/Controller/Api/v1/TracksController.php b/src/Controller/Api/v1/TracksController.php new file mode 100644 index 0000000..e054679 --- /dev/null +++ b/src/Controller/Api/v1/TracksController.php @@ -0,0 +1,54 @@ +query->has('stop'): + return $this->byStop($request, $repository); + case $request->query->has('line'): + return $this->byLine($request, $repository); + case $request->query->has('id'): + return $this->byId($request, $repository); + default: + throw new BadRequestHttpException(sprintf('At least one parameter of %s must be set.', implode(', ', ['stop', 'line', 'id']))); + } + } + + private function byId(Request $request, TrackRepository $repository) + { + $id = encapsulate($request->query->get('id')); + + return $this->json($repository->getManyById($id)); + } + + private function byStop(Request $request, TrackRepository $repository) + { + $stop = encapsulate($request->query->get('stop')); + + return $this->json($repository->getByStop($stop)); + } + + private function byLine(Request $request, TrackRepository $repository) + { + $line = encapsulate($request->query->get('line')); + + return $this->json($repository->getByLine($line)); + } +} \ No newline at end of file diff --git a/src/Functions/helpers.php b/src/Functions/helpers.php new file mode 100644 index 0000000..46f1c7a --- /dev/null +++ b/src/Functions/helpers.php @@ -0,0 +1,15 @@ +em->createQueryBuilder() ->from(StopInTrack::class, 'st') ->join('st.track', 't') - ->where('st.stop = :stop') + ->where('st.stop in (:stop)') ->select(['st', 't']) ->getQuery() - ->execute(['stop' => $this->reference(StopEntity::class, $stop)]); + ->execute(['stop' => array_map($reference, $stop)]); return collect($tracks)->map(function (StopInTrack $entity) { return [ $this->convert($entity->getTrack()), $entity->getOrder() ]; @@ -47,14 +52,17 @@ class GenericTrackRepository extends DatabaseRepository implements TrackReposito public function getByLine($line): Collection { + $reference = f\apply(f\ref([$this, 'reference']), LineEntity::class); + $line = array_map([Stop::class, 'reference'], encapsulate($line)); + $tracks = $this->em->createQueryBuilder() ->from(StopInTrack::class, 'st') ->join('st.track', 't') ->join('t.stops', 's') - ->where('st.line = :line') + ->where('st.line in (:line)') ->select(['st', 't', 's']) ->getQuery() - ->execute(['stop' => $this->reference(LineEntity::class, $line)]); + ->execute(['stop' => array_map($reference, $line)]); return collect($tracks)->map(f\ref([$this, 'convert'])); }