UserService::listUsers()   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 25
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 17
dl 0
loc 25
c 0
b 0
f 0
rs 9.7
cc 3
nc 4
nop 2
1
<?php
2
3
4
namespace App\Project\Domain\User;
5
6
7
use App\Project\App\Support\FractalService;
8
use App\Project\Domain\User\Entity\User;
9
use App\Project\Infrastructure\User\UserRepository;
10
use Doctrine\ORM\EntityManagerInterface;
11
use Doctrine\ORM\EntityNotFoundException;
12
use League\Fractal\Pagination\PagerfantaPaginatorAdapter;
13
use League\Fractal\Resource\Collection;
14
use League\Fractal\Resource\Item;
15
use Pagerfanta\Adapter\DoctrineORMAdapter;
16
use Pagerfanta\Pagerfanta;
17
use Symfony\Component\HttpFoundation\Request;
18
use Symfony\Component\Routing\RouterInterface;
19
20
class UserService
21
{
22
23
24
    /**
25
     * @var EntityManagerInterface
26
     */
27
    private $entityManager;
28
    /**
29
     * @var FractalService
30
     */
31
    private $fractalService;
32
    /**
33
     * @var UserTransformer
34
     */
35
    private $userTransformer;
36
37
    public function __construct(
38
        EntityManagerInterface $entityManager,
39
        FractalService $fractalService,
40
        UserTransformer $userTransformer
41
    )
42
    {
43
44
        $this->entityManager = $entityManager;
45
        $this->fractalService = $fractalService;
46
        $this->userTransformer = $userTransformer;
47
    }
48
49
    public function listUsers(Request $request, RouterInterface $router)
50
    {
51
        $page = NULL !== $request->get('page') ? (int) $request->get('page') : 1;
52
        $perPage = NULL !== $request->get('per_page') ? (int) $request->get('per_page') : 10;
53
54
        $users = $this->entityManager->getRepository(User::class);
55
56
        $doctrineAdapter = new DoctrineORMAdapter($users->getUsers());
57
        $paginator = new Pagerfanta($doctrineAdapter);
58
        $paginator->setCurrentPage($page);
59
        $paginator->setMaxPerPage($perPage);
60
61
        $filteredResults = $paginator->getCurrentPageResults();
62
63
        $paginatorAdapter = new PagerfantaPaginatorAdapter($paginator, function(int $page) use ($request, $router) {
64
            $route = $request->attributes->get('_route');
65
            $inputParams = $request->attributes->get('_route_params');
66
            $newParams = array_merge($inputParams, $request->query->all());
67
            $newParams['page'] = $page;
68
            return $router->generate($route, $newParams, 0);
69
        });
70
71
        $resource = new Collection($filteredResults, $this->userTransformer, 'user');
72
        $resource->setPaginator($paginatorAdapter);
73
        return $resource;
74
    }
75
76
    public function getUserById($id)
77
    {
78
        $user = $this->entityManager->getRepository(User::class)->find($id);
79
80
        if (!$user) {
81
                    throw new EntityNotFoundException('user not found');
82
        }
83
84
        return new Item($user, $this->userTransformer, 'user');
85
86
    }
87
}