44
55namespace PhpList \RestBundle \Controller ;
66
7+ use PhpList \RestBundle \Entity \SubscriberRequest ;
8+ use PhpList \RestBundle \Service \Manager \SubscriberManager ;
9+ use PhpList \RestBundle \Validator \RequestValidator ;
710use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
8- use PhpList \Core \Domain \Model \Subscription \Subscriber ;
911use PhpList \Core \Domain \Repository \Subscription \SubscriberRepository ;
1012use PhpList \Core \Security \Authentication ;
1113use PhpList \RestBundle \Controller \Traits \AuthenticationTrait ;
1214use Symfony \Component \HttpFoundation \JsonResponse ;
1315use Symfony \Component \HttpFoundation \Request ;
1416use Symfony \Component \HttpFoundation \Response ;
15- use Symfony \Component \HttpKernel \Exception \ConflictHttpException ;
16- use Symfony \Component \HttpKernel \Exception \UnprocessableEntityHttpException ;
1717use Symfony \Component \Routing \Attribute \Route ;
1818use Symfony \Component \Serializer \SerializerInterface ;
1919use OpenApi \Attributes as OA ;
@@ -28,11 +28,16 @@ class SubscriberController extends AbstractController
2828 use AuthenticationTrait;
2929
3030 private SubscriberRepository $ subscriberRepository ;
31+ private SubscriberManager $ subscriberManager ;
3132
32- public function __construct (Authentication $ authentication , SubscriberRepository $ repository )
33- {
33+ public function __construct (
34+ Authentication $ authentication ,
35+ SubscriberRepository $ repository ,
36+ SubscriberManager $ subscriberManager ,
37+ ) {
3438 $ this ->authentication = $ authentication ;
3539 $ this ->subscriberRepository = $ repository ;
40+ $ this ->subscriberManager = $ subscriberManager ;
3641 }
3742
3843 #[Route('/subscribers ' , name: 'create_subscriber ' , methods: ['POST ' ])]
@@ -126,25 +131,16 @@ public function __construct(Authentication $authentication, SubscriberRepository
126131 )
127132 ]
128133 )]
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 {
131139 $ 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 );
146140
147- $ this ->subscriberRepository ->save ($ subscriber );
141+ /** @var SubscriberRequest $subscriberRequest */
142+ $ subscriberRequest = $ validator ->validate ($ request , SubscriberRequest::class);
143+ $ subscriber = $ this ->subscriberManager ->createSubscriber ($ subscriberRequest );
148144
149145 return new JsonResponse (
150146 $ serializer ->serialize ($ subscriber , 'json ' ),
@@ -256,37 +252,4 @@ public function getAction(Request $request, int $subscriberId, SerializerInterfa
256252
257253 return new JsonResponse ($ data , Response::HTTP_OK , [], true );
258254 }
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- }
292255}
0 commit comments