Skip to content

Commit ab6c5fd

Browse files
TatevikGrtatevikg1
andauthored
Blacklist (#352)
* Blacklisted * user repository methods * fix configs * add test * fix: phpmd * fix: repo configs * return a created resource --------- Co-authored-by: Tatevik <tatevikg1@gmail.com>
1 parent 97a55d6 commit ab6c5fd

File tree

11 files changed

+377
-26
lines changed

11 files changed

+377
-26
lines changed

config/services/managers.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,7 @@ services:
6767
PhpList\Core\Domain\Messaging\Service\Manager\ListMessageManager:
6868
autowire: true
6969
autoconfigure: true
70+
71+
PhpList\Core\Domain\Subscription\Service\Manager\SubscriberBlacklistManager:
72+
autowire: true
73+
autoconfigure: true

config/services/repositories.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,13 @@ services:
110110
parent: PhpList\Core\Domain\Common\Repository\AbstractRepository
111111
arguments:
112112
- PhpList\Core\Domain\Messaging\Model\ListMessage
113+
114+
PhpList\Core\Domain\Subscription\Repository\UserBlacklistRepository:
115+
parent: PhpList\Core\Domain\Common\Repository\AbstractRepository
116+
arguments:
117+
- PhpList\Core\Domain\Subscription\Model\UserBlacklist
118+
119+
PhpList\Core\Domain\Subscription\Repository\UserBlacklistDataRepository:
120+
parent: PhpList\Core\Domain\Common\Repository\AbstractRepository
121+
arguments:
122+
- PhpList\Core\Domain\Subscription\Model\UserBlacklistData

src/Domain/Identity/Repository/UserBlacklistDataRepository.php

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/Domain/Identity/Repository/UserBlacklistRepository.php

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/Domain/Identity/Model/UserBlacklist.php renamed to src/Domain/Subscription/Model/UserBlacklist.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22

33
declare(strict_types=1);
44

5-
namespace PhpList\Core\Domain\Identity\Model;
5+
namespace PhpList\Core\Domain\Subscription\Model;
66

77
use DateTime;
88
use Doctrine\ORM\Mapping as ORM;
99
use PhpList\Core\Domain\Common\Model\Interfaces\DomainModel;
10-
use PhpList\Core\Domain\Identity\Repository\UserBlacklistRepository;
10+
use PhpList\Core\Domain\Subscription\Repository\UserBlacklistRepository;
1111

1212
#[ORM\Entity(repositoryClass: UserBlacklistRepository::class)]
1313
#[ORM\Table(name: 'phplist_user_blacklist')]
@@ -21,6 +21,9 @@ class UserBlacklist implements DomainModel
2121
#[ORM\Column(name: 'added', type: 'datetime', nullable: true)]
2222
private ?DateTime $added = null;
2323

24+
#[ORM\OneToOne(targetEntity: UserBlacklistData::class, mappedBy: 'email')]
25+
private ?UserBlacklistData $blacklistData = null;
26+
2427
public function getEmail(): string
2528
{
2629
return $this->email;
@@ -42,4 +45,9 @@ public function setAdded(?DateTime $added): self
4245
$this->added = $added;
4346
return $this;
4447
}
48+
49+
public function getBlacklistData(): ?UserBlacklistData
50+
{
51+
return $this->blacklistData;
52+
}
4553
}

src/Domain/Identity/Model/UserBlacklistData.php renamed to src/Domain/Subscription/Model/UserBlacklistData.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
declare(strict_types=1);
44

5-
namespace PhpList\Core\Domain\Identity\Model;
5+
namespace PhpList\Core\Domain\Subscription\Model;
66

77
use Doctrine\ORM\Mapping as ORM;
88
use PhpList\Core\Domain\Common\Model\Interfaces\DomainModel;
9-
use PhpList\Core\Domain\Identity\Repository\UserBlacklistDataRepository;
9+
use PhpList\Core\Domain\Subscription\Repository\UserBlacklistDataRepository;
1010

1111
#[ORM\Entity(repositoryClass: UserBlacklistDataRepository::class)]
1212
#[ORM\Table(name: 'phplist_user_blacklist_data')]

src/Domain/Subscription/Repository/SubscriberRepository.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,18 @@ public function findSubscriberWithSubscriptions(int $id): ?Subscriber
127127
->getQuery()
128128
->getOneOrNullResult();
129129
}
130+
131+
public function isEmailBlacklisted(string $email): bool
132+
{
133+
$queryBuilder = $this->getEntityManager()->createQueryBuilder();
134+
135+
$queryBuilder->select('u.email')
136+
->from(Subscriber::class, 'u')
137+
->where('u.email = :email')
138+
->andWhere('u.blacklisted = 1')
139+
->setParameter('email', $email)
140+
->setMaxResults(1);
141+
142+
return !($queryBuilder->getQuery()->getOneOrNullResult() === null);
143+
}
130144
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Subscription\Repository;
6+
7+
use PhpList\Core\Domain\Common\Repository\AbstractRepository;
8+
use PhpList\Core\Domain\Subscription\Model\UserBlacklistData;
9+
10+
class UserBlacklistDataRepository extends AbstractRepository
11+
{
12+
public function findOneByEmail(string $email): ?UserBlacklistData
13+
{
14+
return $this->findOneBy(['email' => $email]);
15+
}
16+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Subscription\Repository;
6+
7+
use PhpList\Core\Domain\Common\Repository\AbstractRepository;
8+
use PhpList\Core\Domain\Subscription\Model\UserBlacklist;
9+
use PhpList\Core\Domain\Subscription\Model\UserBlacklistData;
10+
11+
class UserBlacklistRepository extends AbstractRepository
12+
{
13+
public function findBlacklistInfoByEmail(string $email): ?UserBlacklist
14+
{
15+
$queryBuilder = $this->getEntityManager()->createQueryBuilder();
16+
17+
$queryBuilder->select('ub.email, ub.added, ubd.data AS reason')
18+
->from(UserBlacklist::class, 'ub')
19+
->innerJoin(UserBlacklistData::class, 'ubd', 'WITH', 'ub.email = ubd.email')
20+
->where('ub.email = :email')
21+
->setParameter('email', $email)
22+
->setMaxResults(1);
23+
24+
return $queryBuilder->getQuery()->getOneOrNullResult();
25+
}
26+
27+
public function findOneByEmail(string $email): ?UserBlacklist
28+
{
29+
return $this->findOneBy([
30+
'email' => $email,
31+
]);
32+
}
33+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Subscription\Service\Manager;
6+
7+
use DateTime;
8+
use Doctrine\ORM\EntityManagerInterface;
9+
use PhpList\Core\Domain\Subscription\Model\UserBlacklist;
10+
use PhpList\Core\Domain\Subscription\Model\UserBlacklistData;
11+
use PhpList\Core\Domain\Subscription\Repository\SubscriberRepository;
12+
use PhpList\Core\Domain\Subscription\Repository\UserBlacklistDataRepository;
13+
use PhpList\Core\Domain\Subscription\Repository\UserBlacklistRepository;
14+
15+
class SubscriberBlacklistManager
16+
{
17+
public function __construct(
18+
private readonly SubscriberRepository $subscriberRepository,
19+
private readonly UserBlacklistRepository $userBlacklistRepository,
20+
private readonly UserBlacklistDataRepository $blacklistDataRepository,
21+
private readonly EntityManagerInterface $entityManager,
22+
) {
23+
}
24+
25+
public function isEmailBlacklisted(string $email): bool
26+
{
27+
return $this->subscriberRepository->isEmailBlacklisted($email);
28+
}
29+
30+
public function getBlacklistInfo(string $email): ?UserBlacklist
31+
{
32+
return $this->userBlacklistRepository->findBlacklistInfoByEmail($email);
33+
}
34+
35+
public function addEmailToBlacklist(string $email, ?string $reasonData = null): UserBlacklist
36+
{
37+
$existing = $this->subscriberRepository->isEmailBlacklisted($email);
38+
if ($existing) {
39+
return $this->getBlacklistInfo($email);
40+
}
41+
42+
$blacklistEntry = new UserBlacklist();
43+
$blacklistEntry->setEmail($email);
44+
$blacklistEntry->setAdded(new DateTime());
45+
46+
$this->entityManager->persist($blacklistEntry);
47+
48+
if ($reasonData !== null) {
49+
$blacklistData = new UserBlacklistData();
50+
$blacklistData->setEmail($email);
51+
$blacklistData->setName('reason');
52+
$blacklistData->setData($reasonData);
53+
$this->entityManager->persist($blacklistData);
54+
}
55+
56+
$this->entityManager->flush();
57+
58+
return $blacklistEntry;
59+
}
60+
61+
public function removeEmailFromBlacklist(string $email): void
62+
{
63+
$blacklistEntry = $this->userBlacklistRepository->findOneByEmail($email);
64+
if ($blacklistEntry) {
65+
$this->entityManager->remove($blacklistEntry);
66+
}
67+
68+
$blacklistData = $this->blacklistDataRepository->findOneByEmail($email);
69+
if ($blacklistData) {
70+
$this->entityManager->remove($blacklistData);
71+
}
72+
73+
$subscriber = $this->subscriberRepository->findOneByEmail($email);
74+
if ($subscriber) {
75+
$subscriber->setBlacklisted(false);
76+
}
77+
78+
$this->entityManager->flush();
79+
}
80+
81+
public function getBlacklistReason(string $email): ?string
82+
{
83+
$data = $this->blacklistDataRepository->findOneByEmail($email);
84+
return $data ? $data->getData() : null;
85+
}
86+
}

0 commit comments

Comments
 (0)