Passed
Push — develop ( 5e1cbc...3bd182 )
by BENARD
03:40
created

GetHome   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 3
eloc 34
dl 0
loc 57
rs 10
c 1
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A __invoke() 0 42 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ProjetNormandie\ForumBundle\Controller;
6
7
use Doctrine\DBAL\Exception;
8
use Doctrine\ORM\EntityManagerInterface;
9
use ProjetNormandie\ForumBundle\Handler\UserDataInitHandler;
10
use ProjetNormandie\ForumBundle\ValueObject\ForumStatus;
11
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
12
13
class GetHome extends AbstractController
14
{
15
    private UserDataInitHandler $userDataInitHandler;
16
    private EntityManagerInterface $em;
17
18
    public function __construct(UserDataInitHandler $userDataInitHandler, EntityManagerInterface $em)
19
    {
20
        $this->userDataInitHandler = $userDataInitHandler;
21
        $this->em = $em;
22
    }
23
24
    /**
25
     * @return mixed
26
     * @throws Exception
27
     */
28
    public function __invoke(): mixed
29
    {
30
        $this->userDataInitHandler->process($this->getUser());
31
32
        $queryBuilder = $this->em->createQueryBuilder()
33
            ->from('ProjetNormandie\ForumBundle\Entity\Category', 'c')
34
            ->select('c')
35
            ->join('c.forums', 'f')
36
            ->join('f.lastMessage', 'm')
37
            ->join('m.user', 'u')
38
            ->addSelect('f')
39
            ->addSelect('m')
40
            ->addSelect('u');
41
42
43
        if ($this->getUser() !== null) {
44
            $queryBuilder
45
                ->join('f.forumUser', 'fu', 'WITH', 'fu.user = :user')
46
                ->addSelect('fu')
47
                ->where(
48
                    $queryBuilder->expr()->orX(
49
                        'f.status = :status1',
50
                        '(f.status = :status2) AND (f.role IN (:roles))'
51
                    )
52
                )
53
                ->setParameter('status1', ForumStatus::PUBLIC)
54
                ->setParameter('status2', ForumStatus::PRIVATE)
55
                ->setParameter('user', $this->getUser())
56
                ->setParameter('roles', $this->getUser() ->getRoles());
57
        } else {
58
            $queryBuilder->where('f.status = :status')
59
                ->setParameter('status', ForumStatus::PUBLIC);
60
        }
61
62
        $queryBuilder->andWhere('c.id NOT IN (8,9)');
63
64
65
        $queryBuilder->orderBy('c.position', 'ASC')
66
            ->addOrderBy('f.position', 'ASC');
67
68
69
        return $queryBuilder->getQuery()->getResult();
70
    }
71
}
72