Skip to content

Commit ebecab1

Browse files
committed
Send campaign endpoint
1 parent ae2569c commit ebecab1

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

src/Messaging/Controller/CampaignController.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use OpenApi\Attributes as OA;
88
use PhpList\Core\Domain\Messaging\Model\Message;
9+
use PhpList\Core\Domain\Messaging\Service\CampaignProcessor;
910
use PhpList\Core\Security\Authentication;
1011
use PhpList\RestBundle\Common\Controller\BaseController;
1112
use PhpList\RestBundle\Common\Validator\RequestValidator;
@@ -27,14 +28,17 @@
2728
class CampaignController extends BaseController
2829
{
2930
private CampaignService $campaignService;
31+
private CampaignProcessor $campaignProcessor;
3032

3133
public function __construct(
3234
Authentication $authentication,
3335
RequestValidator $validator,
3436
CampaignService $campaignService,
37+
CampaignProcessor $campaignProcessor,
3538
) {
3639
parent::__construct($authentication, $validator);
3740
$this->campaignService = $campaignService;
41+
$this->campaignProcessor = $campaignProcessor;
3842
}
3943

4044
#[Route('', name: 'get_list', methods: ['GET'])]
@@ -340,4 +344,53 @@ public function deleteMessage(
340344

341345
return $this->json(null, Response::HTTP_NO_CONTENT);
342346
}
347+
348+
#[Route('/{messageId}/send', name: 'send_campaign', requirements: ['messageId' => '\d+'], methods: ['POST'])]
349+
#[OA\Post(
350+
path: '/campaigns/{messageId}/send',
351+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
352+
'Processes/sends campaign/message by id.',
353+
summary: 'Processes/sends campaign/message by id.',
354+
tags: ['campaigns'],
355+
parameters: [
356+
new OA\Parameter(
357+
name: 'session',
358+
description: 'Session ID obtained from authentication',
359+
in: 'header',
360+
required: true,
361+
schema: new OA\Schema(
362+
type: 'string'
363+
)
364+
),
365+
new OA\Parameter(
366+
name: 'messageId',
367+
description: 'message ID',
368+
in: 'path',
369+
required: true,
370+
schema: new OA\Schema(type: 'string')
371+
)
372+
],
373+
responses: [
374+
new OA\Response(
375+
response: 200,
376+
description: 'Success',
377+
content: new OA\JsonContent(ref: '#/components/schemas/Message')
378+
),
379+
new OA\Response(
380+
response: 403,
381+
description: 'Failure',
382+
content: new OA\JsonContent(ref: '#/components/schemas/UnauthorizedResponse')
383+
)
384+
]
385+
)]
386+
public function sendMessage(
387+
Request $request,
388+
#[MapEntity(mapping: ['messageId' => 'id'])] ?Message $message = null
389+
): JsonResponse {
390+
$this->requireAuthentication($request);
391+
392+
$this->campaignProcessor->process($message);
393+
394+
return $this->json($this->campaignService->getMessage($message), Response::HTTP_OK);
395+
}
343396
}

tests/Integration/Messaging/Controller/CampaignControllerTest.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,27 @@ public function testDeleteCampaignReturnsNoContent(): void
8787
$this->authenticatedJsonRequest('DELETE', '/api/v2/campaigns/1');
8888
$this->assertHttpNoContent();
8989
}
90+
public function testSendMessageWithoutSessionReturnsForbidden(): void
91+
{
92+
$this->loadFixtures([MessageFixture::class]);
93+
self::getClient()->request('POST', '/api/v2/campaigns/1/send');
94+
$this->assertHttpForbidden();
95+
}
96+
97+
public function testSendMessageWithValidSessionReturnsOkay(): void
98+
{
99+
$this->loadFixtures([AdministratorFixture::class, MessageFixture::class]);
100+
101+
$this->authenticatedJsonRequest('POST', '/api/v2/campaigns/1/send');
102+
$this->assertHttpOkay();
103+
104+
$response = $this->getDecodedJsonResponseContent();
105+
self::assertSame(1, $response['id']);
106+
}
107+
108+
public function testSendMessageWithInvalidIdReturnsNotFound(): void
109+
{
110+
$this->authenticatedJsonRequest('POST', '/api/v2/campaigns/999/send');
111+
$this->assertHttpNotFound();
112+
}
90113
}

0 commit comments

Comments
 (0)