11<?php
22
3+ declare (strict_types=1 );
4+
35namespace Modules \V1 \Auth \Controllers ;
46
5- use Shared \Helpers \GlobalHelper ;
6- use Shared \Helpers \ResponseHelper ;
77use App \Http \Controllers \V1 \Controller ;
8+ use Exception ;
9+ use Illuminate \Contracts \Encryption \DecryptException ;
810use Illuminate \Http \Request ;
911use Illuminate \Support \Carbon ;
10- use Illuminate \Support \Facades \Mail ;
12+ use Illuminate \Support \Facades \Log ;
1113use Illuminate \Support \Str ;
12- use Modules \V1 \Auth \Mail \ WelcomeMail ;
14+ use Modules \V1 \Auth \Notifications \ Welcome ;
1315use Modules \V1 \User \Models \User ;
1416use Modules \V1 \User \Resources \UserResource ;
17+ use Shared \Helpers \GlobalHelper ;
18+ use Shared \Helpers \ResponseHelper ;
1519
16- class VerifyEmailController extends Controller
20+ final class VerifyEmailController extends Controller
1721{
1822 /**
1923 * @OA\Post(
2024 * path="/auth/email/verify",
2125 * summary="Verify user email",
2226 * tags={"Authentication"},
27+ *
2328 * @OA\RequestBody(
2429 * required=true,
2530 * description="Request body containing the verification token",
31+ *
2632 * @OA\JsonContent(
2733 * required={"token"},
34+ *
2835 * @OA\Property(
2936 * property="token",
3037 * type="string",
3138 * description="Verification token"
3239 * )
3340 * )
3441 * ),
42+ *
3543 * @OA\Response(
3644 * response=200,
3745 * description="Successful operation",
46+ *
3847 * @OA\JsonContent(
3948 * type="object",
49+ *
4050 * @OA\Property(
4151 * property="message",
4252 * type="string",
@@ -57,11 +67,14 @@ class VerifyEmailController extends Controller
5767 * )
5868 * )
5969 * ),
70+ *
6071 * @OA\Response(
6172 * response=400,
6273 * description="Bad request",
74+ *
6375 * @OA\JsonContent(
6476 * type="object",
77+ *
6578 * @OA\Property(
6679 * property="message",
6780 * type="string",
@@ -82,11 +95,14 @@ class VerifyEmailController extends Controller
8295 * )
8396 * )
8497 * ),
98+ *
8599 * @OA\Response(
86100 * response=404,
87101 * description="Not found",
102+ *
88103 * @OA\JsonContent(
89104 * type="object",
105+ *
90106 * @OA\Property(
91107 * property="message",
92108 * type="string",
@@ -111,42 +127,54 @@ class VerifyEmailController extends Controller
111127 */
112128 public function __invoke (Request $ request ): \Illuminate \Http \JsonResponse
113129 {
114- $ request ->validate ([
115- 'token ' => ['required ' , 'string ' ],
116- ]);
130+ try {
131+ $ request ->validate ([
132+ 'token ' => ['required ' , 'string ' ],
133+ ]);
117134
118- $ token = GlobalHelper::decrypt ($ request ->token );
119- // Find the user by the verification token
120- $ user = User::where ('verification_token ' , $ token )->first ();
135+ $ token = GlobalHelper::decrypt ($ request ->token );
136+ // Find the user by the verification token
137+ $ user = User::where ('verification_token ' , $ token )->first ();
121138
122- if (! $ user ) {
123- return ResponseHelper::error ('Invalid verification token ' , 404 );
124- }
139+ if ( ! $ user ) {
140+ return ResponseHelper::error ('Invalid verification token ' , 404 );
141+ }
125142
126- // Check if the token has expired
127- if ($ user ->verification_token_expiry && (new Carbon ($ user ->verification_token_expiry ))->isPast ()) {
128- return ResponseHelper::error ('Verification token has expired ' , 400 );
129- }
143+ // Check if the token has expired
144+ if ($ user ->verification_token_expiry && (new Carbon ($ user ->verification_token_expiry ))->isPast ()) {
145+ return ResponseHelper::error ('Verification token has expired ' , 400 );
146+ }
130147
131- if ($ user ->hasVerifiedEmail ()) {
132- return ResponseHelper::error ('Email already verified ' , 400 );
133- }
148+ if ($ user ->hasVerifiedEmail ()) {
149+ return ResponseHelper::error ('Email already verified ' , 400 );
150+ }
134151
135- if (!$ user ->markEmailAsVerified ()) {
136- return ResponseHelper::error ('Failed to verify email ' );
137- }
152+ if ( ! $ user ->markEmailAsVerified ()) {
153+ return ResponseHelper::error ('Failed to verify email ' );
154+ }
155+
156+ // send welcome notification
157+ $ user ->notify (new Welcome ($ user , config ('constants.user_dashboard ' )));
138158
139- Mail::send (new WelcomeMail ($ user , config ('constants.user_dashboard ' )));
159+ $ device = Str::limit ($ request ->userAgent (), 255 );
160+ $ token = $ user ->createToken ($ device )->plainTextToken ;
140161
141- $ device = Str::limit ($ request ->userAgent (), 255 );
142- $ token = $ user ->createToken ($ device )->plainTextToken ;
162+ return response ()->json ([
163+ 'message ' => 'User verified successfully ' ,
164+ 'status ' => 'success ' ,
165+ 'statusCode ' => '200 ' ,
166+ 'accessToken ' => $ token ,
167+ 'data ' => new UserResource ($ user ),
168+ ]);
169+ } catch (DecryptException $ e ) {
170+ Log::error ('Invalid decryption token: ' . $ e );
171+
172+ return ResponseHelper::error ('Invalid verification token ' , 422 ); // or throw a custom exception
173+ } catch (Exception $ exception ) {
174+ Log::error ($ exception );
175+
176+ return ResponseHelper::error ();
177+ }
143178
144- return response ()->json ([
145- 'message ' => 'User verified successfully ' ,
146- 'status ' => 'success ' ,
147- 'statusCode ' => '200 ' ,
148- 'accessToken ' => $ token ,
149- 'data ' => new UserResource ($ user )
150- ]);
151179 }
152180}
0 commit comments