MessageRepository   A
last analyzed

Complexity

Total Complexity 17

Size/Duplication

Total Lines 155
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 17
eloc 96
c 3
b 0
f 0
dl 0
loc 155
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A getSenders() 0 12 1
A __construct() 0 3 1
A getNbNewMessage() 0 12 1
A getRecipients() 0 12 1
A purge() 0 20 1
B getOutboxMessages() 0 41 6
B getInboxMessages() 0 41 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ProjetNormandie\MessageBundle\Repository;
6
7
use DateInterval;
8
use DateTime;
9
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
10
use Doctrine\ORM\NonUniqueResultException;
11
use Doctrine\ORM\NoResultException;
12
use Doctrine\Persistence\ManagerRegistry;
13
use ProjetNormandie\MessageBundle\Entity\Message;
14
15
class MessageRepository  extends ServiceEntityRepository
16
{
17
    public function __construct(ManagerRegistry $registry)
18
    {
19
        parent::__construct($registry, Message::class);
20
    }
21
22
    public function purge(): void
23
    {
24
        //----- delete 1
25
        $query = $this->_em->createQuery(
0 ignored issues
show
Bug Best Practice introduced by
The property _em does not exist on ProjetNormandie\MessageB...itory\MessageRepository. Did you maybe forget to declare it?
Loading history...
26
            'DELETE projetNormandie\MessageBundle\Entity\Message m 
27
            WHERE m.isDeletedSender = :isDeletedSender
28
            AND m.isDeletedRecipient = :isDeletedRecipient'
29
        );
30
        $query->setParameter('isDeletedSender', true);
31
        $query->setParameter('isDeletedRecipient', true);
32
        $query->execute();
33
34
        //----- delete 2
35
        $date = new DateTime();
36
        $date = $date->sub(DateInterval::createFromDateString('2 years'));
37
        $query = $this->_em->createQuery(
38
            'DELETE projetNormandie\MessageBundle\Entity\Message m WHERE m.createdAt < :date'
39
        );
40
        $query->setParameter('date', $date->format('Y-m-d'));
41
        $query->execute();
42
    }
43
44
    public function getRecipients($user)
45
    {
46
        $query = $this->createQueryBuilder('m')
47
            ->join('m.recipient', 'u')
48
            ->select('DISTINCT u.id,u.username')
49
            ->where('m.sender = :user')
50
            ->setParameter('user', $user)
51
            ->andWhere('m.isDeletedSender = :isDeletedSender')
52
            ->setParameter('isDeletedSender', false)
53
            ->orderBy("u.username", 'ASC');
54
55
        return $query->getQuery()->getResult();
56
    }
57
58
    public function getSenders($user)
59
    {
60
        $query = $this->createQueryBuilder('m')
61
            ->join('m.sender', 'u')
62
            ->select('DISTINCT u.id,u.username')
63
            ->where('m.recipient = :user')
64
            ->setParameter('user', $user)
65
            ->andWhere('m.isDeletedRecipient = :isDeletedRecipient')
66
            ->setParameter('isDeletedRecipient', false)
67
            ->orderBy("u.username", 'ASC');
68
69
        return $query->getQuery()->getResult();
70
    }
71
72
    public function getNbNewMessage($user)
73
    {
74
        $qb = $this->createQueryBuilder('m')
75
            ->select('COUNT(m.id)')
76
            ->where('m.recipient = :recipient')
77
            ->andWhere('m.isOpened = :isOpened')
78
            ->andWhere('m.isDeletedRecipient = :isDeletedRecipient')
79
            ->setParameter('recipient', $user)
80
            ->setParameter('isOpened', false)
81
            ->setParameter('isDeletedRecipient', false);
82
83
        return (int) $qb->getQuery()->getSingleScalarResult();
84
    }
85
86
    public function getInboxMessages($user, array $filters = [])
87
    {
88
        $qb = $this->createQueryBuilder('m')
89
            ->leftJoin('m.sender', 's')
90
            ->leftJoin('m.recipient', 'r')
91
            ->where('m.recipient = :user')
92
            ->andWhere('m.isDeletedRecipient = :isDeletedRecipient')
93
            ->setParameter('user', $user)
94
            ->setParameter('isDeletedRecipient', false)
95
            ->orderBy('m.id', 'DESC');
96
97
        // Recherche globale
98
        if (isset($filters['search']) && !empty($filters['search'])) {
99
            $searchTerm = '%' . $filters['search'] . '%';
100
            $qb->andWhere(
101
                $qb->expr()->orX(
102
                    $qb->expr()->like('m.object', ':search'),
103
                    $qb->expr()->like('m.message', ':search'),
104
                    $qb->expr()->like('s.username', ':search'),
105
                    $qb->expr()->like('r.username', ':search')
106
                )
107
            )->setParameter('search', $searchTerm);
108
        }
109
110
        // Appliquer les autres filtres
111
        if (isset($filters['type'])) {
112
            $qb->andWhere('m.type = :type')
113
                ->setParameter('type', $filters['type']);
114
        }
115
116
        if (isset($filters['sender'])) {
117
            $qb->andWhere('m.sender = :sender')
118
                ->setParameter('sender', $filters['sender']);
119
        }
120
121
        if (isset($filters['isOpened'])) {
122
            $qb->andWhere('m.isOpened = :isOpened')
123
                ->setParameter('isOpened', $filters['isOpened']);
124
        }
125
126
        return $qb;
127
    }
128
129
    public function getOutboxMessages($user, array $filters = [])
130
    {
131
        $qb = $this->createQueryBuilder('m')
132
            ->leftJoin('m.sender', 's')
133
            ->leftJoin('m.recipient', 'r')
134
            ->where('m.sender = :user')
135
            ->andWhere('m.isDeletedSender = :isDeletedSender')
136
            ->setParameter('user', $user)
137
            ->setParameter('isDeletedSender', false)
138
            ->orderBy('m.id', 'DESC');
139
140
        // Recherche globale
141
        if (isset($filters['search']) && !empty($filters['search'])) {
142
            $searchTerm = '%' . $filters['search'] . '%';
143
            $qb->andWhere(
144
                $qb->expr()->orX(
145
                    $qb->expr()->like('m.object', ':search'),
146
                    $qb->expr()->like('m.message', ':search'),
147
                    $qb->expr()->like('s.username', ':search'),
148
                    $qb->expr()->like('r.username', ':search')
149
                )
150
            )->setParameter('search', $searchTerm);
151
        }
152
153
        // Appliquer les autres filtres
154
        if (isset($filters['type'])) {
155
            $qb->andWhere('m.type = :type')
156
                ->setParameter('type', $filters['type']);
157
        }
158
159
        if (isset($filters['recipient'])) {
160
            $qb->andWhere('m.recipient = :recipient')
161
                ->setParameter('recipient', $filters['recipient']);
162
        }
163
164
        if (isset($filters['isOpened'])) {
165
            $qb->andWhere('m.isOpened = :isOpened')
166
                ->setParameter('isOpened', $filters['isOpened']);
167
        }
168
169
        return $qb;
170
    }
171
}
172