From e4874b200e81d3e9fd1c6a564956c7a3803a1830 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 20 Nov 2025 11:21:13 +0400 Subject: [PATCH 1/6] Update: admin routes + swagger --- .../AdminAttributeValueController.php | 33 ++++++------ .../Controller/TemplateController.php | 52 ++----------------- .../Request/CreateTemplateRequest.php | 35 +++++++++++++ .../Controller/ListMembersController.php | 13 +++-- .../AdminAttributeValueControllerTest.php | 18 +++---- 5 files changed, 75 insertions(+), 76 deletions(-) diff --git a/src/Identity/Controller/AdminAttributeValueController.php b/src/Identity/Controller/AdminAttributeValueController.php index 573608ba..b8e1b5a4 100644 --- a/src/Identity/Controller/AdminAttributeValueController.php +++ b/src/Identity/Controller/AdminAttributeValueController.php @@ -22,7 +22,7 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; -#[Route('/administrators/attribute-values', name: 'admin_attribute_value_')] +#[Route('/administrators', name: 'admin_attribute_value_')] class AdminAttributeValueController extends BaseController { private AdminAttributeManager $attributeManager; @@ -46,13 +46,13 @@ public function __construct( } #[Route( - path: '/{adminId}/{definitionId}', + path: '/{adminId}/attributes/{definitionId}', name: 'create', requirements: ['adminId' => '\d+', 'definitionId' => '\d+'], methods: ['POST', 'PUT'], )] #[OA\Post( - path: '/api/v2/administrators/attribute-values/{adminId}/{definitionId}', + path: '/api/v2/administrators/{adminId}/attributes/{definitionId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Returns created/updated admin attribute.', summary: 'Create/update an admin attribute.', @@ -133,13 +133,13 @@ public function createOrUpdate( } #[Route( - path: '/{adminId}/{definitionId}', + path: '/{adminId}/attributes/{definitionId}', name: 'delete', requirements: ['adminId' => '\d+', 'definitionId' => '\d+'], methods: ['DELETE'], )] #[OA\Delete( - path: '/api/v2/administrators/attribute-values/{adminId}/{definitionId}', + path: '/api/v2/administrators/{adminId}/attributes/{definitionId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Deletes a single admin attribute.', summary: 'Deletes an attribute.', @@ -203,9 +203,9 @@ public function delete( return $this->json(null, Response::HTTP_NO_CONTENT); } - #[Route('/{adminId}', name: 'get__list', requirements: ['adminId' => '\d+'], methods: ['GET'])] + #[Route('/{adminId}/attributes', name: 'get_list', requirements: ['adminId' => '\d+'], methods: ['GET'])] #[OA\Get( - path: '/api/v2/administrators/attribute-values/{adminId}', + path: '/api/v2/administrators/{adminId}/attributes', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Returns a JSON list of all admin attributes.', summary: 'Gets a list of all admin attributes.', @@ -260,6 +260,11 @@ public function delete( response: 403, description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') + ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') ) ] )] @@ -276,18 +281,18 @@ public function getPaginated( return $this->json( $this->paginatedDataProvider->getPaginatedList( - $request, - $this->normalizer, - AdminAttributeValue::class, - $filter + request: $request, + normalizer:$this->normalizer, + className: AdminAttributeValue::class, + filter: $filter ), Response::HTTP_OK ); } - #[Route('/{adminId}/{definitionId}', name: 'get_one', methods: ['GET'])] + #[Route('/{adminId}/attributes/{definitionId}', name: 'get_one', methods: ['GET'])] #[OA\Get( - path: '/api/v2/administrators/attribute-values/{adminId}/{definitionId}', + path: '/api/v2/administrators/{adminId}/attributes/{definitionId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Returns a single attribute.', summary: 'Gets admin attribute.', @@ -355,8 +360,6 @@ public function getAttributeDefinition( adminId: $admin->getId(), attributeDefinitionId: $definition->getId() ); - $this->attributeManager->delete($attribute); - $this->entityManager->flush(); return $this->json( $this->normalizer->normalize($attribute), diff --git a/src/Messaging/Controller/TemplateController.php b/src/Messaging/Controller/TemplateController.php index bc24a02d..92179a42 100644 --- a/src/Messaging/Controller/TemplateController.php +++ b/src/Messaging/Controller/TemplateController.php @@ -105,9 +105,9 @@ public function getTemplates(Request $request): JsonResponse return $this->json( $this->paginatedDataProvider->getPaginatedList( - $request, - $this->normalizer, - Template::class, + request: $request, + normalizer: $this->normalizer, + className: Template::class, ), Response::HTTP_OK ); @@ -178,51 +178,7 @@ public function getTemplate( required: true, content: new OA\MediaType( mediaType: 'multipart/form-data', - schema: new OA\Schema( - required: ['title'], - properties: [ - new OA\Property( - property: 'title', - type: 'string', - example: 'Newsletter Template' - ), - new OA\Property( - property: 'content', - type: 'string', - example: '[CONTENT]' - ), - new OA\Property( - property: 'text', - type: 'string', - example: '[CONTENT]' - ), - new OA\Property( - property: 'file', - description: 'Optional file upload for HTML content', - type: 'string', - format: 'binary' - ), - new OA\Property( - property: 'check_links', - description: 'Check that all links have full URLs', - type: 'boolean', - example: true - ), - new OA\Property( - property: 'check_images', - description: 'Check that all images have full URLs', - type: 'boolean', - example: false - ), - new OA\Property( - property: 'check_external_images', - description: 'Check that all external images exist', - type: 'boolean', - example: true - ), - ], - type: 'object' - ) + schema: new OA\Schema(ref: '#/components/schemas/CreateTemplateRequest') ) ), tags: ['templates'], diff --git a/src/Messaging/Request/CreateTemplateRequest.php b/src/Messaging/Request/CreateTemplateRequest.php index 9ab4c6c8..664657f3 100644 --- a/src/Messaging/Request/CreateTemplateRequest.php +++ b/src/Messaging/Request/CreateTemplateRequest.php @@ -4,12 +4,47 @@ namespace PhpList\RestBundle\Messaging\Request; +use OpenApi\Attributes as OA; use PhpList\Core\Domain\Messaging\Model\Dto\CreateTemplateDto; use PhpList\RestBundle\Common\Request\RequestInterface; use PhpList\RestBundle\Messaging\Validator\Constraint\ContainsPlaceholder; use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\Validator\Constraints as Assert; +#[OA\Schema( + schema: 'CreateTemplateRequest', + required: ['title'], + properties: [ + new OA\Property(property: 'title', type: 'string', example: 'Newsletter Template'), + new OA\Property(property: 'content', type: 'string', example: '[CONTENT]'), + new OA\Property(property: 'text', type: 'string', example: '[CONTENT]'), + new OA\Property( + property: 'file', + description: 'Optional file upload for HTML content', + type: 'string', + format: 'binary' + ), + new OA\Property( + property: 'check_links', + description: 'Check that all links have full URLs', + type: 'boolean', + example: true + ), + new OA\Property( + property: 'check_images', + description: 'Check that all images have full URLs', + type: 'boolean', + example: false + ), + new OA\Property( + property: 'check_external_images', + description: 'Check that all external images exist', + type: 'boolean', + example: true + ), + ], + type: 'object' +)] class CreateTemplateRequest implements RequestInterface { #[Assert\NotBlank(normalizer: 'trim')] diff --git a/src/Subscription/Controller/ListMembersController.php b/src/Subscription/Controller/ListMembersController.php index 80bafa82..2677da8c 100644 --- a/src/Subscription/Controller/ListMembersController.php +++ b/src/Subscription/Controller/ListMembersController.php @@ -113,10 +113,10 @@ public function getListMembers( return $this->json( $this->paginatedProvider->getPaginatedList( - $request, - $this->subscriberNormalizer, - Subscriber::class, - new SubscriberFilter($list->getId()) + request: $request, + normalizer: $this->subscriberNormalizer, + className: Subscriber::class, + filter: new SubscriberFilter($list->getId()) ), Response::HTTP_OK ); @@ -164,6 +164,11 @@ public function getListMembers( response: 403, description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') + ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') ) ] )] diff --git a/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php b/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php index f3503153..adf59a6d 100644 --- a/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php +++ b/tests/Integration/Identity/Controller/AdminAttributeValueControllerTest.php @@ -28,7 +28,7 @@ public function testCreateOrUpdateAttributeValueWithValidDataReturnsCreated(): v $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId, + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId, [], [], [], @@ -54,7 +54,7 @@ public function testUpdateAttributeValueReturnsOk(): void $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId, + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId, [], [], [], @@ -78,7 +78,7 @@ public function testDeleteAttributeValueReturnsNoContent(): void $this->authenticatedJsonRequest( 'delete', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId ); $this->assertHttpNoContent(); } @@ -92,7 +92,7 @@ public function testGetPaginatedReturnsOk(): void ]); $adminId = 1; - $this->authenticatedJsonRequest('get', '/api/v2/administrators/attribute-values/' . $adminId); + $this->authenticatedJsonRequest('get', '/api/v2/administrators/' . $adminId . '/attributes'); $this->assertHttpOkay(); $data = $this->getDecodedJsonResponseContent(); self::assertArrayHasKey('items', $data); @@ -112,7 +112,7 @@ public function testGetAttributeValueReturnsData(): void $this->authenticatedJsonRequest( 'get', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId ); $this->assertHttpOkay(); $data = $this->getDecodedJsonResponseContent(); @@ -126,7 +126,7 @@ public function testGetAttributeValueNotFound(): void $this->authenticatedJsonRequest( 'get', - '/api/v2/administrators/attribute-values/' . $adminId . '/999999' + '/api/v2/administrators/' . $adminId . '/attributes/999999' ); $this->assertHttpNotFound(); } @@ -142,7 +142,7 @@ public function testCreateAttributeValueWithInvalidJsonReturns400(): void $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId, + '/api/v2/administrators/' . $adminId . '/attributes/' . $definitionId, [], [], [], @@ -158,7 +158,7 @@ public function testCreateAttributeValueWithInvalidDefinitionIdReturns404(): voi $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/' . $adminId . '/999999', + '/api/v2/administrators/' . $adminId . '/attributes/999999', [], [], [], @@ -174,7 +174,7 @@ public function testCreateAttributeValueWithInvalidAdminIdReturns404(): void $this->authenticatedJsonRequest( 'post', - '/api/v2/administrators/attribute-values/999999/' . $definitionId, + '/api/v2/administrators/999999/attributes/' . $definitionId, [], [], [], From e4d4b0a540fac768e91492e58a2a05c5605368e7 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 20 Nov 2025 11:22:27 +0400 Subject: [PATCH 2/6] Update: shorten admin param name --- src/Common/Validator/RequestValidator.php | 3 --- .../Controller/AdministratorController.php | 24 +++++++++---------- .../Request/UpdateAdministratorRequest.php | 3 --- 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/Common/Validator/RequestValidator.php b/src/Common/Validator/RequestValidator.php index c0aed041..df0ae67b 100644 --- a/src/Common/Validator/RequestValidator.php +++ b/src/Common/Validator/RequestValidator.php @@ -38,9 +38,6 @@ public function validate(Request $request, string $dtoClass): RequestInterface if (isset($routeParams['listId'])) { $routeParams['listId'] = (int) $routeParams['listId']; } - if (isset($routeParams['administratorId'])) { - $routeParams['administratorId'] = (int) $routeParams['administratorId']; - } $data = array_merge($routeParams, $body ?? []); diff --git a/src/Identity/Controller/AdministratorController.php b/src/Identity/Controller/AdministratorController.php index 365cf125..c1f173f1 100644 --- a/src/Identity/Controller/AdministratorController.php +++ b/src/Identity/Controller/AdministratorController.php @@ -157,16 +157,16 @@ public function createAdministrator( return $this->json($json, Response::HTTP_CREATED); } - #[Route('/{administratorId}', name: 'get_one', requirements: ['administratorId' => '\d+'], methods: ['GET'])] + #[Route('/{adminId}', name: 'get_one', requirements: ['adminId' => '\d+'], methods: ['GET'])] #[OA\Get( - path: '/api/v2/administrators/{administratorId}', + path: '/api/v2/administrators/{adminId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Get administrator by ID.', summary: 'Get Administrator', tags: ['administrators'], parameters: [ new OA\Parameter( - name: 'administratorId', + name: 'adminId', description: 'Administrator ID', in: 'path', required: true, @@ -194,7 +194,7 @@ public function createAdministrator( )] public function getAdministrator( Request $request, - #[MapEntity(mapping: ['administratorId' => 'id'])] ?Administrator $administrator, + #[MapEntity(mapping: ['adminId' => 'id'])] ?Administrator $administrator, ): JsonResponse { $this->requireAuthentication($request); @@ -206,9 +206,9 @@ public function getAdministrator( return $this->json($json, Response::HTTP_OK); } - #[Route('/{administratorId}', name: 'update', requirements: ['administratorId' => '\d+'], methods: ['PUT'])] + #[Route('/{adminId}', name: 'update', requirements: ['adminId' => '\d+'], methods: ['PUT'])] #[OA\Put( - path: '/api/v2/administrators/{administratorId}', + path: '/api/v2/administrators/{adminId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Update an administrator.', summary: 'Update Administrator', @@ -220,7 +220,7 @@ public function getAdministrator( tags: ['administrators'], parameters: [ new OA\Parameter( - name: 'administratorId', + name: 'adminId', description: 'Administrator ID', in: 'path', required: true, @@ -248,7 +248,7 @@ public function getAdministrator( )] public function updateAdministrator( Request $request, - #[MapEntity(mapping: ['administratorId' => 'id'])] ?Administrator $administrator, + #[MapEntity(mapping: ['adminId' => 'id'])] ?Administrator $administrator, ): JsonResponse { $this->requireAuthentication($request); @@ -263,16 +263,16 @@ public function updateAdministrator( return $this->json($this->normalizer->normalize($administrator), Response::HTTP_OK); } - #[Route('/{administratorId}', name: 'delete', requirements: ['administratorId' => '\d+'], methods: ['DELETE'])] + #[Route('/{adminId}', name: 'delete', requirements: ['adminId' => '\d+'], methods: ['DELETE'])] #[OA\Delete( - path: '/api/v2/administrators/{administratorId}', + path: '/api/v2/administrators/{adminId}', description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' . 'Delete an administrator.', summary: 'Delete Administrator', tags: ['administrators'], parameters: [ new OA\Parameter( - name: 'administratorId', + name: 'adminId', description: 'Administrator ID', in: 'path', required: true, @@ -299,7 +299,7 @@ public function updateAdministrator( )] public function deleteAdministrator( Request $request, - #[MapEntity(mapping: ['administratorId' => 'id'])] ?Administrator $administrator + #[MapEntity(mapping: ['adminId' => 'id'])] ?Administrator $administrator ): JsonResponse { $this->requireAuthentication($request); diff --git a/src/Identity/Request/UpdateAdministratorRequest.php b/src/Identity/Request/UpdateAdministratorRequest.php index f1432d49..b1c24504 100644 --- a/src/Identity/Request/UpdateAdministratorRequest.php +++ b/src/Identity/Request/UpdateAdministratorRequest.php @@ -58,8 +58,6 @@ )] class UpdateAdministratorRequest implements RequestInterface { - public int $administratorId; - #[Assert\Length(min: 3, max: 255)] #[UniqueLoginName] public ?string $loginName = null; @@ -89,7 +87,6 @@ class UpdateAdministratorRequest implements RequestInterface public function getDto(): UpdateAdministratorDto { return new UpdateAdministratorDto( - administratorId: $this->administratorId, loginName: $this->loginName, password: $this->password, email: $this->email, From 65921b7cba1b4c866b7635ecd7c3ea938a559d17 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 11:18:38 +0400 Subject: [PATCH 3/6] Update: remove ids from update dtos --- src/Common/Validator/RequestValidator.php | 6 ------ src/Messaging/Controller/CampaignController.php | 16 ++++++++++++++++ src/Messaging/Request/UpdateMessageRequest.php | 3 --- .../Controller/SubscriberController.php | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/Common/Validator/RequestValidator.php b/src/Common/Validator/RequestValidator.php index df0ae67b..36b2ff80 100644 --- a/src/Common/Validator/RequestValidator.php +++ b/src/Common/Validator/RequestValidator.php @@ -29,12 +29,6 @@ public function validate(Request $request, string $dtoClass): RequestInterface } $routeParams = $request->attributes->get('_route_params') ?? []; - if (isset($routeParams['subscriberId'])) { - $routeParams['subscriberId'] = (int) $routeParams['subscriberId']; - } - if (isset($routeParams['messageId'])) { - $routeParams['messageId'] = (int) $routeParams['messageId']; - } if (isset($routeParams['listId'])) { $routeParams['listId'] = (int) $routeParams['listId']; } diff --git a/src/Messaging/Controller/CampaignController.php b/src/Messaging/Controller/CampaignController.php index b1b8e804..a047c9cd 100644 --- a/src/Messaging/Controller/CampaignController.php +++ b/src/Messaging/Controller/CampaignController.php @@ -144,6 +144,11 @@ public function getMessages(Request $request): JsonResponse response: 403, description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') + ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') ) ] )] @@ -151,6 +156,9 @@ public function getMessage( Request $request, #[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null ): JsonResponse { + if ($message === null) { + throw $this->createNotFoundException('Campaign not found.'); + } $this->requireAuthentication($request); return $this->json($this->campaignService->getMessage($message), Response::HTTP_OK); @@ -271,6 +279,11 @@ public function createMessage(Request $request): JsonResponse description: 'Failure', content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse') ), + new OA\Response( + response: 404, + description: 'Failure', + content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse') + ), new OA\Response( response: 422, description: 'Failure', @@ -282,6 +295,9 @@ public function updateMessage( Request $request, #[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null, ): JsonResponse { + if ($message === null) { + throw $this->createNotFoundException('Campaign not found.'); + } $authUser = $this->requireAuthentication($request); /** @var UpdateMessageRequest $updateMessageRequest */ diff --git a/src/Messaging/Request/UpdateMessageRequest.php b/src/Messaging/Request/UpdateMessageRequest.php index 3f20dc26..7c754e6f 100644 --- a/src/Messaging/Request/UpdateMessageRequest.php +++ b/src/Messaging/Request/UpdateMessageRequest.php @@ -9,12 +9,9 @@ class UpdateMessageRequest extends CreateMessageRequest { - public int $messageId; - public function getDto(): MessageDtoInterface { return new UpdateMessageDto( - messageId: $this->messageId, content: $this->content->getDto(), format: $this->format->getDto(), metadata: $this->metadata->getDto(), diff --git a/src/Subscription/Controller/SubscriberController.php b/src/Subscription/Controller/SubscriberController.php index e144e203..e608afd5 100644 --- a/src/Subscription/Controller/SubscriberController.php +++ b/src/Subscription/Controller/SubscriberController.php @@ -169,7 +169,7 @@ public function updateSubscriber( } /** @var UpdateSubscriberRequest $updateSubscriberRequest */ $updateSubscriberRequest = $this->validator->validate($request, UpdateSubscriberRequest::class); - $subscriber = $this->subscriberManager->updateSubscriber($updateSubscriberRequest->getDto(), $admin); + $subscriber = $this->subscriberManager->updateSubscriber($subscriber, $updateSubscriberRequest->getDto(), $admin); $this->entityManager->flush(); $subscriberData = $this->subscriberNormalizer->normalize($subscriber, 'json'); From 1d54435d5de86f4448c022d73b4b16eb495eb91c Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 11:23:25 +0400 Subject: [PATCH 4/6] Fix: tests --- src/Subscription/Controller/SubscriberController.php | 6 +++++- src/Subscription/Request/UpdateSubscriberRequest.php | 3 --- .../Identity/Request/UpdateAdministratorRequestTest.php | 4 ---- tests/Unit/Messaging/Request/UpdateMessageRequestTest.php | 3 --- .../Subscription/Request/UpdateSubscriberRequestTest.php | 2 -- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/src/Subscription/Controller/SubscriberController.php b/src/Subscription/Controller/SubscriberController.php index e608afd5..cfd18d51 100644 --- a/src/Subscription/Controller/SubscriberController.php +++ b/src/Subscription/Controller/SubscriberController.php @@ -169,7 +169,11 @@ public function updateSubscriber( } /** @var UpdateSubscriberRequest $updateSubscriberRequest */ $updateSubscriberRequest = $this->validator->validate($request, UpdateSubscriberRequest::class); - $subscriber = $this->subscriberManager->updateSubscriber($subscriber, $updateSubscriberRequest->getDto(), $admin); + $subscriber = $this->subscriberManager->updateSubscriber( + subscriber: $subscriber, + subscriberDto: $updateSubscriberRequest->getDto(), + admin: $admin + ); $this->entityManager->flush(); $subscriberData = $this->subscriberNormalizer->normalize($subscriber, 'json'); diff --git a/src/Subscription/Request/UpdateSubscriberRequest.php b/src/Subscription/Request/UpdateSubscriberRequest.php index 4628ccaa..8a4a16fd 100644 --- a/src/Subscription/Request/UpdateSubscriberRequest.php +++ b/src/Subscription/Request/UpdateSubscriberRequest.php @@ -26,8 +26,6 @@ )] class UpdateSubscriberRequest implements RequestInterface { - public int $subscriberId; - #[Assert\NotBlank] #[Assert\Email] #[UniqueEmail(entityClass: Subscriber::class)] @@ -51,7 +49,6 @@ class UpdateSubscriberRequest implements RequestInterface public function getDto(): UpdateSubscriberDto { return new UpdateSubscriberDto( - subscriberId: $this->subscriberId, email: $this->email, confirmed: $this->confirmed, blacklisted: $this->blacklisted, diff --git a/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php b/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php index c8b9c739..7880cb3f 100644 --- a/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php +++ b/tests/Unit/Identity/Request/UpdateAdministratorRequestTest.php @@ -13,7 +13,6 @@ class UpdateAdministratorRequestTest extends TestCase public function testGetDtoReturnsCorrectDto(): void { $request = new UpdateAdministratorRequest(); - $request->administratorId = 123; $request->loginName = 'testuser'; $request->password = 'password123'; $request->email = 'test@example.com'; @@ -27,7 +26,6 @@ public function testGetDtoReturnsCorrectDto(): void $dto = $request->getDto(); - $this->assertEquals(123, $dto->administratorId); $this->assertEquals('testuser', $dto->loginName); $this->assertEquals('password123', $dto->password); $this->assertEquals('test@example.com', $dto->email); @@ -43,11 +41,9 @@ public function testGetDtoReturnsCorrectDto(): void public function testGetDtoWithNullValues(): void { $request = new UpdateAdministratorRequest(); - $request->administratorId = 456; $dto = $request->getDto(); - $this->assertEquals(456, $dto->administratorId); $this->assertNull($dto->loginName); $this->assertNull($dto->password); $this->assertNull($dto->email); diff --git a/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php b/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php index 1b242548..62ebdc35 100644 --- a/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php +++ b/tests/Unit/Messaging/Request/UpdateMessageRequestTest.php @@ -53,7 +53,6 @@ protected function setUp(): void $scheduleRequest->method('getDto')->willReturn($this->scheduleDto); $this->request = new UpdateMessageRequest(); - $this->request->messageId = 123; $this->request->content = $contentRequest; $this->request->format = $formatRequest; $this->request->metadata = $metadataRequest; @@ -68,7 +67,6 @@ public function testGetDtoReturnsCorrectDto(): void $dto = $this->request->getDto(); $this->assertInstanceOf(UpdateMessageDto::class, $dto); - $this->assertEquals(123, $dto->messageId); $this->assertSame($this->contentDto, $dto->content); $this->assertSame($this->formatDto, $dto->format); $this->assertSame($this->metadataDto, $dto->metadata); @@ -84,7 +82,6 @@ public function testGetDtoWithNullTemplateId(): void $dto = $this->request->getDto(); $this->assertInstanceOf(UpdateMessageDto::class, $dto); - $this->assertEquals(123, $dto->messageId); $this->assertSame($this->contentDto, $dto->content); $this->assertSame($this->formatDto, $dto->format); $this->assertSame($this->metadataDto, $dto->metadata); diff --git a/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php b/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php index 16e52575..87158e1b 100644 --- a/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php +++ b/tests/Unit/Subscription/Request/UpdateSubscriberRequestTest.php @@ -13,7 +13,6 @@ class UpdateSubscriberRequestTest extends TestCase public function testGetDtoReturnsCorrectDto(): void { $request = new UpdateSubscriberRequest(); - $request->subscriberId = 123; $request->email = 'subscriber@example.com'; $request->confirmed = true; $request->blacklisted = false; @@ -24,7 +23,6 @@ public function testGetDtoReturnsCorrectDto(): void $dto = $request->getDto(); $this->assertInstanceOf(UpdateSubscriberDto::class, $dto); - $this->assertEquals(123, $dto->subscriberId); $this->assertEquals('subscriber@example.com', $dto->email); $this->assertTrue($dto->confirmed); $this->assertFalse($dto->blacklisted); From ccfc48e91a0d81d496a74b0be245b0087c9c1485 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 11:57:12 +0400 Subject: [PATCH 5/6] Fix: template request --- src/Messaging/Request/CreateTemplateRequest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Messaging/Request/CreateTemplateRequest.php b/src/Messaging/Request/CreateTemplateRequest.php index 664657f3..6b4e8956 100644 --- a/src/Messaging/Request/CreateTemplateRequest.php +++ b/src/Messaging/Request/CreateTemplateRequest.php @@ -51,7 +51,6 @@ class CreateTemplateRequest implements RequestInterface #[Assert\NotNull] public string $title; - #[Assert\NotBlank] #[ContainsPlaceholder] public string $content; From bfdaa4b28538d4453fe879ee25284779583be86c Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 21 Nov 2025 12:10:18 +0400 Subject: [PATCH 6/6] Fix: template request content type --- src/Messaging/Request/CreateTemplateRequest.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Messaging/Request/CreateTemplateRequest.php b/src/Messaging/Request/CreateTemplateRequest.php index 6b4e8956..683ca8fd 100644 --- a/src/Messaging/Request/CreateTemplateRequest.php +++ b/src/Messaging/Request/CreateTemplateRequest.php @@ -16,7 +16,12 @@ required: ['title'], properties: [ new OA\Property(property: 'title', type: 'string', example: 'Newsletter Template'), - new OA\Property(property: 'content', type: 'string', example: '[CONTENT]'), + new OA\Property( + property: 'content', + type: 'string', + example: '[CONTENT]', + nullable: true + ), new OA\Property(property: 'text', type: 'string', example: '[CONTENT]'), new OA\Property( property: 'file', @@ -52,7 +57,7 @@ class CreateTemplateRequest implements RequestInterface public string $title; #[ContainsPlaceholder] - public string $content; + public ?string $content = null; #[ContainsPlaceholder] public ?string $text = null;