Skip to content

Commit 5042526

Browse files
committed
Refactor: Coupling between objects
1 parent 937c3ce commit 5042526

File tree

4 files changed

+141
-58
lines changed

4 files changed

+141
-58
lines changed

config/services/services.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
services:
2+
PhpList\RestBundle\Subscription\Service\SubscriberService:
3+
autowire: true
4+
autoconfigure: true
5+
6+
PhpList\RestBundle\Subscription\Service\SubscriberHistoryService:
7+
autowire: true
8+
autoconfigure: true

src/Subscription/Controller/SubscriberController.php

Lines changed: 16 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,20 @@
44

55
namespace PhpList\RestBundle\Subscription\Controller;
66

7-
use DateTimeImmutable;
8-
use Exception;
97
use OpenApi\Attributes as OA;
108
use PhpList\Core\Domain\Identity\Model\PrivilegeFlag;
11-
use PhpList\Core\Domain\Subscription\Model\Filter\SubscriberHistoryFilter;
129
use PhpList\Core\Domain\Subscription\Model\Subscriber;
13-
use PhpList\Core\Domain\Subscription\Model\SubscriberHistory;
14-
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberManager;
1510
use PhpList\Core\Security\Authentication;
1611
use PhpList\RestBundle\Common\Controller\BaseController;
17-
use PhpList\RestBundle\Common\Service\Provider\PaginatedDataProvider;
1812
use PhpList\RestBundle\Common\Validator\RequestValidator;
1913
use PhpList\RestBundle\Subscription\Request\CreateSubscriberRequest;
2014
use PhpList\RestBundle\Subscription\Request\UpdateSubscriberRequest;
21-
use PhpList\RestBundle\Subscription\Serializer\SubscriberNormalizer;
15+
use PhpList\RestBundle\Subscription\Service\SubscriberService;
2216
use Symfony\Bridge\Doctrine\Attribute\MapEntity;
2317
use Symfony\Component\HttpFoundation\JsonResponse;
2418
use Symfony\Component\HttpFoundation\Request;
2519
use Symfony\Component\HttpFoundation\Response;
26-
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
2720
use Symfony\Component\Routing\Attribute\Route;
28-
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
29-
use Symfony\Component\Validator\Exception\ValidatorException;
3021

3122
/**
3223
* This controller provides REST API access to subscribers.
@@ -37,25 +28,16 @@
3728
#[Route('/subscribers', name: 'subscriber_')]
3829
class SubscriberController extends BaseController
3930
{
40-
private SubscriberManager $subscriberManager;
41-
private SubscriberNormalizer $subscriberNormalizer;
42-
private PaginatedDataProvider $paginatedDataProvider;
43-
private NormalizerInterface $serializer;
31+
private SubscriberService $subscriberService;
4432

4533
public function __construct(
4634
Authentication $authentication,
4735
RequestValidator $validator,
48-
SubscriberManager $subscriberManager,
49-
SubscriberNormalizer $subscriberNormalizer,
50-
PaginatedDataProvider $paginatedDataProvider,
51-
NormalizerInterface $serializer,
36+
SubscriberService $subscriberService,
5237
) {
5338
parent::__construct($authentication, $validator);
5439
$this->authentication = $authentication;
55-
$this->subscriberManager = $subscriberManager;
56-
$this->subscriberNormalizer = $subscriberNormalizer;
57-
$this->paginatedDataProvider = $paginatedDataProvider;
58-
$this->serializer = $serializer;
40+
$this->subscriberService = $subscriberService;
5941
}
6042

6143
#[Route('', name: 'create', methods: ['POST'])]
@@ -111,12 +93,9 @@ public function createSubscriber(Request $request): JsonResponse
11193

11294
/** @var CreateSubscriberRequest $subscriberRequest */
11395
$subscriberRequest = $this->validator->validate($request, CreateSubscriberRequest::class);
114-
$subscriber = $this->subscriberManager->createSubscriber($subscriberRequest->getDto());
96+
$subscriberData = $this->subscriberService->createSubscriber($subscriberRequest);
11597

116-
return $this->json(
117-
$this->subscriberNormalizer->normalize($subscriber, 'json'),
118-
Response::HTTP_CREATED
119-
);
98+
return $this->json($subscriberData, Response::HTTP_CREATED);
12099
}
121100

122101
#[Route('/{subscriberId}', name: 'update', requirements: ['subscriberId' => '\d+'], methods: ['PUT'])]
@@ -184,9 +163,9 @@ public function updateSubscriber(
184163
}
185164
/** @var UpdateSubscriberRequest $updateSubscriberRequest */
186165
$updateSubscriberRequest = $this->validator->validate($request, UpdateSubscriberRequest::class);
187-
$subscriber = $this->subscriberManager->updateSubscriber($updateSubscriberRequest->getDto());
166+
$subscriberData = $this->subscriberService->updateSubscriber($updateSubscriberRequest);
188167

189-
return $this->json($this->subscriberNormalizer->normalize($subscriber, 'json'), Response::HTTP_OK);
168+
return $this->json($subscriberData, Response::HTTP_OK);
190169
}
191170

192171
#[Route('/{subscriberId}', name: 'get_one', requirements: ['subscriberId' => '\d+'], methods: ['GET'])]
@@ -234,9 +213,9 @@ public function getSubscriber(Request $request, int $subscriberId): JsonResponse
234213
{
235214
$this->requireAuthentication($request);
236215

237-
$subscriber = $this->subscriberManager->getSubscriber($subscriberId);
216+
$subscriberData = $this->subscriberService->getSubscriber($subscriberId);
238217

239-
return $this->json($this->subscriberNormalizer->normalize($subscriber), Response::HTTP_OK);
218+
return $this->json($subscriberData, Response::HTTP_OK);
240219
}
241220

242221
#[Route('/{subscriberId}/history', name: 'history', requirements: ['subscriberId' => '\d+'], methods: ['GET'])]
@@ -330,31 +309,10 @@ public function getSubscriberHistory(
330309
): JsonResponse {
331310
$this->requireAuthentication($request);
332311

333-
if (!$subscriber) {
334-
throw $this->createNotFoundException('Subscriber not found.');
335-
}
336-
337-
try {
338-
$dateFrom = $request->query->get('date_from');
339-
$dateFromFormated = $dateFrom ? new DateTimeImmutable($dateFrom) : null;
340-
} catch (Exception $e) {
341-
throw new ValidatorException('Invalid date format. Use format: Y-m-d');
342-
}
343-
344-
$filter = new SubscriberHistoryFilter(
345-
subscriber: $subscriber,
346-
ip: $request->query->get('ip'),
347-
dateFrom: $dateFromFormated,
348-
summery: $request->query->get('summery'),
349-
);
312+
$historyData = $this->subscriberService->getSubscriberHistory($request, $subscriber);
350313

351314
return $this->json(
352-
data: $this->paginatedDataProvider->getPaginatedList(
353-
request: $request,
354-
normalizer: $this->serializer,
355-
className: SubscriberHistory::class,
356-
filter: $filter
357-
),
315+
data: $historyData,
358316
status: Response::HTTP_OK,
359317
);
360318
}
@@ -412,7 +370,7 @@ public function deleteSubscriber(
412370
if (!$subscriber) {
413371
throw $this->createNotFoundException('Subscriber not found.');
414372
}
415-
$this->subscriberManager->deleteSubscriber($subscriber);
373+
$this->subscriberService->deleteSubscriber($subscriber);
416374

417375
return $this->json(null, Response::HTTP_NO_CONTENT);
418376
}
@@ -457,9 +415,9 @@ public function setSubscriberAsConfirmed(Request $request): Response
457415
return new Response('<h1>Missing confirmation code.</h1>', 400);
458416
}
459417

460-
try {
461-
$this->subscriberManager->markAsConfirmedByUniqueId($uniqueId);
462-
} catch (NotFoundHttpException) {
418+
$subscriber = $this->subscriberService->confirmSubscriber($uniqueId);
419+
420+
if (!$subscriber) {
463421
return new Response('<h1>Subscriber isn\'t found or already confirmed.</h1>', 404);
464422
}
465423

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Subscription\Service;
6+
7+
use DateTimeImmutable;
8+
use Exception;
9+
use PhpList\Core\Domain\Subscription\Model\Filter\SubscriberHistoryFilter;
10+
use PhpList\Core\Domain\Subscription\Model\Subscriber;
11+
use PhpList\Core\Domain\Subscription\Model\SubscriberHistory;
12+
use PhpList\RestBundle\Common\Service\Provider\PaginatedDataProvider;
13+
use Symfony\Component\HttpFoundation\Request;
14+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
15+
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
16+
use Symfony\Component\Validator\Exception\ValidatorException;
17+
18+
class SubscriberHistoryService
19+
{
20+
public function __construct(
21+
private readonly PaginatedDataProvider $paginatedDataProvider,
22+
private readonly NormalizerInterface $serializer,
23+
) {
24+
}
25+
26+
public function getSubscriberHistory(Request $request, ?Subscriber $subscriber): array
27+
{
28+
if (!$subscriber) {
29+
throw new NotFoundHttpException('Subscriber not found.');
30+
}
31+
32+
try {
33+
$dateFrom = $request->query->get('date_from');
34+
$dateFromFormated = $dateFrom ? new DateTimeImmutable($dateFrom) : null;
35+
} catch (Exception $e) {
36+
throw new ValidatorException('Invalid date format. Use format: Y-m-d');
37+
}
38+
39+
$filter = new SubscriberHistoryFilter(
40+
subscriber: $subscriber,
41+
ip: $request->query->get('ip'),
42+
dateFrom: $dateFromFormated,
43+
summery: $request->query->get('summery'),
44+
);
45+
46+
return $this->paginatedDataProvider->getPaginatedList(
47+
request: $request,
48+
normalizer: $this->serializer,
49+
className: SubscriberHistory::class,
50+
filter: $filter
51+
);
52+
}
53+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Subscription\Service;
6+
7+
use PhpList\Core\Domain\Subscription\Model\Subscriber;
8+
use PhpList\Core\Domain\Subscription\Service\Manager\SubscriberManager;
9+
use PhpList\RestBundle\Subscription\Request\CreateSubscriberRequest;
10+
use PhpList\RestBundle\Subscription\Request\UpdateSubscriberRequest;
11+
use PhpList\RestBundle\Subscription\Serializer\SubscriberNormalizer;
12+
use Symfony\Component\HttpFoundation\Request;
13+
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
14+
15+
class SubscriberService
16+
{
17+
public function __construct(
18+
private readonly SubscriberManager $subscriberManager,
19+
private readonly SubscriberNormalizer $subscriberNormalizer,
20+
private readonly SubscriberHistoryService $subscriberHistoryService,
21+
) {
22+
}
23+
24+
public function createSubscriber(CreateSubscriberRequest $subscriberRequest): array
25+
{
26+
$subscriber = $this->subscriberManager->createSubscriber($subscriberRequest->getDto());
27+
return $this->subscriberNormalizer->normalize($subscriber, 'json');
28+
}
29+
30+
public function updateSubscriber(UpdateSubscriberRequest $updateSubscriberRequest): array
31+
{
32+
$subscriber = $this->subscriberManager->updateSubscriber($updateSubscriberRequest->getDto());
33+
return $this->subscriberNormalizer->normalize($subscriber, 'json');
34+
}
35+
36+
public function getSubscriber(int $subscriberId): array
37+
{
38+
$subscriber = $this->subscriberManager->getSubscriber($subscriberId);
39+
return $this->subscriberNormalizer->normalize($subscriber);
40+
}
41+
42+
public function getSubscriberHistory(Request $request, ?Subscriber $subscriber): array
43+
{
44+
return $this->subscriberHistoryService->getSubscriberHistory($request, $subscriber);
45+
}
46+
47+
public function deleteSubscriber(Subscriber $subscriber): void
48+
{
49+
$this->subscriberManager->deleteSubscriber($subscriber);
50+
}
51+
52+
public function confirmSubscriber(string $uniqueId): ?Subscriber
53+
{
54+
if (!$uniqueId) {
55+
return null;
56+
}
57+
58+
try {
59+
return $this->subscriberManager->markAsConfirmedByUniqueId($uniqueId);
60+
} catch (NotFoundHttpException) {
61+
return null;
62+
}
63+
}
64+
}

0 commit comments

Comments
 (0)