Skip to content

Commit 880aecd

Browse files
committed
CampaignActionController
1 parent 9bbad8b commit 880aecd

File tree

5 files changed

+364
-313
lines changed

5 files changed

+364
-313
lines changed
Lines changed: 284 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,284 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Messaging\Controller;
6+
7+
use Doctrine\ORM\EntityManagerInterface;
8+
use OpenApi\Attributes as OA;
9+
use PhpList\Core\Domain\Messaging\Message\SyncCampaignProcessorMessage;
10+
use PhpList\Core\Domain\Messaging\Model\Message;
11+
use PhpList\Core\Domain\Messaging\Model\Message\MessageStatus;
12+
use PhpList\Core\Domain\Messaging\Service\Manager\MessageManager;
13+
use PhpList\Core\Security\Authentication;
14+
use PhpList\RestBundle\Common\Controller\BaseController;
15+
use PhpList\RestBundle\Common\Validator\RequestValidator;
16+
use PhpList\RestBundle\Messaging\Request\Message\MessageMetadataRequest;
17+
use PhpList\RestBundle\Messaging\Request\ResendMessageToListsRequest;
18+
use PhpList\RestBundle\Messaging\Service\CampaignService;
19+
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
20+
use Symfony\Component\HttpFoundation\JsonResponse;
21+
use Symfony\Component\HttpFoundation\Request;
22+
use Symfony\Component\HttpFoundation\Response;
23+
use Symfony\Component\Messenger\MessageBusInterface;
24+
use Symfony\Component\Routing\Attribute\Route;
25+
26+
/**
27+
* This controller provides REST API to manage campaign actions.
28+
*
29+
* @author Tatevik Grigoryan <tatevik@phplist.com>
30+
*/
31+
#[Route('/campaigns', name: 'campaign_')]
32+
class CampaignActionController extends BaseController
33+
{
34+
public function __construct(
35+
Authentication $authentication,
36+
RequestValidator $validator,
37+
private readonly CampaignService $campaignService,
38+
private readonly MessageBusInterface $messageBus,
39+
private readonly EntityManagerInterface $entityManager,
40+
private readonly MessageManager $messageManager,
41+
) {
42+
parent::__construct($authentication, $validator);
43+
}
44+
45+
#[Route('/{messageId}/copy', name: 'copy_campaign', requirements: ['messageId' => '\d+'], methods: ['POST'])]
46+
#[OA\Post(
47+
path: '/api/v2/campaigns/{messageId}/copy',
48+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
49+
'Copies campaign/message by id into a draft message.',
50+
summary: 'Copies campaign/message by id.',
51+
tags: ['campaigns'],
52+
parameters: [
53+
new OA\Parameter(
54+
name: 'php-auth-pw',
55+
description: 'Session key obtained from login',
56+
in: 'header',
57+
required: true,
58+
schema: new OA\Schema(type: 'string')
59+
),
60+
new OA\Parameter(
61+
name: 'messageId',
62+
description: 'message ID',
63+
in: 'path',
64+
required: true,
65+
schema: new OA\Schema(type: 'string')
66+
)
67+
],
68+
responses: [
69+
new OA\Response(
70+
response: 201,
71+
description: 'Success',
72+
content: new OA\JsonContent(ref: '#/components/schemas/Message')
73+
),
74+
new OA\Response(
75+
response: 403,
76+
description: 'Failure',
77+
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
78+
)
79+
]
80+
)]
81+
public function copyMessage(
82+
Request $request,
83+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null
84+
): JsonResponse {
85+
$authUser = $this->requireAuthentication($request);
86+
if ($message === null) {
87+
throw $this->createNotFoundException('Campaign not found.');
88+
}
89+
90+
$message = $this->messageManager->copyAsDraftMessage($message, $authUser);
91+
$this->entityManager->flush();
92+
93+
return $this->json($this->campaignService->getMessage($message), Response::HTTP_CREATED);
94+
}
95+
96+
#[Route('/{messageId}/status', name: 'update_status', requirements: ['messageId' => '\d+'], methods: ['PATCH'])]
97+
#[OA\Patch(
98+
path: '/api/v2/campaigns/{messageId}/status',
99+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
100+
'Updates campaign/message status by id.',
101+
summary: 'Update campaign status by id.',
102+
requestBody: new OA\RequestBody(
103+
description: 'Update message status.',
104+
required: true,
105+
content: new OA\JsonContent(ref: '#/components/schemas/MessageMetadataRequest')
106+
),
107+
tags: ['campaigns'],
108+
parameters: [
109+
new OA\Parameter(
110+
name: 'php-auth-pw',
111+
description: 'Session key obtained from login',
112+
in: 'header',
113+
required: true,
114+
schema: new OA\Schema(
115+
type: 'string'
116+
)
117+
),
118+
new OA\Parameter(
119+
name: 'messageId',
120+
description: 'message ID',
121+
in: 'path',
122+
required: true,
123+
schema: new OA\Schema(type: 'string')
124+
)
125+
],
126+
responses: [
127+
new OA\Response(
128+
response: 200,
129+
description: 'Success',
130+
content: new OA\JsonContent(ref: '#/components/schemas/Message')
131+
),
132+
new OA\Response(
133+
response: 403,
134+
description: 'Failure',
135+
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
136+
),
137+
new OA\Response(
138+
response: 404,
139+
description: 'Failure',
140+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
141+
),
142+
new OA\Response(
143+
response: 422,
144+
description: 'Failure',
145+
content: new OA\JsonContent(ref: '#/components/schemas/ValidationErrorResponse')
146+
),
147+
]
148+
)]
149+
public function updateMessageStatus(
150+
Request $request,
151+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null,
152+
): JsonResponse {
153+
$this->requireAuthentication($request);
154+
if ($message === null) {
155+
throw $this->createNotFoundException('Message not found.');
156+
}
157+
158+
/** @var MessageMetadataRequest $messageMetadataRequest */
159+
$messageMetadataRequest = $this->validator->validate($request, MessageMetadataRequest::class);
160+
161+
$message = $this->messageManager->updateStatus(
162+
$message,
163+
MessageStatus::from($messageMetadataRequest->status),
164+
);
165+
$this->entityManager->flush();
166+
167+
return $this->json($message, Response::HTTP_OK);
168+
}
169+
170+
#[Route('/{messageId}/send', name: 'send_campaign', requirements: ['messageId' => '\d+'], methods: ['POST'])]
171+
#[OA\Post(
172+
path: '/api/v2/campaigns/{messageId}/send',
173+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
174+
'Processes/sends campaign/message by id.',
175+
summary: 'Processes/sends campaign/message by id.',
176+
tags: ['campaigns'],
177+
parameters: [
178+
new OA\Parameter(
179+
name: 'php-auth-pw',
180+
description: 'Session key obtained from login',
181+
in: 'header',
182+
required: true,
183+
schema: new OA\Schema(type: 'string')
184+
),
185+
new OA\Parameter(
186+
name: 'messageId',
187+
description: 'message ID',
188+
in: 'path',
189+
required: true,
190+
schema: new OA\Schema(type: 'string')
191+
)
192+
],
193+
responses: [
194+
new OA\Response(
195+
response: 200,
196+
description: 'Success',
197+
content: new OA\JsonContent(ref: '#/components/schemas/Message')
198+
),
199+
new OA\Response(
200+
response: 403,
201+
description: 'Failure',
202+
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
203+
),
204+
new OA\Response(
205+
response: 404,
206+
description: 'Failure',
207+
content: new OA\JsonContent(ref: '#/components/schemas/NotFoundErrorResponse')
208+
),
209+
]
210+
)]
211+
public function sendMessage(
212+
Request $request,
213+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null
214+
): JsonResponse {
215+
$this->requireAuthentication($request);
216+
if ($message === null) {
217+
throw $this->createNotFoundException('Campaign not found.');
218+
}
219+
220+
$this->messageBus->dispatch(new SyncCampaignProcessorMessage($message->getId()));
221+
222+
return $this->json($this->campaignService->getMessage($message), Response::HTTP_OK);
223+
}
224+
225+
#[Route('/{messageId}/resend', name: 'resend_campaign', requirements: ['messageId' => '\d+'], methods: ['POST'])]
226+
#[OA\Post(
227+
path: '/api/v2/campaigns/{messageId}/resend',
228+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
229+
'Processes/sends campaign/message by id to specified mailing lists.',
230+
summary: 'Processes/sends campaign/message by id to lists.',
231+
requestBody: new OA\RequestBody(
232+
description: 'List ids to send this campaign to.',
233+
required: true,
234+
content: new OA\JsonContent(ref: '#/components/schemas/ResendMessageToListsRequest')
235+
),
236+
tags: ['campaigns'],
237+
parameters: [
238+
new OA\Parameter(
239+
name: 'php-auth-pw',
240+
description: 'Session key obtained from login',
241+
in: 'header',
242+
required: true,
243+
schema: new OA\Schema(type: 'string')
244+
),
245+
new OA\Parameter(
246+
name: 'messageId',
247+
description: 'message ID',
248+
in: 'path',
249+
required: true,
250+
schema: new OA\Schema(type: 'string')
251+
)
252+
],
253+
responses: [
254+
new OA\Response(
255+
response: 200,
256+
description: 'Success',
257+
content: new OA\JsonContent(ref: '#/components/schemas/Message')
258+
),
259+
new OA\Response(
260+
response: 403,
261+
description: 'Failure',
262+
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
263+
)
264+
]
265+
)]
266+
public function resendMessageToLists(
267+
Request $request,
268+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null
269+
): JsonResponse {
270+
$this->requireAuthentication($request);
271+
if ($message === null) {
272+
throw $this->createNotFoundException('Campaign not found.');
273+
}
274+
275+
/** @var ResendMessageToListsRequest $resendToListsRequest */
276+
$resendToListsRequest = $this->validator->validate($request, ResendMessageToListsRequest::class);
277+
278+
$this->messageBus->dispatch(
279+
new SyncCampaignProcessorMessage($message->getId(), $resendToListsRequest->listIds)
280+
);
281+
282+
return $this->json($this->campaignService->getMessage($message), Response::HTTP_OK);
283+
}
284+
}

0 commit comments

Comments
 (0)