tracks controller
This commit is contained in:
parent
184e230e70
commit
1788bacdfa
@ -39,7 +39,8 @@
|
|||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"App\\": "src/"
|
"App\\": "src/"
|
||||||
}
|
},
|
||||||
|
"files": ["./src/Functions/index.php"]
|
||||||
},
|
},
|
||||||
"autoload-dev": {
|
"autoload-dev": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
|
@ -23,7 +23,7 @@ services:
|
|||||||
# this creates a service per class whose id is the fully-qualified class name
|
# this creates a service per class whose id is the fully-qualified class name
|
||||||
App\:
|
App\:
|
||||||
resource: '../src/*'
|
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
|
# controllers are imported separately to make sure services can be injected
|
||||||
# as action arguments even if you don't extend any base controller class
|
# 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\StopEntity;
|
||||||
use App\Entity\StopInTrack;
|
use App\Entity\StopInTrack;
|
||||||
use App\Entity\TrackEntity;
|
use App\Entity\TrackEntity;
|
||||||
|
use function App\Functions\encapsulate;
|
||||||
|
use App\Model\Stop;
|
||||||
use App\Model\Track;
|
use App\Model\Track;
|
||||||
use App\Provider\TrackRepository;
|
use App\Provider\TrackRepository;
|
||||||
use Tightenco\Collect\Support\Collection;
|
use Tightenco\Collect\Support\Collection;
|
||||||
@ -32,13 +34,16 @@ class GenericTrackRepository extends DatabaseRepository implements TrackReposito
|
|||||||
|
|
||||||
public function getByStop($stop): Collection
|
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()
|
$tracks = $this->em->createQueryBuilder()
|
||||||
->from(StopInTrack::class, 'st')
|
->from(StopInTrack::class, 'st')
|
||||||
->join('st.track', 't')
|
->join('st.track', 't')
|
||||||
->where('st.stop = :stop')
|
->where('st.stop in (:stop)')
|
||||||
->select(['st', 't'])
|
->select(['st', 't'])
|
||||||
->getQuery()
|
->getQuery()
|
||||||
->execute(['stop' => $this->reference(StopEntity::class, $stop)]);
|
->execute(['stop' => array_map($reference, $stop)]);
|
||||||
|
|
||||||
return collect($tracks)->map(function (StopInTrack $entity) {
|
return collect($tracks)->map(function (StopInTrack $entity) {
|
||||||
return [ $this->convert($entity->getTrack()), $entity->getOrder() ];
|
return [ $this->convert($entity->getTrack()), $entity->getOrder() ];
|
||||||
@ -47,14 +52,17 @@ class GenericTrackRepository extends DatabaseRepository implements TrackReposito
|
|||||||
|
|
||||||
public function getByLine($line): Collection
|
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()
|
$tracks = $this->em->createQueryBuilder()
|
||||||
->from(StopInTrack::class, 'st')
|
->from(StopInTrack::class, 'st')
|
||||||
->join('st.track', 't')
|
->join('st.track', 't')
|
||||||
->join('t.stops', 's')
|
->join('t.stops', 's')
|
||||||
->where('st.line = :line')
|
->where('st.line in (:line)')
|
||||||
->select(['st', 't', 's'])
|
->select(['st', 't', 's'])
|
||||||
->getQuery()
|
->getQuery()
|
||||||
->execute(['stop' => $this->reference(LineEntity::class, $line)]);
|
->execute(['stop' => array_map($reference, $line)]);
|
||||||
|
|
||||||
return collect($tracks)->map(f\ref([$this, 'convert']));
|
return collect($tracks)->map(f\ref([$this, 'convert']));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user