From 0a635376503c6cb8223c89ffff52d23cbcee55ac Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 20 Nov 2025 11:43:00 +0400 Subject: [PATCH 1/5] Update: Admin update request --- src/Domain/Identity/Model/Dto/UpdateAdministratorDto.php | 1 - tests/Unit/Domain/Identity/Service/AdministratorManagerTest.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Domain/Identity/Model/Dto/UpdateAdministratorDto.php b/src/Domain/Identity/Model/Dto/UpdateAdministratorDto.php index 399a1d48..72a68f90 100644 --- a/src/Domain/Identity/Model/Dto/UpdateAdministratorDto.php +++ b/src/Domain/Identity/Model/Dto/UpdateAdministratorDto.php @@ -7,7 +7,6 @@ final class UpdateAdministratorDto { public function __construct( - public readonly int $administratorId, public readonly ?string $loginName = null, public readonly ?string $password = null, public readonly ?string $email = null, diff --git a/tests/Unit/Domain/Identity/Service/AdministratorManagerTest.php b/tests/Unit/Domain/Identity/Service/AdministratorManagerTest.php index 0b91fb8e..8a61b4fd 100644 --- a/tests/Unit/Domain/Identity/Service/AdministratorManagerTest.php +++ b/tests/Unit/Domain/Identity/Service/AdministratorManagerTest.php @@ -54,7 +54,6 @@ public function testUpdateAdministrator(): void $admin->setPasswordHash('old_hash'); $dto = new UpdateAdministratorDto( - administratorId: 1, loginName: 'new', password: 'newpass', email: 'new@example.com', From 1bb0b7861f0dd95392d4e02836aa6b8fa43d343e Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 10:28:06 +0400 Subject: [PATCH 2/5] Update: UpdateSubscriberDto --- .../Subscription/Model/Dto/UpdateSubscriberDto.php | 1 - .../Subscription/Service/Manager/SubscriberManager.php | 10 +++++----- .../Service/Manager/SubscriberManagerTest.php | 5 ++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/Domain/Subscription/Model/Dto/UpdateSubscriberDto.php b/src/Domain/Subscription/Model/Dto/UpdateSubscriberDto.php index 987e8e80..89a5cab6 100644 --- a/src/Domain/Subscription/Model/Dto/UpdateSubscriberDto.php +++ b/src/Domain/Subscription/Model/Dto/UpdateSubscriberDto.php @@ -7,7 +7,6 @@ class UpdateSubscriberDto { public function __construct( - public readonly int $subscriberId, public readonly string $email, public readonly bool $confirmed, public readonly bool $blacklisted, diff --git a/src/Domain/Subscription/Service/Manager/SubscriberManager.php b/src/Domain/Subscription/Service/Manager/SubscriberManager.php index e7eaba09..9584b512 100644 --- a/src/Domain/Subscription/Service/Manager/SubscriberManager.php +++ b/src/Domain/Subscription/Service/Manager/SubscriberManager.php @@ -58,11 +58,11 @@ public function getSubscriberById(int $subscriberId): ?Subscriber return $this->subscriberRepository->find($subscriberId); } - public function updateSubscriber(UpdateSubscriberDto $subscriberDto, Administrator $admin): Subscriber - { - /** @var Subscriber $subscriber */ - $subscriber = $this->subscriberRepository->find($subscriberDto->subscriberId); - + public function updateSubscriber( + Subscriber $subscriber, + UpdateSubscriberDto $subscriberDto, + Administrator $admin + ): Subscriber { $subscriber->setEmail($subscriberDto->email); $subscriber->setConfirmed($subscriberDto->confirmed); $subscriber->setBlacklisted($subscriberDto->blacklisted); diff --git a/tests/Unit/Domain/Subscription/Service/Manager/SubscriberManagerTest.php b/tests/Unit/Domain/Subscription/Service/Manager/SubscriberManagerTest.php index aaff7298..f89c6096 100644 --- a/tests/Unit/Domain/Subscription/Service/Manager/SubscriberManagerTest.php +++ b/tests/Unit/Domain/Subscription/Service/Manager/SubscriberManagerTest.php @@ -18,18 +18,17 @@ class SubscriberManagerTest extends TestCase { private SubscriberRepository|MockObject $subscriberRepository; - private EntityManagerInterface|MockObject $entityManager; private SubscriberManager $subscriberManager; protected function setUp(): void { $this->subscriberRepository = $this->createMock(SubscriberRepository::class); - $this->entityManager = $this->createMock(EntityManagerInterface::class); + $entityManager = $this->createMock(EntityManagerInterface::class); $subscriberDeletionService = $this->createMock(SubscriberDeletionService::class); $this->subscriberManager = new SubscriberManager( subscriberRepository: $this->subscriberRepository, - entityManager: $this->entityManager, + entityManager: $entityManager, subscriberDeletionService: $subscriberDeletionService, translator: new Translator('en'), subscriberHistoryManager: $this->createMock(SubscriberHistoryManager::class) From 4215c4050efd1508588b4f816fa97d8184678714 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 10:41:48 +0400 Subject: [PATCH 3/5] Update: TemplateManager update --- .../Messaging/Model/Dto/UpdateTemplateDto.php | 22 +++++++++ .../Service/Manager/TemplateManager.php | 48 ++++++++++++------ .../Service/Manager/TemplateManagerTest.php | 49 +++++++++++++++++-- 3 files changed, 100 insertions(+), 19 deletions(-) create mode 100644 src/Domain/Messaging/Model/Dto/UpdateTemplateDto.php diff --git a/src/Domain/Messaging/Model/Dto/UpdateTemplateDto.php b/src/Domain/Messaging/Model/Dto/UpdateTemplateDto.php new file mode 100644 index 00000000..33e7bcf2 --- /dev/null +++ b/src/Domain/Messaging/Model/Dto/UpdateTemplateDto.php @@ -0,0 +1,22 @@ +title)) - ->setContent($createTemplateDto->content) ->setText($createTemplateDto->text); - if ($createTemplateDto->fileContent) { - $template->setContent($createTemplateDto->fileContent); + $content = $createTemplateDto->fileContent ?? $createTemplateDto->content; + if ($content !== null) { + $template->setContent($content); } $context = (new ValidationContext()) @@ -59,19 +58,38 @@ public function create(CreateTemplateDto $createTemplateDto): Template return $template; } - public function update(UpdateSubscriberDto $updateSubscriberDto): Subscriber + public function update(Template $template, UpdateTemplateDto $updateTemplateDto): Template { - /** @var Subscriber $subscriber */ - $subscriber = $this->templateRepository->find($updateSubscriberDto->subscriberId); + if ($updateTemplateDto->title !== null) { + $template->setTitle($updateTemplateDto->title); + } + + if ($updateTemplateDto->text !== null) { + $template->setText($updateTemplateDto->text); + } + + $content = $updateTemplateDto->fileContent ?? $updateTemplateDto->content; + if ($content !== null) { + $template->setContent($content); + } + + $context = (new ValidationContext()) + ->set('checkLinks', $updateTemplateDto->shouldCheckLinks) + ->set('checkImages', $updateTemplateDto->shouldCheckImages) + ->set('checkExternalImages', $updateTemplateDto->shouldCheckExternalImages); + + $this->templateLinkValidator->validate($template->getContent() ?? '', $context); + + $imageUrls = $this->templateImageManager->extractAllImages($template->getContent() ?? ''); + $this->templateImageValidator->validate($imageUrls, $context); - $subscriber->setEmail($updateSubscriberDto->email); - $subscriber->setConfirmed($updateSubscriberDto->confirmed); - $subscriber->setBlacklisted($updateSubscriberDto->blacklisted); - $subscriber->setHtmlEmail($updateSubscriberDto->htmlEmail); - $subscriber->setDisabled($updateSubscriberDto->disabled); - $subscriber->setExtraData($updateSubscriberDto->additionalData); + foreach ($template->getImages() as $image) { + $this->templateImageManager->delete($image); + } + + $this->templateImageManager->createImagesFromImagePaths($imageUrls, $template); - return $subscriber; + return $template; } public function delete(Template $template): void diff --git a/tests/Unit/Domain/Messaging/Service/Manager/TemplateManagerTest.php b/tests/Unit/Domain/Messaging/Service/Manager/TemplateManagerTest.php index 4f6544c2..e2f79d33 100644 --- a/tests/Unit/Domain/Messaging/Service/Manager/TemplateManagerTest.php +++ b/tests/Unit/Domain/Messaging/Service/Manager/TemplateManagerTest.php @@ -5,6 +5,7 @@ namespace PhpList\Core\Tests\Unit\Domain\Messaging\Service\Manager; use PhpList\Core\Domain\Messaging\Model\Dto\CreateTemplateDto; +use PhpList\Core\Domain\Messaging\Model\Dto\UpdateTemplateDto; use PhpList\Core\Domain\Messaging\Model\Template; use PhpList\Core\Domain\Messaging\Repository\TemplateRepository; use PhpList\Core\Domain\Messaging\Service\Manager\TemplateImageManager; @@ -30,13 +31,53 @@ protected function setUp(): void $this->templateImageValidator = $this->createMock(TemplateImageValidator::class); $this->manager = new TemplateManager( - $this->templateRepository, - $this->templateImageManager, - $this->templateLinkValidator, - $this->templateImageValidator + templateRepository: $this->templateRepository, + templateImageManager: $this->templateImageManager, + templateLinkValidator: $this->templateLinkValidator, + templateImageValidator: $this->templateImageValidator ); } + public function testUpdateTemplateSuccessfully(): void + { + $existing = (new Template('Old Title')) + ->setContent('Old') + ->setText(null); + + $dto = new UpdateTemplateDto( + title: 'New Title', + content: 'New', + text: 'New text', + fileContent: null, + shouldCheckLinks: true, + shouldCheckImages: true, + shouldCheckExternalImages: true, + ); + + $this->templateLinkValidator->expects($this->once()) + ->method('validate') + ->with($dto->content, $this->anything()); + + $this->templateImageManager->expects($this->once()) + ->method('extractAllImages') + ->with($dto->content) + ->willReturn(['a.png']); + + $this->templateImageValidator->expects($this->once()) + ->method('validate') + ->with(['a.png'], $this->anything()); + + $this->templateImageManager->expects($this->once()) + ->method('createImagesFromImagePaths') + ->with(['a.png'], $this->isInstanceOf(Template::class)); + + $updated = $this->manager->update(template: $existing, updateTemplateDto: $dto); + + $this->assertSame('New Title', $updated->getTitle()); + $this->assertSame('New text', $updated->getText()); + $this->assertSame($dto->content, $updated->getContent()); + } + public function testCreateTemplateSuccessfully(): void { $request = new CreateTemplateDto( From a3a141cbcb7cec00b9bfe9765c2da062f0fada83 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 11:10:27 +0400 Subject: [PATCH 4/5] Update: UpdateMessageDto --- src/Domain/Messaging/Model/Dto/UpdateMessageDto.php | 1 - .../Unit/Domain/Messaging/Service/Manager/MessageManagerTest.php | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Domain/Messaging/Model/Dto/UpdateMessageDto.php b/src/Domain/Messaging/Model/Dto/UpdateMessageDto.php index b401c4c5..078207dc 100644 --- a/src/Domain/Messaging/Model/Dto/UpdateMessageDto.php +++ b/src/Domain/Messaging/Model/Dto/UpdateMessageDto.php @@ -13,7 +13,6 @@ class UpdateMessageDto implements MessageDtoInterface { public function __construct( - public readonly int $messageId, public readonly MessageContentDto $content, public readonly MessageFormatDto $format, public readonly MessageMetadataDto $metadata, diff --git a/tests/Unit/Domain/Messaging/Service/Manager/MessageManagerTest.php b/tests/Unit/Domain/Messaging/Service/Manager/MessageManagerTest.php index ac41566f..cbbbcb68 100644 --- a/tests/Unit/Domain/Messaging/Service/Manager/MessageManagerTest.php +++ b/tests/Unit/Domain/Messaging/Service/Manager/MessageManagerTest.php @@ -104,7 +104,6 @@ public function testUpdateMessageReturnsUpdatedMessage(): void ); $updateRequest = new UpdateMessageDto( - messageId: 1, content: $content, format: $format, metadata: $metadata, From 451b1b6b5483584ef6151fda94940c42f693e438 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 11:35:12 +0400 Subject: [PATCH 5/5] Update: code rabbit config --- .coderabbit.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.coderabbit.yaml b/.coderabbit.yaml index 0ce9e85a..f249121a 100644 --- a/.coderabbit.yaml +++ b/.coderabbit.yaml @@ -73,3 +73,7 @@ reviews: # code_guidelines: # filePatterns: # - ".github/AGENT.md" + +checks: + docstring_coverage: + enabled: false