Skip to content

Commit 33986d7

Browse files
committed
ISSUE-345: style fix
1 parent 24c5f75 commit 33986d7

File tree

6 files changed

+106
-96
lines changed

6 files changed

+106
-96
lines changed

src/Common/Controller/BaseController.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Symfony\Component\HttpFoundation\Request;
1212
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
1313

14+
/** @SuppressWarnings(PHPMD.NumberOfChildren) */
1415
abstract class BaseController extends AbstractController
1516
{
1617
protected Authentication $authentication;

src/Statistics/Controller/AnalyticsController.php

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,26 +25,27 @@ class AnalyticsController extends BaseController
2525
{
2626
public const BATCH_SIZE = 20;
2727
private AnalyticsService $analyticsService;
28-
private CampaignStatisticsNormalizer $campaignStatisticsNormalizer;
29-
private ViewOpensStatisticsNormalizer $viewOpensStatisticsNormalizer;
28+
private CampaignStatisticsNormalizer $campaignStatsNormalizer;
29+
private ViewOpensStatisticsNormalizer $viewOpensStatsNormalizer;
3030

3131
public function __construct(
3232
Authentication $authentication,
3333
RequestValidator $validator,
3434
AnalyticsService $analyticsService,
35-
CampaignStatisticsNormalizer $campaignStatisticsNormalizer,
36-
ViewOpensStatisticsNormalizer $viewOpensStatisticsNormalizer
35+
CampaignStatisticsNormalizer $campaignStatsNormalizer,
36+
ViewOpensStatisticsNormalizer $viewOpensStatsNormalizer
3737
) {
3838
parent::__construct($authentication, $validator);
3939
$this->analyticsService = $analyticsService;
40-
$this->campaignStatisticsNormalizer = $campaignStatisticsNormalizer;
41-
$this->viewOpensStatisticsNormalizer = $viewOpensStatisticsNormalizer;
40+
$this->campaignStatsNormalizer = $campaignStatsNormalizer;
41+
$this->viewOpensStatsNormalizer = $viewOpensStatsNormalizer;
4242
}
4343

4444
#[Route('/campaigns', name: 'campaign_statistics', methods: ['GET'])]
4545
#[OA\Get(
4646
path: '/analytics/campaigns',
47-
description: 'Returns statistics overview for campaigns.',
47+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
48+
'Returns statistics overview for campaigns.',
4849
summary: 'Gets campaign statistics.',
4950
tags: ['analytics'],
5051
parameters: [
@@ -106,7 +107,7 @@ public function getCampaignStatistics(Request $request): JsonResponse
106107
$lastId = (int) $request->query->get('after_id', 0);
107108

108109
$data = $this->analyticsService->getCampaignStatistics($limit, $lastId);
109-
$normalizedData = $this->campaignStatisticsNormalizer->normalize($data, null, [
110+
$normalizedData = $this->campaignStatsNormalizer->normalize($data, null, [
110111
'limit' => $limit,
111112
'campaign_statistics' => true,
112113
]);
@@ -117,7 +118,8 @@ public function getCampaignStatistics(Request $request): JsonResponse
117118
#[Route('/view-opens', name: 'view_opens_statistics', methods: ['GET'])]
118119
#[OA\Get(
119120
path: '/analytics/view-opens',
120-
description: 'Returns statistics for view opens.',
121+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
122+
'Returns statistics for view opens.',
121123
summary: 'Gets view opens statistics.',
122124
tags: ['analytics'],
123125
parameters: [
@@ -179,7 +181,7 @@ public function getViewOpensStatistics(Request $request): JsonResponse
179181
$lastId = (int) $request->query->get('after_id', 0);
180182

181183
$data = $this->analyticsService->getViewOpensStatistics($limit, $lastId);
182-
$normalizedData = $this->viewOpensStatisticsNormalizer->normalize($data, null, [
184+
$normalizedData = $this->viewOpensStatsNormalizer->normalize($data, null, [
183185
'view_opens_statistics' => true,
184186
'limit' => $limit
185187
]);
@@ -190,7 +192,8 @@ public function getViewOpensStatistics(Request $request): JsonResponse
190192
#[Route('/domains/top', name: 'top_domains', methods: ['GET'])]
191193
#[OA\Get(
192194
path: '/analytics/domains/top',
193-
description: 'Returns statistics for the top domains with more than 5 subscribers.',
195+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
196+
'Returns statistics for the top domains with more than 5 subscribers.',
194197
summary: 'Gets top domains statistics.',
195198
tags: ['analytics'],
196199
parameters: [
@@ -265,7 +268,8 @@ public function getTopDomains(Request $request): JsonResponse
265268
#[Route('/domains/confirmation', name: 'domain_confirmation_statistics', methods: ['GET'])]
266269
#[OA\Get(
267270
path: '/analytics/domains/confirmation',
268-
description: 'Returns statistics for domains showing confirmation status.',
271+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
272+
'Returns statistics for domains showing confirmation status.',
269273
summary: 'Gets domain confirmation statistics.',
270274
tags: ['analytics'],
271275
parameters: [
@@ -363,7 +367,8 @@ public function getDomainConfirmationStatistics(Request $request): JsonResponse
363367
#[Route('/local-parts/top', name: 'top_local_parts', methods: ['GET'])]
364368
#[OA\Get(
365369
path: '/analytics/local-parts/top',
366-
description: 'Returns statistics for the top local-parts of email addresses.',
370+
description: '🚧 **Status: Beta** – This method is under development. Avoid using in production. ' .
371+
'Returns statistics for the top local-parts of email addresses.',
367372
summary: 'Gets top local-parts statistics.',
368373
tags: ['analytics'],
369374
parameters: [

src/Statistics/Serializer/CampaignStatisticsNormalizer.php

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,51 +10,51 @@
1010
class CampaignStatisticsNormalizer implements NormalizerInterface
1111
{
1212
/**
13-
* Normalizes campaign statistics data into an array.
14-
*
15-
* @param mixed $object The object to normalize
16-
* @param string|null $format The format being (de)serialized from or into
17-
* @param array $context Context options for the normalizer
18-
*
19-
* @return array
13+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
2014
*/
2115
public function normalize(mixed $object, string $format = null, array $context = []): array
2216
{
2317
if (!is_array($object) || !isset($object['campaigns'])) {
2418
return [];
2519
}
2620

21+
$items = [];
22+
foreach ($object['campaigns'] as $item) {
23+
$items[] = $this->normalizeCampaign($item);
24+
}
25+
return [
26+
'items' => $items,
27+
'pagination' => $this->normalizePagination($object, $context),
28+
];
29+
}
30+
31+
private function normalizeCampaign(array $campaign): array
32+
{
33+
return [
34+
'campaign_id' => $campaign['campaignId'] ?? 0,
35+
'subject' => $campaign['subject'] ?? '',
36+
'sent' => $campaign['sent'] ?? 0,
37+
'bounces' => $campaign['bounces'] ?? 0,
38+
'forwards' => $campaign['forwards'] ?? 0,
39+
'unique_views' => $campaign['uniqueViews'] ?? 0,
40+
'total_clicks' => $campaign['totalClicks'] ?? 0,
41+
'unique_clicks' => $campaign['uniqueClicks'] ?? 0,
42+
'date_sent' => $campaign['dateSent'] ?? null,
43+
];
44+
}
45+
46+
private function normalizePagination(array $object, array $context): array
47+
{
2748
return [
28-
'items' => array_map(function ($campaign) {
29-
return [
30-
'campaign_id' => $campaign['campaignId'] ?? 0,
31-
'subject' => $campaign['subject'] ?? '',
32-
'sent' => $campaign['sent'] ?? 0,
33-
'bounces' => $campaign['bounces'] ?? 0,
34-
'forwards' => $campaign['forwards'] ?? 0,
35-
'unique_views' => $campaign['uniqueViews'] ?? 0,
36-
'total_clicks' => $campaign['totalClicks'] ?? 0,
37-
'unique_clicks' => $campaign['uniqueClicks'] ?? 0,
38-
'date_sent' => $campaign['dateSent'] ?? null,
39-
];
40-
}, $object['campaigns']),
41-
'pagination' => [
42-
'total' => $object['total'] ?? 0,
43-
'limit' => $context['limit'] ?? AnalyticsController::BATCH_SIZE,
44-
'has_more' => $object['hasMore'] ?? false,
45-
'next_cursor' => $object['lastId'] ? $object['lastId'] + 1 : 0,
46-
],
49+
'total' => $object['total'] ?? 0,
50+
'limit' => $context['limit'] ?? AnalyticsController::BATCH_SIZE,
51+
'has_more' => $object['hasMore'] ?? false,
52+
'next_cursor' => $object['lastId'] ? $object['lastId'] + 1 : 0,
4753
];
4854
}
4955

5056
/**
51-
* Checks whether the given class is supported for normalization by this normalizer.
52-
*
53-
* @param mixed $data Data to normalize
54-
* @param string|null $format The format being (de)serialized from or into
55-
* @param array $context Context options for the normalizer
56-
*
57-
* @return bool
57+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
5858
*/
5959
public function supportsNormalization(mixed $data, string $format = null, array $context = []): bool
6060
{

src/Statistics/Serializer/ViewOpensStatisticsNormalizer.php

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,48 @@
1010
class ViewOpensStatisticsNormalizer implements NormalizerInterface
1111
{
1212
/**
13-
* Normalizes view opens statistics data into an array.
14-
*
15-
* @param mixed $object The object to normalize
16-
* @param string|null $format The format being (de)serialized from or into
17-
* @param array $context Context options for the normalizer
18-
*
19-
* @return array
13+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
2014
*/
2115
public function normalize(mixed $object, string $format = null, array $context = []): array
2216
{
2317
if (!is_array($object) || !isset($object['campaigns'])) {
2418
return [];
2519
}
2620

21+
$items = [];
22+
foreach ($object['campaigns'] as $item) {
23+
$items[] = $this->normalizeCampaign($item);
24+
}
25+
26+
return [
27+
'items' => $items,
28+
'pagination' => $this->normalizePagination($object, $context),
29+
];
30+
}
31+
32+
private function normalizeCampaign(array $item): array
33+
{
34+
return [
35+
'campaign_id' => $item['campaignId'] ?? 0,
36+
'subject' => $item['subject'] ?? '',
37+
'sent' => $item['sent'] ?? 0,
38+
'unique_views' => $item['uniqueViews'] ?? 0,
39+
'rate' => $item['rate'] ?? 0.0,
40+
];
41+
}
42+
43+
private function normalizePagination(array $object, array $context): array
44+
{
2745
return [
28-
'items' => array_map(function ($item) {
29-
return [
30-
'campaign_id' => $item['campaignId'] ?? 0,
31-
'subject' => $item['subject'] ?? '',
32-
'sent' => $item['sent'] ?? 0,
33-
'unique_views' => $item['uniqueViews'] ?? 0,
34-
'rate' => $item['rate'] ?? 0.0,
35-
];
36-
}, $object['campaigns']),
37-
'pagination' => [
38-
'total' => $object['total'] ?? 0,
39-
'limit' => $context['limit'] ?? AnalyticsController::BATCH_SIZE,
40-
'has_more' => $object['hasMore'] ?? false,
41-
'next_cursor' => $object['lastId'] ? $object['lastId'] + 1 : 0,
42-
],
46+
'total' => $object['total'] ?? 0,
47+
'limit' => $context['limit'] ?? AnalyticsController::BATCH_SIZE,
48+
'has_more' => $object['hasMore'] ?? false,
49+
'next_cursor' => $object['lastId'] ? $object['lastId'] + 1 : 0,
4350
];
4451
}
4552

4653
/**
47-
* Checks whether the given class is supported for normalization by this normalizer.
48-
*
49-
* @param mixed $data Data to normalize
50-
* @param string|null $format The format being (de)serialized from or into
51-
* @param array $context Context options for the normalizer
52-
*
53-
* @return bool
54+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
5455
*/
5556
public function supportsNormalization(mixed $data, string $format = null, array $context = []): bool
5657
{
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Helpers;
6+
7+
use PhpList\RestBundle\Statistics\Controller\AnalyticsController;
8+
use Symfony\Component\HttpFoundation\JsonResponse;
9+
10+
class DummyAnalyticsController extends AnalyticsController
11+
{
12+
protected function json($data, int $status = 200, array $headers = [], array $context = []): JsonResponse
13+
{
14+
return new JsonResponse($data, $status, $headers);
15+
}
16+
}

tests/Unit/Statistics/Controller/AnalyticsControllerTest.php

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,48 +13,35 @@
1313
use PhpList\RestBundle\Statistics\Controller\AnalyticsController;
1414
use PhpList\RestBundle\Statistics\Serializer\CampaignStatisticsNormalizer;
1515
use PhpList\RestBundle\Statistics\Serializer\ViewOpensStatisticsNormalizer;
16+
use PhpList\RestBundle\Tests\Helpers\DummyAnalyticsController;
1617
use PHPUnit\Framework\MockObject\MockObject;
1718
use PHPUnit\Framework\TestCase;
1819
use Symfony\Component\HttpFoundation\JsonResponse;
1920
use Symfony\Component\HttpFoundation\Request;
2021
use Symfony\Component\HttpFoundation\Response;
2122
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
2223

23-
/**
24-
* Test-specific subclass of AnalyticsController that overrides the json() method
25-
* to avoid relying on the container.
26-
*/
27-
class TestableAnalyticsController extends AnalyticsController
28-
{
29-
protected function json($data, int $status = 200, array $headers = [], array $context = []): JsonResponse
30-
{
31-
return new JsonResponse($data, $status, $headers);
32-
}
33-
}
34-
3524
class AnalyticsControllerTest extends TestCase
3625
{
3726
private Authentication|MockObject $authentication;
38-
private RequestValidator|MockObject $validator;
3927
private AnalyticsService|MockObject $analyticsService;
40-
private CampaignStatisticsNormalizer|MockObject $campaignStatisticsNormalizer;
4128
private AnalyticsController $controller;
4229
private Administrator|MockObject $administrator;
4330
private Privileges|MockObject $privileges;
4431

4532
protected function setUp(): void
4633
{
4734
$this->authentication = $this->createMock(Authentication::class);
48-
$this->validator = $this->createMock(RequestValidator::class);
35+
$validator = $this->createMock(RequestValidator::class);
4936
$this->analyticsService = $this->createMock(AnalyticsService::class);
50-
$this->campaignStatisticsNormalizer = new CampaignStatisticsNormalizer();
51-
$this->viewOpensStatisticsNormalizer = new ViewOpensStatisticsNormalizer();
52-
$this->controller = new TestableAnalyticsController(
37+
$campaignStatisticsNormalizer = new CampaignStatisticsNormalizer();
38+
$viewOpensStatisticsNormalizer = new ViewOpensStatisticsNormalizer();
39+
$this->controller = new DummyAnalyticsController(
5340
$this->authentication,
54-
$this->validator,
41+
$validator,
5542
$this->analyticsService,
56-
$this->campaignStatisticsNormalizer,
57-
$this->viewOpensStatisticsNormalizer,
43+
$campaignStatisticsNormalizer,
44+
$viewOpensStatisticsNormalizer,
5845
);
5946

6047
$this->privileges = $this->createMock(Privileges::class);

0 commit comments

Comments
 (0)