Skip to content

Commit 78359ae

Browse files
committed
ListMessage relation objects
1 parent a1228cd commit 78359ae

File tree

9 files changed

+119
-150
lines changed

9 files changed

+119
-150
lines changed

src/Domain/Messaging/Model/ListMessage.php

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PhpList\Core\Domain\Common\Model\Interfaces\Identity;
1212
use PhpList\Core\Domain\Common\Model\Interfaces\ModificationDate;
1313
use PhpList\Core\Domain\Messaging\Repository\ListMessageRepository;
14+
use PhpList\Core\Domain\Subscription\Model\SubscriberList;
1415

1516
#[ORM\Entity(repositoryClass: ListMessageRepository::class)]
1617
#[ORM\Table(name: 'phplist_listmessage')]
@@ -24,11 +25,13 @@ class ListMessage implements DomainModel, Identity, ModificationDate
2425
#[ORM\GeneratedValue]
2526
private ?int $id = null;
2627

27-
#[ORM\Column(name: 'messageid', type: 'integer')]
28-
private int $messageId;
28+
#[ORM\ManyToOne(targetEntity: Message::class, inversedBy: 'listMessages')]
29+
#[ORM\JoinColumn(name: 'messageid', referencedColumnName: 'id', nullable: false)]
30+
private ?Message $message = null;
2931

30-
#[ORM\Column(name: 'listid', type: 'integer')]
31-
private int $listId;
32+
#[ORM\ManyToOne(targetEntity: SubscriberList::class, inversedBy: 'listMessages')]
33+
#[ORM\JoinColumn(name: 'listid', referencedColumnName: 'id', nullable: false)]
34+
private ?SubscriberList $subscriberList = null;
3235

3336
#[ORM\Column(name: 'entered', type: 'datetime', nullable: true)]
3437
private ?DateTimeInterface $entered = null;
@@ -41,25 +44,25 @@ public function getId(): ?int
4144
return $this->id;
4245
}
4346

44-
public function getMessageId(): int
47+
public function getMessage(): ?Message
4548
{
46-
return $this->messageId;
49+
return $this->message;
4750
}
4851

49-
public function setMessageId(int $messageId): self
52+
public function setMessage(?Message $message): self
5053
{
51-
$this->messageId = $messageId;
54+
$this->message = $message;
5255
return $this;
5356
}
5457

55-
public function getListId(): int
58+
public function getList(): ?SubscriberList
5659
{
57-
return $this->listId;
60+
return $this->subscriberList;
5861
}
5962

60-
public function setListId(int $listId): self
63+
public function setList(?SubscriberList $subscriberList): self
6164
{
62-
$this->listId = $listId;
65+
$this->subscriberList = $subscriberList;
6366
return $this;
6467
}
6568

src/Domain/Messaging/Model/Message.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
namespace PhpList\Core\Domain\Messaging\Model;
66

77
use DateTime;
8+
use Doctrine\Common\Collections\ArrayCollection;
9+
use Doctrine\Common\Collections\Collection;
810
use Doctrine\ORM\Mapping as ORM;
911
use PhpList\Core\Domain\Common\Model\Interfaces\DomainModel;
1012
use PhpList\Core\Domain\Common\Model\Interfaces\Identity;
@@ -57,6 +59,9 @@ class Message implements DomainModel, Identity, ModificationDate
5759
#[ORM\JoinColumn(name: 'template', referencedColumnName: 'id', nullable: true, onDelete: 'SET NULL')]
5860
private ?Template $template = null;
5961

62+
#[ORM\OneToMany(targetEntity: ListMessage::class, mappedBy: 'message')]
63+
private Collection $listMessages;
64+
6065
public function __construct(
6166
MessageFormat $format,
6267
MessageSchedule $schedule,
@@ -74,6 +79,7 @@ public function __construct(
7479
$this->uuid = bin2hex(random_bytes(18));
7580
$this->owner = $owner;
7681
$this->template = $template;
82+
$this->listMessages = new ArrayCollection();
7783
}
7884

7985
public function getId(): ?int
@@ -182,4 +188,16 @@ public function setOptions(MessageOptions $options): self
182188
$this->options = $options;
183189
return $this;
184190
}
191+
192+
public function getListMessages(): Collection
193+
{
194+
return $this->listMessages;
195+
}
196+
197+
public function getSubscriberLists(): Collection
198+
{
199+
return $this->listMessages->map(
200+
fn(ListMessage $lm) => $lm->getList()
201+
);
202+
}
185203
}

src/Domain/Messaging/Repository/ListMessageRepository.php

Lines changed: 15 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,64 +8,44 @@
88
use PhpList\Core\Domain\Common\Repository\CursorPaginationTrait;
99
use PhpList\Core\Domain\Common\Repository\Interfaces\PaginatableRepositoryInterface;
1010
use PhpList\Core\Domain\Messaging\Model\ListMessage;
11+
use PhpList\Core\Domain\Messaging\Model\Message;
12+
use PhpList\Core\Domain\Subscription\Model\SubscriberList;
1113

1214
class ListMessageRepository extends AbstractRepository implements PaginatableRepositoryInterface
1315
{
1416
use CursorPaginationTrait;
1517

16-
/** @return int[] */
17-
public function getListIdsByMessageId(int $messageId): array
18-
{
19-
return $this->createQueryBuilder('lm')
20-
->select('lm.listId')
21-
->where('lm.messageId = :messageId')
22-
->setParameter('messageId', $messageId)
23-
->getQuery()
24-
->getSingleColumnResult();
25-
}
26-
27-
/** @return int[] */
28-
public function getMessageIdsByListId(int $listId): array
29-
{
30-
return $this->createQueryBuilder('lm')
31-
->select('lm.messageId')
32-
->where('lm.listId = :listId')
33-
->setParameter('listId', $listId)
34-
->getQuery()
35-
->getSingleColumnResult();
36-
}
37-
38-
public function isMessageAssociatedWithList(int $messageId, int $listId): bool
18+
public function isMessageAssociatedWithList(Message $message, SubscriberList $list): bool
3919
{
4020
$count = $this->createQueryBuilder('lm')
4121
->select('COUNT(lm.id)')
42-
->where('lm.messageId = :messageId')
43-
->andWhere('lm.listId = :listId')
44-
->setParameter('messageId', $messageId)
45-
->setParameter('listId', $listId)
22+
->where('lm.message = :message')
23+
->andWhere('lm.list = :list')
24+
->setParameter('message', $message)
25+
->setParameter('list', $list)
4626
->getQuery()
4727
->getSingleScalarResult();
4828

4929
return $count > 0;
5030
}
5131

52-
public function getByMessageIdAndListId(int $messageId, int $listId): ?ListMessage
32+
public function getByMessageAndList(Message $message, SubscriberList $list): ?ListMessage
5333
{
5434
return $this->createQueryBuilder('lm')
55-
->where('lm.messageId = :messageId')
56-
->andWhere('lm.listId = :listId')
57-
->setParameter('messageId', $messageId)
58-
->setParameter('listId', $listId)
35+
->where('lm.message = :message')
36+
->andWhere('lm.list = :list')
37+
->setParameter('messageId', $message)
38+
->setParameter('list', $list)
5939
->getQuery()
6040
->getOneOrNullResult();
6141
}
6242

63-
public function removeAllListAssociationsForMessage(int $messageId): void
43+
public function removeAllListAssociationsForMessage(Message $message): void
6444
{
6545
$this->createQueryBuilder('lm')
6646
->delete()
67-
->where('lm.messageId = :messageId')
68-
->setParameter('messageId', $messageId)
47+
->where('lm.message = :message')
48+
->setParameter('message', $message)
6949
->getQuery()
7050
->execute();
7151
}

src/Domain/Messaging/Service/Manager/ListMessageManager.php

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ public function __construct(
3030
public function associateMessageWithList(Message $message, SubscriberList $subscriberList): ListMessage
3131
{
3232
$listMessage = new ListMessage();
33-
$listMessage->setMessageId($message->getId());
34-
$listMessage->setListId($subscriberList->getId());
33+
$listMessage->setMessage($message);
34+
$listMessage->setList($subscriberList);
3535
$listMessage->setEntered(new DateTime());
3636

3737
$this->entityManager->persist($listMessage);
@@ -45,36 +45,16 @@ public function associateMessageWithList(Message $message, SubscriberList $subsc
4545
*/
4646
public function removeAssociation(Message $message, SubscriberList $subscriberList): void
4747
{
48-
$relation = $this->listMessageRepository->getByMessageIdAndListId($message->getId(), $subscriberList->getId());
48+
$relation = $this->listMessageRepository->getByMessageAndList($message, $subscriberList);
4949
$this->entityManager->remove($relation);
5050
}
5151

52-
/**
53-
* Gets all subscriber lists associated with a message
54-
*
55-
* @return int[]
56-
*/
57-
public function getListIdsByMessage(Message $message): array
58-
{
59-
return $this->listMessageRepository->getListIdsByMessageId($message->getId());
60-
}
61-
62-
/**
63-
* Gets all messages associated with a subscriber list
64-
*
65-
* @return int[]
66-
*/
67-
public function getMessageIdsByList(SubscriberList $subscriberList): array
68-
{
69-
return $this->listMessageRepository->getMessageIdsByListId($subscriberList->getId());
70-
}
71-
7252
/**
7353
* Checks if a message is associated with a subscriber list
7454
*/
7555
public function isMessageAssociatedWithList(Message $message, SubscriberList $subscriberList): bool
7656
{
77-
return $this->listMessageRepository->isMessageAssociatedWithList($message->getId(), $subscriberList->getId());
57+
return $this->listMessageRepository->isMessageAssociatedWithList($message, $subscriberList);
7858
}
7959

8060
/**
@@ -94,6 +74,6 @@ public function associateMessageWithLists(Message $message, array $subscriberLis
9474
*/
9575
public function removeAllListAssociationsForMessage(Message $message): void
9676
{
97-
$this->listMessageRepository->removeAllListAssociationsForMessage($message->getId());
77+
$this->listMessageRepository->removeAllListAssociationsForMessage($message);
9878
}
9979
}

src/Domain/Subscription/Model/SubscriberList.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PhpList\Core\Domain\Common\Model\Interfaces\Identity;
1414
use PhpList\Core\Domain\Common\Model\Interfaces\ModificationDate;
1515
use PhpList\Core\Domain\Identity\Model\Administrator;
16+
use PhpList\Core\Domain\Messaging\Model\ListMessage;
1617
use PhpList\Core\Domain\Subscription\Repository\SubscriberListRepository;
1718
use Symfony\Component\Serializer\Attribute\MaxDepth;
1819

@@ -71,9 +72,13 @@ class SubscriberList implements DomainModel, Identity, CreationDate, Modificatio
7172
#[MaxDepth(1)]
7273
private Collection $subscriptions;
7374

75+
#[ORM\OneToMany(targetEntity: ListMessage::class, mappedBy: 'subscriberList')]
76+
private Collection $listMessages;
77+
7478
public function __construct()
7579
{
7680
$this->subscriptions = new ArrayCollection();
81+
$this->listMessages = new ArrayCollection();
7782
$this->createdAt = new DateTime();
7883
$this->listPosition = 0;
7984
$this->subjectPrefix = '';
@@ -221,4 +226,16 @@ public function updateUpdatedAt(): DomainModel
221226

222227
return $this;
223228
}
229+
230+
public function getListMessages(): Collection
231+
{
232+
return $this->listMessages;
233+
}
234+
235+
public function getMessages(): Collection
236+
{
237+
return $this->listMessages->map(
238+
fn(ListMessage $lm) => $lm->getMessage()
239+
);
240+
}
224241
}

src/Domain/Subscription/Service/Provider/SubscriberProvider.php

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,16 @@
55
namespace PhpList\Core\Domain\Subscription\Service\Provider;
66

77
use PhpList\Core\Domain\Messaging\Model\Message;
8-
use PhpList\Core\Domain\Messaging\Repository\ListMessageRepository;
98
use PhpList\Core\Domain\Subscription\Model\Subscriber;
9+
use PhpList\Core\Domain\Subscription\Model\SubscriberList;
1010
use PhpList\Core\Domain\Subscription\Repository\SubscriberRepository;
1111

1212
class SubscriberProvider
1313
{
14-
private ListMessageRepository $listMessageRepository;
1514
private SubscriberRepository $subscriberRepository;
1615

17-
public function __construct(
18-
ListMessageRepository $listMessageRepository,
19-
SubscriberRepository $subscriberRepository
20-
) {
21-
$this->listMessageRepository = $listMessageRepository;
16+
public function __construct(SubscriberRepository $subscriberRepository)
17+
{
2218
$this->subscriberRepository = $subscriberRepository;
2319
}
2420

@@ -30,7 +26,9 @@ public function __construct(
3026
*/
3127
public function getSubscribersForMessage(Message $message): array
3228
{
33-
$listIds = $this->listMessageRepository->getListIdsByMessageId($message->getId());
29+
$listIds = $message->getSubscriberLists()
30+
->map(fn(SubscriberList $list) => $list->getId())
31+
->toArray();
3432

3533
$subscribers = [];
3634
foreach ($listIds as $listId) {

tests/Integration/Routing/ExtraLoaderTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPUnit\Framework\TestCase;
1313
use Symfony\Bundle\FrameworkBundle\Routing\AttributeRouteControllerLoader;
1414
use Symfony\Component\Config\FileLocator;
15+
use Symfony\Component\Config\Loader\Loader;
1516
use Symfony\Component\Config\Loader\LoaderResolver;
1617
use Symfony\Component\Routing\Loader\AttributeDirectoryLoader;
1718
use Symfony\Component\Routing\Loader\YamlFileLoader;
@@ -68,4 +69,19 @@ public function loadReturnsRouteCollection(): void
6869
self::assertInstanceOf(RouteCollection::class, $routeCollection);
6970
self::assertNotNull($routeCollection->get('empty_start_page'));
7071
}
72+
73+
public function testClassIsLoader(): void
74+
{
75+
self::assertInstanceOf(Loader::class, $this->subject);
76+
}
77+
78+
public function testSupportsExtraType(): void
79+
{
80+
self::assertTrue($this->subject->supports('', 'extra'));
81+
}
82+
83+
public function testNotSupportsOtherType(): void
84+
{
85+
self::assertFalse($this->subject->supports('', 'foo'));
86+
}
7187
}

0 commit comments

Comments
 (0)