Skip to content

Commit cde97d5

Browse files
committed
Add PublicSubscriptionRequest class and update subscribe method in SubscriptionController
1 parent 3a57f7b commit cde97d5

16 files changed

Lines changed: 471 additions & 527 deletions

config/services/validators.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ services:
4242
autoconfigure: true
4343
tags: [ 'validator.constraint_validator' ]
4444

45+
PhpList\RestBundle\Subscription\Validator\Constraint\ListExistsPublicValidator:
46+
autowire: true
47+
autoconfigure: true
48+
tags: [ 'validator.constraint_validator' ]
49+
4550
PhpList\RestBundle\Subscription\Validator\Constraint\ValidPublicSubscriptionValidator:
4651
autowire: true
4752
autoconfigure: true

src/Subscription/Controller/SubscribePageController.php

Lines changed: 56 additions & 202 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,13 @@
99
use PhpList\Core\Domain\Common\Model\Filter\PaginatedFilter;
1010
use PhpList\Core\Domain\Identity\Model\PrivilegeFlag;
1111
use PhpList\Core\Domain\Subscription\Model\SubscribePage;
12-
use PhpList\Core\Domain\Subscription\Model\SubscriberList;
1312
use PhpList\Core\Domain\Subscription\Service\Manager\SubscribePageManager;
14-
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberAttributeManager;
15-
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriptionManager;
1613
use PhpList\Core\Security\Authentication;
1714
use PhpList\RestBundle\Common\Controller\BaseController;
1815
use PhpList\RestBundle\Common\Service\Provider\PaginatedDataProvider;
1916
use PhpList\RestBundle\Common\Validator\RequestValidator;
20-
use PhpList\RestBundle\Subscription\Request\PublicSubscriptionRequest;
2117
use PhpList\RestBundle\Subscription\Request\SubscribePageRequest;
2218
use PhpList\RestBundle\Subscription\Serializer\SubscribePageNormalizer;
23-
use PhpList\RestBundle\Subscription\Serializer\SubscribePagePublicNormalizer;
24-
use PhpList\RestBundle\Subscription\Serializer\SubscriptionNormalizer;
2519
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
2620
use Symfony\Component\HttpFoundation\JsonResponse;
2721
use Symfony\Component\HttpFoundation\Request;
@@ -38,9 +32,6 @@ public function __construct(
3832
private readonly SubscribePageNormalizer $normalizer,
3933
private readonly EntityManagerInterface $entityManager,
4034
private readonly PaginatedDataProvider $paginatedProvider,
41-
private readonly SubscriptionManager $subscriptionManager,
42-
private readonly SubscriptionNormalizer $subscriptionNormalizer,
43-
private readonly SubscriberAttributeManager $subscriberAttributeManager,
4435
) {
4536
parent::__construct($authentication, $validator);
4637
}
@@ -120,101 +111,7 @@ className: SubscribePage::class,
120111
);
121112
}
122113

123-
#[Route('/{id}', name: 'get', requirements: ['id' => '\\d+'], methods: ['GET'])]
124-
#[OA\Get(
125-
path: '/api/v2/subscribe-pages/{id}',
126-
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
127-
summary: 'Get subscribe page',
128-
tags: ['subscriptions'],
129-
parameters: [
130-
new OA\Parameter(
131-
name: 'php-auth-pw',
132-
description: 'Session key obtained from login',
133-
in: 'header',
134-
required: false,
135-
schema: new OA\Schema(type: 'string')
136-
),
137-
new OA\Parameter(
138-
name: 'id',
139-
description: 'Subscribe page ID',
140-
in: 'path',
141-
required: true,
142-
schema: new OA\Schema(type: 'integer')
143-
)
144-
],
145-
responses: [
146-
new OA\Response(
147-
response: 200,
148-
description: 'Success',
149-
content: new OA\JsonContent(ref: '#/components/schemas/SubscribePage'),
150-
),
151-
new OA\Response(
152-
response: 403,
153-
description: 'Failure',
154-
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
155-
),
156-
new OA\Response(
157-
response: 404,
158-
description: 'Not Found',
159-
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
160-
),
161-
]
162-
)]
163-
public function getPage(Request $request): JsonResponse
164-
{
165-
$admin = $this->requireAuthentication($request);
166-
if (!$admin->getPrivileges()->has(PrivilegeFlag::Subscribers)) {
167-
throw $this->createAccessDeniedException('You are not allowed to view subscribe pages.');
168-
}
169-
170-
$page = $this->subscribePageManager->findPage(id: (int) $request->get('id'));
171-
if (!$page) {
172-
throw $this->createNotFoundException('Subscribe page not found');
173-
}
174-
175-
return $this->json($this->normalizer->normalize($page), Response::HTTP_OK);
176-
}
177-
178-
#[Route('/{id}/public', name: 'get_public', requirements: ['id' => '\\d+'], methods: ['GET'])]
179-
#[OA\Get(
180-
path: '/api/v2/subscribe-pages/{id}/public',
181-
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
182-
summary: 'Get public subscribe page (placeholders replaced with actual values)',
183-
tags: ['subscriptions'],
184-
parameters: [
185-
new OA\Parameter(
186-
name: 'id',
187-
description: 'Subscribe page ID',
188-
in: 'path',
189-
required: true,
190-
schema: new OA\Schema(type: 'integer')
191-
)
192-
],
193-
responses: [
194-
new OA\Response(
195-
response: 200,
196-
description: 'Success',
197-
content: new OA\JsonContent(ref: '#/components/schemas/SubscribePagePublic'),
198-
),
199-
new OA\Response(
200-
response: 404,
201-
description: 'Not Found',
202-
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
203-
),
204-
]
205-
)]
206-
public function getPublicPage(Request $request, SubscribePagePublicNormalizer $normalizer): JsonResponse
207-
{
208-
$page = $this->subscribePageManager->findPublicPage(id: (int) $request->get('id'));
209-
210-
if (!$page || $page->isActive() === false) {
211-
throw $this->createNotFoundException('Subscribe page not found');
212-
}
213-
214-
return $this->json($normalizer->normalize($page), Response::HTTP_OK);
215-
}
216-
217-
#[Route('', name: 'create', methods: ['POST'])]
114+
#[Route('/', name: 'create', methods: ['POST'])]
218115
#[OA\Post(
219116
path: '/api/v2/subscribe-pages',
220117
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
@@ -288,6 +185,61 @@ public function createPage(Request $request): JsonResponse
288185
return $this->json($this->normalizer->normalize($page), Response::HTTP_CREATED);
289186
}
290187

188+
#[Route('/{id}', name: 'get', requirements: ['id' => '\\d+'], methods: ['GET'])]
189+
#[OA\Get(
190+
path: '/api/v2/subscribe-pages/{id}',
191+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.',
192+
summary: 'Get subscribe page',
193+
tags: ['subscriptions'],
194+
parameters: [
195+
new OA\Parameter(
196+
name: 'php-auth-pw',
197+
description: 'Session key obtained from login',
198+
in: 'header',
199+
required: false,
200+
schema: new OA\Schema(type: 'string')
201+
),
202+
new OA\Parameter(
203+
name: 'id',
204+
description: 'Subscribe page ID',
205+
in: 'path',
206+
required: true,
207+
schema: new OA\Schema(type: 'integer')
208+
)
209+
],
210+
responses: [
211+
new OA\Response(
212+
response: 200,
213+
description: 'Success',
214+
content: new OA\JsonContent(ref: '#/components/schemas/SubscribePage'),
215+
),
216+
new OA\Response(
217+
response: 403,
218+
description: 'Failure',
219+
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
220+
),
221+
new OA\Response(
222+
response: 404,
223+
description: 'Not Found',
224+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
225+
),
226+
]
227+
)]
228+
public function getPage(Request $request): JsonResponse
229+
{
230+
$admin = $this->requireAuthentication($request);
231+
if (!$admin->getPrivileges()->has(PrivilegeFlag::Subscribers)) {
232+
throw $this->createAccessDeniedException('You are not allowed to view subscribe pages.');
233+
}
234+
235+
$page = $this->subscribePageManager->findPage(id: (int) $request->get('id'));
236+
if (!$page) {
237+
throw $this->createNotFoundException('Subscribe page not found');
238+
}
239+
240+
return $this->json($this->normalizer->normalize($page), Response::HTTP_OK);
241+
}
242+
291243
#[Route('/{id}', name: 'update', requirements: ['id' => '\\d+'], methods: ['PUT'])]
292244
#[OA\Put(
293245
path: '/api/v2/subscribe-pages/{id}',
@@ -433,102 +385,4 @@ public function deletePage(
433385

434386
return $this->json(null, Response::HTTP_NO_CONTENT);
435387
}
436-
437-
#[Route(
438-
'/{id}/lists/{listId}/subscribers',
439-
name: 'subscribe',
440-
requirements: ['listId' => '\d+', 'id' => '\d+'],
441-
methods: ['POST']
442-
)]
443-
#[OA\Post(
444-
path: '/api/v2/subscribe-pages/{id}/lists/{listId}/subscribers',
445-
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production.' .
446-
'Subscribe subscriber to a list from subscribe page.',
447-
summary: 'Create subscription',
448-
requestBody: new OA\RequestBody(
449-
description: '',
450-
required: true,
451-
content: new OA\JsonContent(ref: '#/components/schemas/PublicSubscriptionRequest')
452-
),
453-
tags: ['subscriptions'],
454-
parameters: [
455-
new OA\Parameter(
456-
name: 'listId',
457-
description: 'List ID',
458-
in: 'path',
459-
required: true,
460-
schema: new OA\Schema(type: 'string')
461-
),
462-
new OA\Parameter(
463-
name: 'id',
464-
description: 'Subscribe page ID',
465-
in: 'path',
466-
required: true,
467-
schema: new OA\Schema(type: 'integer')
468-
),
469-
],
470-
responses: [
471-
new OA\Response(
472-
response: 201,
473-
description: 'Success',
474-
content: new OA\JsonContent(
475-
type: 'array',
476-
items: new OA\Items(ref: '#/components/schemas/Subscription')
477-
)
478-
),
479-
new OA\Response(
480-
response: 400,
481-
description: 'Failure',
482-
content: new OA\JsonContent(ref: '#/components/schemas/BadRequestResponse')
483-
),
484-
new OA\Response(
485-
response: 404,
486-
description: 'Failure',
487-
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
488-
),
489-
new OA\Response(
490-
response: 422,
491-
description: 'Failure',
492-
content: new OA\JsonContent(ref: '#/components/schemas/ValidationErrorResponse')
493-
),
494-
]
495-
)]
496-
public function subscribe(
497-
Request $request,
498-
int $id,
499-
#[MapEntity(mapping: ['listId' => 'id'])] ?SubscriberList $list = null,
500-
): JsonResponse {
501-
$page = $this->subscribePageManager->findPublicPage(id: $id);
502-
if (!$list || !$page) {
503-
throw $this->createNotFoundException('Subscriber list or subscribe page not found.');
504-
}
505-
506-
/** @var PublicSubscriptionRequest $subscriptionRequest */
507-
$subscriptionRequest = $this->validator->validate(
508-
request: $request,
509-
dtoClass: PublicSubscriptionRequest::class,
510-
beforeValidation: static function (PublicSubscriptionRequest $dto) use ($page): void {
511-
$dto->setSubscribePage($page);
512-
}
513-
);
514-
$subscriberEmail = $subscriptionRequest->email;
515-
$subscriptions = $this->subscriptionManager->createSubscriptions(
516-
subscriberList: $list,
517-
emails: [$subscriberEmail],
518-
autoConfirm: false,
519-
);
520-
$this->entityManager->flush();
521-
522-
if ($subscriptionRequest->attributes !== []) {
523-
$this->subscriberAttributeManager->processAttributes(
524-
subscriber: $subscriptions[0]->getSubscriber(),
525-
attributeData: $subscriptionRequest->attributes
526-
);
527-
}
528-
$this->entityManager->flush();
529-
530-
$normalized = array_map(fn($item) => $this->subscriptionNormalizer->normalize($item), $subscriptions);
531-
532-
return $this->json($normalized, Response::HTTP_CREATED);
533-
}
534388
}

0 commit comments

Comments
 (0)