ArticleService::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 10
c 0
b 0
f 0
rs 10
cc 1
nc 1
nop 3
1
<?php
2
3
namespace App\Project\Domain\Article;
4
5
use App\Project\App\Support\FractalService;
6
use App\Project\Domain\Article\Entity\Article;
7
use App\Project\Domain\User\Entity\User;
8
use Doctrine\Common\Collections\ArrayCollection;
9
use Doctrine\ORM\EntityManagerInterface;
10
use Doctrine\ORM\EntityNotFoundException;
11
use League\Fractal\Pagination\PagerfantaPaginatorAdapter;
12
use League\Fractal\Resource\Collection;
13
use League\Fractal\Resource\Item;
14
use Pagerfanta\Adapter\DoctrineORMAdapter;
15
use Pagerfanta\Pagerfanta;
16
use Symfony\Component\HttpFoundation\Request;
17
use Symfony\Component\Routing\RouterInterface;
18
19
class ArticleService
20
{
21
22
    /**
23
     * @var EntityManagerInterface
24
     */
25
    private $entityManager;
26
27
    /**
28
     * @var ArticleTransformer
29
     */
30
    private $articleTransformer;
31
    /**
32
     * @var RouterInterface
33
     */
34
    private $router;
0 ignored issues
show
introduced by
The private property $router is not used, and could be removed.
Loading history...
35
    /**
36
     * @var FractalService
37
     */
38
    private $fractalService;
39
40
    public function __construct(
41
        EntityManagerInterface $entityManager,
42
        ArticleTransformer $articleTransformer,
43
        FractalService $fractalService
44
    )
45
    {
46
47
        $this->entityManager = $entityManager;
48
        $this->articleTransformer = $articleTransformer;
49
        $this->fractalService = $fractalService;
50
    }
51
52
    /**
53
     * @param Request $request
54
     * @param RouterInterface $router
55
     * @return Collection|Item
56
     */
57
    public function getArticles(Request $request, RouterInterface $router)
58
    {
59
        $page = NULL !== $request->get('page') ? (int) $request->get('page') : 1;
60
        $perPage = NULL !== $request->get('per_page') ? (int) $request->get('per_page') : 10;
61
62
        $articles = $this->entityManager->getRepository(Article::class);
63
64
        $doctrineAdapter = new DoctrineORMAdapter($articles->getArticles());
65
        $paginator = new Pagerfanta($doctrineAdapter);
66
        $paginator->setCurrentPage($page);
67
        $paginator->setMaxPerPage($perPage);
68
69
        $filteredResults = $paginator->getCurrentPageResults();
70
71
        $paginatorAdapter = new PagerfantaPaginatorAdapter($paginator, function(int $page) use ($request, $router) {
72
            $route = $request->attributes->get('_route');
73
            $inputParams = $request->attributes->get('_route_params');
74
            $newParams = array_merge($inputParams, $request->query->all());
75
            $newParams['page'] = $page;
76
            return $router->generate($route, $newParams, 0);
77
        });
78
79
        $resource = new Collection($filteredResults, $this->articleTransformer, 'article');
80
        $resource->setPaginator($paginatorAdapter);
81
        return $resource;
82
    }
83
84
    /**
85
     * @param $id
86
     * @return Item
87
     * @throws EntityNotFoundException
88
     */
89
    public function getArticleById($id)
90
    {
91
        $article = $this->entityManager->getRepository(Article::class)->find($id);
92
93
        if ($article) {
94
                    return new Item($article, $this->articleTransformer, 'article');
95
        }
96
97
        throw new EntityNotFoundException("Article not found");
98
    }
99
100
    /**
101
     * @param Request $request
102
     */
103
    public function addArticle(Request $request)
104
    {
105
        var_dump($request);
0 ignored issues
show
Security Debugging Code introduced by
var_dump($request) looks like debug code. Are you sure you do not want to remove it?
Loading history...
106
107
        /** @var User $user */
108
        $user = $this->entityManager->getReference(User::class, $request->request->get('user'));
109
110
        $article = new Article();
111
        $article->setTitle($request->request->get('title'));
112
        $article->setBody($request->request->get('body'));
113
        $article->setAuthor($user);
114
        $article->setContributors(new ArrayCollection([$user]));
115
116
        //set tags
117
        if (is_array($request->request->get('tags'))) {
118
            foreach ($request->request->get('tags') as $tag) {
119
                $article->addTagFromName($tag);
120
            }
121
        }
122
123
        $this->entityManager->getRepository(Article::class)->save($article);
124
125
    }
126
127
128
    public function searchArticle(Request $request)
129
    {
130
        $resource = $this->entityManager->getRepository(Article::class)->searchArticle($request);
131
132
        $collection = new Collection($resource, $this->articleTransformer, 'article');
133
134
        return $this->fractalService->transform($collection);
135
    }
136
}