4
4
5
5
namespace PhpList \RestBundle \Controller ;
6
6
7
+ use PhpList \RestBundle \Entity \SubscriberRequest ;
8
+ use PhpList \RestBundle \Service \Manager \SubscriberManager ;
9
+ use PhpList \RestBundle \Validator \RequestValidator ;
7
10
use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
8
- use PhpList \Core \Domain \Model \Subscription \Subscriber ;
9
11
use PhpList \Core \Domain \Repository \Subscription \SubscriberRepository ;
10
12
use PhpList \Core \Security \Authentication ;
11
13
use PhpList \RestBundle \Controller \Traits \AuthenticationTrait ;
12
14
use Symfony \Component \HttpFoundation \JsonResponse ;
13
15
use Symfony \Component \HttpFoundation \Request ;
14
16
use Symfony \Component \HttpFoundation \Response ;
15
- use Symfony \Component \HttpKernel \Exception \ConflictHttpException ;
16
- use Symfony \Component \HttpKernel \Exception \UnprocessableEntityHttpException ;
17
17
use Symfony \Component \Routing \Attribute \Route ;
18
18
use Symfony \Component \Serializer \SerializerInterface ;
19
19
use OpenApi \Attributes as OA ;
@@ -28,11 +28,16 @@ class SubscriberController extends AbstractController
28
28
use AuthenticationTrait;
29
29
30
30
private SubscriberRepository $ subscriberRepository ;
31
+ private SubscriberManager $ subscriberManager ;
31
32
32
- public function __construct (Authentication $ authentication , SubscriberRepository $ repository )
33
- {
33
+ public function __construct (
34
+ Authentication $ authentication ,
35
+ SubscriberRepository $ repository ,
36
+ SubscriberManager $ subscriberManager ,
37
+ ) {
34
38
$ this ->authentication = $ authentication ;
35
39
$ this ->subscriberRepository = $ repository ;
40
+ $ this ->subscriberManager = $ subscriberManager ;
36
41
}
37
42
38
43
#[Route('/subscribers ' , name: 'create_subscriber ' , methods: ['POST ' ])]
@@ -126,25 +131,16 @@ public function __construct(Authentication $authentication, SubscriberRepository
126
131
)
127
132
]
128
133
)]
129
- public function postAction (Request $ request , SerializerInterface $ serializer ): JsonResponse
130
- {
134
+ public function postAction (
135
+ Request $ request ,
136
+ SerializerInterface $ serializer ,
137
+ RequestValidator $ validator
138
+ ): JsonResponse {
131
139
$ this ->requireAuthentication ($ request );
132
- $ data = $ request ->getPayload ();
133
- $ this ->validateSubscriber ($ request );
134
-
135
- $ email = $ data ->get ('email ' );
136
- if ($ this ->subscriberRepository ->findOneByEmail ($ email ) !== null ) {
137
- throw new ConflictHttpException ('This resource already exists. ' , null , 1513439108 );
138
- }
139
- $ confirmed = (bool )$ data ->get ('request_confirmation ' , true );
140
- $ subscriber = new Subscriber ();
141
- $ subscriber ->setEmail ($ email );
142
- $ subscriber ->setConfirmed (!$ confirmed );
143
- $ subscriber ->setBlacklisted (false );
144
- $ subscriber ->setHtmlEmail ((bool )$ data ->get ('html_email ' , true ));
145
- $ subscriber ->setDisabled (false );
146
140
147
- $ this ->subscriberRepository ->save ($ subscriber );
141
+ /** @var SubscriberRequest $subscriberRequest */
142
+ $ subscriberRequest = $ validator ->validate ($ request , SubscriberRequest::class);
143
+ $ subscriber = $ this ->subscriberManager ->createSubscriber ($ subscriberRequest );
148
144
149
145
return new JsonResponse (
150
146
$ serializer ->serialize ($ subscriber , 'json ' ),
@@ -256,37 +252,4 @@ public function getAction(Request $request, int $subscriberId, SerializerInterfa
256
252
257
253
return new JsonResponse ($ data , Response::HTTP_OK , [], true );
258
254
}
259
-
260
- /**
261
- * @param Request $request
262
- *
263
- * @return void
264
- *
265
- * @throws UnprocessableEntityHttpException
266
- */
267
- private function validateSubscriber (Request $ request ): void
268
- {
269
- /** @var string[] $invalidFields */
270
- $ invalidFields = [];
271
- if (filter_var ($ request ->getPayload ()->get ('email ' ), FILTER_VALIDATE_EMAIL ) === false ) {
272
- $ invalidFields [] = 'email ' ;
273
- }
274
-
275
- $ booleanFields = ['request_confirmation ' , 'html_email ' ];
276
- foreach ($ booleanFields as $ fieldKey ) {
277
- if ($ request ->getPayload ()->get ($ fieldKey ) !== null
278
- && !is_bool ($ request ->getPayload ()->get ($ fieldKey ))
279
- ) {
280
- $ invalidFields [] = $ fieldKey ;
281
- }
282
- }
283
-
284
- if (!empty ($ invalidFields )) {
285
- throw new UnprocessableEntityHttpException (
286
- 'Some fields invalid: ' . implode (', ' , $ invalidFields ),
287
- null ,
288
- 1513446736
289
- );
290
- }
291
- }
292
255
}
0 commit comments