tracks controller

This commit is contained in:
Kacper Donat 2018-09-29 14:29:41 +02:00
parent 184e230e70
commit 1788bacdfa
6 changed files with 87 additions and 6 deletions

View File

@ -39,7 +39,8 @@
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"files": ["./src/Functions/index.php"]
},
"autoload-dev": {
"psr-4": {

View File

@ -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

View 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
View 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
View File

@ -0,0 +1,3 @@
<?php
require_once __DIR__ . '/helpers.php';

View File

@ -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']));
}