tracks controller
This commit is contained in:
parent
184e230e70
commit
1788bacdfa
@ -39,7 +39,8 @@
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"App\\": "src/"
|
||||
}
|
||||
},
|
||||
"files": ["./src/Functions/index.php"]
|
||||
},
|
||||
"autoload-dev": {
|
||||
"psr-4": {
|
||||
|
@ -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
|
||||
|
54
src/Controller/Api/v1/TracksController.php
Normal file
54
src/Controller/Api/v1/TracksController.php
Normal file
@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controller\Api\v1;
|
||||
|
||||
use App\Controller\Controller;
|
||||
use App\Provider\TrackRepository;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
|
||||
use function App\Functions\encapsulate;
|
||||
|
||||
/**
|
||||
* @Route("/tracks")
|
||||
*/
|
||||
class TracksController extends Controller
|
||||
{
|
||||
/**
|
||||
* @Route("/")
|
||||
*/
|
||||
public function index(Request $request, TrackRepository $repository)
|
||||
{
|
||||
switch (true) {
|
||||
case $request->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));
|
||||
}
|
||||
}
|
15
src/Functions/helpers.php
Normal file
15
src/Functions/helpers.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace App\Functions;
|
||||
|
||||
function encapsulate($value)
|
||||
{
|
||||
switch (true) {
|
||||
case is_array($value):
|
||||
return $value;
|
||||
case is_iterable($value):
|
||||
return iterator_to_array($value);
|
||||
default:
|
||||
return [ $value ];
|
||||
}
|
||||
}
|
3
src/Functions/index.php
Normal file
3
src/Functions/index.php
Normal file
@ -0,0 +1,3 @@
|
||||
<?php
|
||||
|
||||
require_once __DIR__ . '/helpers.php';
|
@ -6,6 +6,8 @@ use App\Entity\LineEntity;
|
||||
use App\Entity\StopEntity;
|
||||
use App\Entity\StopInTrack;
|
||||
use App\Entity\TrackEntity;
|
||||
use function App\Functions\encapsulate;
|
||||
use App\Model\Stop;
|
||||
use App\Model\Track;
|
||||
use App\Provider\TrackRepository;
|
||||
use Tightenco\Collect\Support\Collection;
|
||||
@ -32,13 +34,16 @@ class GenericTrackRepository extends DatabaseRepository implements TrackReposito
|
||||
|
||||
public function getByStop($stop): Collection
|
||||
{
|
||||
$reference = f\apply(f\ref([$this, 'reference']), StopEntity::class);
|
||||
$stop = array_map([Stop::class, 'reference'], encapsulate($stop));
|
||||
|
||||
$tracks = $this->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']));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user