From 950e310096b0155e53d3cbb2dd9de1bb9a4c2f16 Mon Sep 17 00:00:00 2001
From: Kacper Donat <kadet1090@gmail.com>
Date: Sun, 16 Feb 2020 21:59:38 +0100
Subject: [PATCH] Move trip and operator repository to fluent pattern

---
 src/Controller/Api/v1/TripController.php      |  3 +-
 .../Database/GenericOperatorRepository.php    | 37 +++++++------------
 .../Database/GenericTripRepository.php        | 29 ++++++---------
 src/Provider/OperatorRepository.php           |  7 +---
 src/Provider/TripRepository.php               |  3 +-
 5 files changed, 30 insertions(+), 49 deletions(-)

diff --git a/src/Controller/Api/v1/TripController.php b/src/Controller/Api/v1/TripController.php
index 87b87cd..031f39a 100644
--- a/src/Controller/Api/v1/TripController.php
+++ b/src/Controller/Api/v1/TripController.php
@@ -4,6 +4,7 @@ namespace App\Controller\Api\v1;
 
 use App\Controller\Controller;
 use App\Model\Trip;
+use App\Modifier\IdFilter;
 use App\Provider\TripRepository;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\Routing\Annotation\Route;
@@ -18,7 +19,7 @@ class TripController extends Controller
      */
     public function one($id, TripRepository $repository)
     {
-        $trip = $repository->getById($id);
+        $trip = $repository->all(new IdFilter($id));
 
         return $this->json($trip, Response::HTTP_OK, [], $this->serializerContextFactory->create(Trip::class));
     }
diff --git a/src/Provider/Database/GenericOperatorRepository.php b/src/Provider/Database/GenericOperatorRepository.php
index 929d994..2af85f7 100644
--- a/src/Provider/Database/GenericOperatorRepository.php
+++ b/src/Provider/Database/GenericOperatorRepository.php
@@ -2,37 +2,26 @@
 
 namespace App\Provider\Database;
 
+use App\Entity\OperatorEntity;
 use App\Model\Operator;
+use App\Modifier\Modifier;
 use App\Provider\OperatorRepository;
 use Tightenco\Collect\Support\Collection;
 
 class GenericOperatorRepository extends DatabaseRepository implements OperatorRepository
 {
-    public function getAll(): Collection
+    public function all(Modifier ...$modifiers): Collection
     {
-        $repository = $this->em->getRepository(Operator::class);
-        $operators = $repository->findAll();
+        $builder = $this->em
+            ->createQueryBuilder()
+            ->from(OperatorEntity::class, 'operator')
+            ->select('operator')
+        ;
 
-        return collect($operators);
-    }
-
-    public function getById($id): ?Operator
-    {
-        $repository = $this->em->getRepository(Operator::class);
-
-        return $repository->find($id);
-    }
-
-    public function getManyById($ids): Collection
-    {
-        $repository = $this->em->getRepository(Operator::class);
-        $operators  = $repository->findBy(['id' => $ids]);
-
-        return collect($operators);
-    }
-
-    protected static function getHandlers()
-    {
-        return [];
+        return $this->allFromQueryBuilder($builder, $modifiers, [
+            'alias'  => 'operator',
+            'entity' => OperatorEntity::class,
+            'type'   => Operator::class,
+        ]);
     }
 }
diff --git a/src/Provider/Database/GenericTripRepository.php b/src/Provider/Database/GenericTripRepository.php
index 3944e18..00626ad 100644
--- a/src/Provider/Database/GenericTripRepository.php
+++ b/src/Provider/Database/GenericTripRepository.php
@@ -4,30 +4,25 @@ namespace App\Provider\Database;
 
 use App\Entity\TripEntity;
 use App\Model\Trip;
+use App\Modifier\Modifier;
 use App\Provider\TripRepository;
+use Tightenco\Collect\Support\Collection;
 
 class GenericTripRepository extends DatabaseRepository implements TripRepository
 {
-    public function getById(string $id): Trip
+    public function all(Modifier ...$modifiers): Collection
     {
-        $id   = $this->id->generate($this->provider, $id);
-
-        $trip = $this->em
+        $builder = $this->em
             ->createQueryBuilder()
-            ->from(TripEntity::class, 't')
-            ->join('t.stops', 'ts')
+            ->from(TripEntity::class, 'trip')
+            ->join('trip.stops', 'ts')
             ->join('ts.stop', 's')
-            ->select('t', 'ts')
-            ->where('t.id = :id')
-            ->getQuery()
-            ->setParameter('id', $id)
-            ->getOneOrNullResult();
+            ->select('t', 'ts');
 
-        return $this->convert($trip);
-    }
-
-    protected static function getHandlers()
-    {
-        return [];
+        return $this->allFromQueryBuilder($builder, $modifiers, [
+            'alias'  => 'operator',
+            'entity' => TripEntity::class,
+            'type'   => Trip::class,
+        ]);
     }
 }
diff --git a/src/Provider/OperatorRepository.php b/src/Provider/OperatorRepository.php
index 79f8b20..70d88c7 100644
--- a/src/Provider/OperatorRepository.php
+++ b/src/Provider/OperatorRepository.php
@@ -7,9 +7,6 @@ namespace App\Provider;
 use App\Model\Operator;
 use Tightenco\Collect\Support\Collection;
 
-interface OperatorRepository
+interface OperatorRepository extends FluentRepository
 {
-    public function getAll(): Collection;
-    public function getById($id): ?Operator;
-    public function getManyById($ids): Collection;
-}
\ No newline at end of file
+}
diff --git a/src/Provider/TripRepository.php b/src/Provider/TripRepository.php
index 4a82521..17459d8 100644
--- a/src/Provider/TripRepository.php
+++ b/src/Provider/TripRepository.php
@@ -4,7 +4,6 @@ namespace App\Provider;
 
 use App\Model\Trip;
 
-interface TripRepository
+interface TripRepository extends FluentRepository
 {
-    public function getById(string $id): Trip;
 }