Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,7 @@ reviews:
# code_guidelines:
# filePatterns:
# - ".github/AGENT.md"

checks:
docstring_coverage:
enabled: false
1 change: 0 additions & 1 deletion src/Domain/Identity/Model/Dto/UpdateAdministratorDto.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion src/Domain/Messaging/Model/Dto/UpdateMessageDto.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
22 changes: 22 additions & 0 deletions src/Domain/Messaging/Model/Dto/UpdateTemplateDto.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace PhpList\Core\Domain\Messaging\Model\Dto;

class UpdateTemplateDto
{
/**
* @SuppressWarnings("BooleanArgumentFlag")
*/
public function __construct(
public readonly ?string $title = null,
public readonly ?string $content = null,
public readonly ?string $text = null,
public readonly ?string $fileContent = null,
public readonly bool $shouldCheckLinks = false,
public readonly bool $shouldCheckImages = false,
public readonly bool $shouldCheckExternalImages = false,
) {
}
}
48 changes: 33 additions & 15 deletions src/Domain/Messaging/Service/Manager/TemplateManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,11 @@

use PhpList\Core\Domain\Common\Model\ValidationContext;
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\Validator\TemplateImageValidator;
use PhpList\Core\Domain\Messaging\Validator\TemplateLinkValidator;
use PhpList\Core\Domain\Subscription\Model\Dto\UpdateSubscriberDto;
use PhpList\Core\Domain\Subscription\Model\Subscriber;

class TemplateManager
{
Expand All @@ -35,11 +34,11 @@ public function __construct(
public function create(CreateTemplateDto $createTemplateDto): Template
{
$template = (new Template($createTemplateDto->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())
Expand All @@ -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
Expand Down
1 change: 0 additions & 1 deletion src/Domain/Subscription/Model/Dto/UpdateSubscriberDto.php
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
10 changes: 5 additions & 5 deletions src/Domain/Subscription/Service/Manager/SubscriberManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ public function testUpdateMessageReturnsUpdatedMessage(): void
);

$updateRequest = new UpdateMessageDto(
messageId: 1,
content: $content,
format: $format,
metadata: $metadata,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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('<html><body>Old</body></html>')
->setText(null);

$dto = new UpdateTemplateDto(
title: 'New Title',
content: '<html><body>New</body></html>',
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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading