{"id":454,"date":"2021-12-18T22:00:00","date_gmt":"2021-12-18T22:00:00","guid":{"rendered":"https:\/\/rishikantsri.in\/blog\/?p=454"},"modified":"2023-10-19T09:37:51","modified_gmt":"2023-10-19T09:37:51","slug":"code-review-user-login-api-with-authentication","status":"publish","type":"post","link":"https:\/\/rishikantsri.in\/blog\/code-review-user-login-api-with-authentication\/","title":{"rendered":"Code Review : User login API with Authentication"},"content":{"rendered":"\n<p>The provided code is a Laravel 8 API endpoint for user login. It handles user authentication and returns a response with user information and an access token upon successful login. Here&#8217;s a breakdown of the code:<\/p>\n\n\n\n<p>This code accomplishes the following:<\/p>\n\n\n\n<ol>\n<li>Validates the incoming request data, ensuring that both an email and a password are provided.<\/li>\n\n\n\n<li>Checks if the user exists and if the provided password matches the hashed password stored in the database.<\/li>\n\n\n\n<li>Updates the user&#8217;s FCM token and device token for push notifications.<\/li>\n\n\n\n<li>Creates a new API token for the user and revokes all older tokens to ensure security.<\/li>\n\n\n\n<li>Fetches additional user data and statistics.<\/li>\n\n\n\n<li>Returns a JSON response with the user&#8217;s data, access token, and a success message upon successful login. If an exception occurs, it returns an error response with an error message.<\/li>\n<\/ol>\n\n\n\n<p>This code demonstrates secure user authentication, token management, and error-handling practices commonly used in Laravel API development.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#b392f0;--cbp-line-number-width:29.70000171661377px;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1f1f1f\"><span style=\"background:#a37ced;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1f1f1f\">PHP<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"public function login(Request $request)\n{\n    try {\n        \/\/ Validation rules and messages for the request\n        $messages = [\n            'email.required' =&gt; 'Email is Required',\n            'password.required' =&gt; 'Password is Required',\n        ];\n        $rules = [\n            'email' =&gt; 'required',\n            'password' =&gt; 'required',\n        ];\n\n        \/\/ Validate the incoming request data\n        $validator = Validator::make($request-&gt;all(), $rules, $messages);\n\n        if ($validator-&gt;fails()) {\n            \/\/ Return a JSON response with validation error messages\n            $response = [\n                'code' =&gt; 200,\n                'Status' =&gt; false,\n                'Message' =&gt; $validator-&gt;errors()-&gt;first(),\n            ];\n            return response()-&gt;json($response, 200);\n        }\n\n        \/\/ Check if the user exists and the provided password is correct\n        $user = User::where('email', $request-&gt;email)\n            -&gt;orWhere('phone_number', $request-&gt;email)\n            -&gt;first();\n\n        if (!($user &amp;&amp; Hash::check($request-&gt;password, $user-&gt;password))) {\n            \/\/ Return an unauthorized response if authentication fails\n            return response()\n                -&gt;json([\n                    &quot;code&quot; =&gt; 200,\n                    &quot;Status&quot; =&gt; false,\n                    &quot;Message&quot; =&gt; 'Unauthorized',\n                ], 200);\n        }\n\n        \/\/ Update user's FCM and device tokens\n        User::where('email', $request['email'])-&gt;orWhere('phone_number', $request-&gt;email)-&gt;update([\n            'fcm_token' =&gt; $request['fcm_token'],\n            'device_token' =&gt; $request['device_token'],\n        ]);\n\n        \/\/ Fetch user details\n        $user = User::select('id', 'name', 'email')-&gt;where('email', $request['email'])-&gt;firstOrFail();\n\n        \n\n        \/\/ Revoke all user tokens to ensure only the current login token is valid\n        $user-&gt;tokens-&gt;each(function ($token, $key) {\n            $token-&gt;delete();\n        });\n\n        \/\/ Create a new API token for the user\n        $token = $user-&gt;createToken('auth_token')-&gt;plainTextToken;\n\n        \/\/ Fetch additional user data and statistics\n        $userDetails = CustomerDetails::where('user_id', $user-&gt;id)-&gt;firstOrFail();\n       \n\n        \/\/ Prepare user data to be included in the response\n            $userdata = [];\n            $userdata['id'] = $user-&gt;id;\n            $userdata['name'] = $user-&gt;name;\n            $userdata['email'] = $user-&gt;email;\n            $userdata['firstname'] = $userDetails-&gt;firstname;\n            $userdata['lastname'] = $userDetails-&gt;lastname;\n            $userdata['gender'] = $userDetails-&gt;gender;\n            $userdata['dob'] = $userDetails-&gt;dob;\n            $userdata['age'] = $userDetails-&gt;age;\n            $userdata['phone'] = $userDetails-&gt;phone;\n            $userdata['second_email'] = $userDetails-&gt;second_email;\n            $userdata['address_line1'] = $userDetails-&gt;address_line1;\n            $userdata['address_line2'] = $userDetails-&gt;address_line2;\n            $userdata['address_city'] = $userDetails-&gt;address_city;\n            $userdata['address_state'] = $userDetails-&gt;address_state;\n            $userdata['address_country'] = $userDetails-&gt;address_country;\n        \n\n        \/\/ Create a JSON response with user data, access token, and a success message\n        return response()-&gt;json([\n            &quot;code&quot; =&gt; 200,\n            &quot;Status&quot; =&gt; true,\n            &quot;Message&quot; =&gt; 'Logged in successfully!',\n            &quot;access_token&quot; =&gt; $token,\n            &quot;data&quot; =&gt; $userData\n        ], 200);\n    } catch (\\Throwable $th) {\n        \/\/ Handle exceptions and return an error response\n        return response()-&gt;json([\n            'code' =&gt; 200,\n            'status' =&gt; false,\n            'message' =&gt; $th-&gt;getMessage()\n        ], 500);\n    }\n}\" style=\"color:#b392f0;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki min-dark\" style=\"background-color: #1f1f1f\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">public<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">function<\/span><span style=\"color: #B392F0\"> login(<\/span><span style=\"color: #79B8FF\">Request<\/span><span style=\"color: #B392F0\"> $request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    <\/span><span style=\"color: #F97583\">try<\/span><span style=\"color: #B392F0\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Validation rules and messages for the request<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $messages <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;email.required&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Email is Required&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;password.required&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Password is Required&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $rules <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;required&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;password&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;required&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Validate the incoming request data<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $validator <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">Validator<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">make<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">$request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">all<\/span><span style=\"color: #BBBBBB\">(),<\/span><span style=\"color: #B392F0\"> $rules<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $messages<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #B392F0\"> ($validator<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">fails<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #6B737C\">\/\/ Return a JSON response with validation error messages<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                <\/span><span style=\"color: #FFAB70\">&#39;code&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                <\/span><span style=\"color: #FFAB70\">&#39;Status&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">false<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                <\/span><span style=\"color: #FFAB70\">&#39;Message&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $validator<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">errors<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">first<\/span><span style=\"color: #BBBBBB\">(),<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            ];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">$response<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Check if the user exists and the provided password is correct<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $user <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">User<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">where<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">email<\/span><span style=\"color: #BBBBBB\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">orWhere<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;phone_number&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">email<\/span><span style=\"color: #BBBBBB\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">first<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #B392F0\"> (<\/span><span style=\"color: #F97583\">!<\/span><span style=\"color: #B392F0\">($user <\/span><span style=\"color: #F97583\">&amp;&amp;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">Hash<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">check<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">$request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">password<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">password<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">)) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #6B737C\">\/\/ Return an unauthorized response if authentication fails<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                <\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                    <\/span><span style=\"color: #FFAB70\">&quot;code&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                    <\/span><span style=\"color: #FFAB70\">&quot;Status&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">false<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                    <\/span><span style=\"color: #FFAB70\">&quot;Message&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Unauthorized&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                ]<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Update user&#39;s FCM and device tokens<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #79B8FF\">User<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">where<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $request[<\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #B392F0\">]<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">orWhere<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;phone_number&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">email<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">update<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;fcm_token&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $request[<\/span><span style=\"color: #FFAB70\">&#39;fcm_token&#39;<\/span><span style=\"color: #B392F0\">]<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;device_token&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $request[<\/span><span style=\"color: #FFAB70\">&#39;device_token&#39;<\/span><span style=\"color: #B392F0\">]<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ]<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Fetch user details<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $user <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">User<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">select<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;id&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;name&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">where<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $request[<\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #B392F0\">]<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">firstOrFail<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Revoke all user tokens to ensure only the current login token is valid<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">tokens<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">each<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #F97583\">function<\/span><span style=\"color: #B392F0\"> ($token<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $key) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $token<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">delete<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        }<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Create a new API token for the user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $token <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">createToken<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;auth_token&#39;<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">plainTextToken;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Fetch additional user data and statistics<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $userDetails <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">CustomerDetails<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">where<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;user_id&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">id<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">firstOrFail<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">       <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Prepare user data to be included in the response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> [];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;id&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">id;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;name&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">name;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">email;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;firstname&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">firstname;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;lastname&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">lastname;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;gender&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">gender;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;dob&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">dob;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;age&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">age;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;phone&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">phone;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;second_email&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">second_email;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;address_line1&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_line1;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;address_line2&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_line2;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;address_city&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_city;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;address_state&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_state;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $userdata[<\/span><span style=\"color: #FFAB70\">&#39;address_country&#39;<\/span><span style=\"color: #B392F0\">] <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_country;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Create a JSON response with user data, access token, and a success message<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&quot;code&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&quot;Status&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">true<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&quot;Message&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Logged in successfully!&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&quot;access_token&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $token<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&quot;data&quot;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userData<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ]<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    } <\/span><span style=\"color: #F97583\">catch<\/span><span style=\"color: #B392F0\"> (<\/span><span style=\"color: #BBBBBB\">\\<\/span><span style=\"color: #79B8FF\">Throwable<\/span><span style=\"color: #B392F0\"> $th) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Handle exceptions and return an error response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;code&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;status&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">false<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;message&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $th<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">getMessage<\/span><span style=\"color: #BBBBBB\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ]<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">500<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>The code, provided here, appears to be generally correct, but there are a few areas that could be improved or enhanced to align more closely with Laravel best practices and security guidelines. Let&#8217;s go through some recommendations and best practices:<\/p>\n\n\n\n<ol>\n<li><strong>Validation Rules and Messages<\/strong>: The code includes validation rules and messages, which is good. However, consider creating a separate Form Request for validation rules to keep your controller clean and organized.<\/li>\n\n\n\n<li><strong>Error Handling<\/strong>: The code uses a try-catch block to handle exceptions, which is a good practice. However, the error response could be more informative, providing only the error message might not be sufficient for debugging. Consider logging exceptions and providing a more detailed error message.<\/li>\n\n\n\n<li><strong>Password Hashing<\/strong>: The code uses <code>Hash::check<\/code> for password comparison, which is the correct way to verify passwords. Make sure that passwords are properly hashed when storing them in the database.<\/li>\n\n\n\n<li><strong>Middleware<\/strong>: The code mentions that it uses Sanctum for authentication, but the middleware usage is not explicitly shown. Ensure that you&#8217;ve applied the <code>auth:sanctum<\/code> middleware to the routes that need authentication.<\/li>\n\n\n\n<li><strong>API Token<\/strong>: The code uses plain text tokens for API authentication. Consider using Sanctum&#8217;s token management features, like token expiration and revocation, to enhance security.<\/li>\n\n\n\n<li><strong>Optimize Database Queries<\/strong>: The code performs several database queries. Make sure that your database queries are optimized, and consider using Eloquent relationships to simplify the code.<\/li>\n\n\n\n<li><strong>Consistent Response Structure<\/strong>: Ensure a consistent response structure for success and error responses. Consistency makes it easier for clients to handle responses.<\/li>\n\n\n\n<li><strong>Input Validation<\/strong>: While the code performs validation, it&#8217;s essential to sanitize and validate inputs further to prevent SQL injection, XSS, and other security vulnerabilities.<\/li>\n\n\n\n<li><strong>Authorization<\/strong>: The code handles authentication but not authorization. Ensure that authenticated users have the appropriate permissions to perform specific actions, especially for user-specific data.<\/li>\n\n\n\n<li><strong>Response Codes<\/strong>: Use appropriate HTTP status codes for responses. For example, consider using 401 for unauthorized access and 422 for validation errors.<\/li>\n\n\n\n<li><strong>Test Coverage<\/strong>: Comprehensive test coverage is crucial to ensure the code&#8217;s correctness. Write unit and feature tests to verify that your API endpoints work as expected.<\/li>\n\n\n\n<li><strong>Code Documentation<\/strong>: Add comments and documentation to your code to make it more understandable for other developers and your future self.<\/li>\n<\/ol>\n\n\n\n<p>Possible better solution: <\/p>\n\n\n\n<p><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#b392f0;--cbp-line-number-width:19.800000190734863px;line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1f1f1f\"><span style=\"background:#a37ced;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1f1f1f\">PHP<\/span><\/span><span role=\"button\" tabindex=\"0\" data-code=\"public function login(Request $request)\n{\n    try {\n       \/\/ Define validation rules and error messages for the request.\n          $validationRules = [\n              'email' =&gt; 'required|email', \/\/ Validate email format\n              'password' =&gt; 'required',\n          ];\n\n          $customValidationMessages = [\n              'email.required' =&gt; 'The email field is required.',\n              'email.email' =&gt; 'Invalid email format.',\n              'password.required' =&gt; 'The password field is required.',\n          ];\n\n        \/\/ Create a Validator instance to validate the incoming request data.\n        $validator = Validator::make($request-&gt;all(), $validationRules, $customValidationMessages);\n\n    \/\/ Check if validation fails.\n    if ($validator-&gt;fails()) {\n        \/\/ Prepare a response for validation errors.\n        $response = [\n            'code' =&gt; 422, \/\/ 422 Unprocessable Entity is a more appropriate status for validation errors\n            'status' =&gt; false,\n            'message' =&gt; 'Validation error',\n            'errors' =&gt; $validator-&gt;errors(), \/\/ Include all validation errors\n        ];\n    \n        \/\/ Return a JSON response with the validation errors.\n        return response()-&gt;json($response, 422);\n    }\n\n\/\/ Query the user based on 'email'\n        $user = User::where(function ($query) use ($request) {\n            $query-&gt;where('email', $request-&gt;email);\n        })-&gt;first();\n\n\/\/ Check user authentication and password\n        if (!$user || !Hash::check($request-&gt;password, $user-&gt;password)) {\n            return response()-&gt;json([\n                'code' =&gt; 401,\n                'status' =&gt; false,\n                'message' =&gt; 'Unauthorized',\n            ], 401);\n        }\n        \n\/\/ Revoke existing tokens to ensure security\n        $user-&gt;tokens-&gt;each(fn ($token) =&gt; $token-&gt;delete());\n\n\/\/ Create a new API token for the user\n        $token = $user-&gt;createToken('auth_token')-&gt;plainTextToken;\n\n\/\/ Fetch user data using the 'getUserData' function\n        $userData = $this-&gt;getUserData($user);\n\n\/\/ Return a successful login response with user data and an access token\n        return response()-&gt;json([\n            'code' =&gt; 200,\n            'status' =&gt; true,\n            'message' =&gt; 'Logged in successfully!',\n            'access_token' =&gt; $token,\n            'data' =&gt; $userData,\n        ], 200);\n    } catch (\\Throwable $th) {\n     \/\/ Handle exceptions and return a server error response\n         return response()-&gt;json([\n            'code' =&gt; 500,\n            'status' =&gt; false,\n            'message' =&gt; 'An error occurred while processing your request.',\n        ], 500);\n    }\n}\n\nprivate function getUserData(User $user)\n{\n    $userDetails = CustomerDetails::where('user_id', $user-&gt;id)-&gt;firstOrFail();  \n\/\/ Build and return user data.\n    return [\n        'id' =&gt; $user-&gt;id,\n        'name' =&gt; $user-&gt;name,\n        'email' =&gt; $user-&gt;email,\n        'firstname' =&gt; $userDetails-&gt;firstname,\n        'lastname' =&gt; $userDetails-&gt;lastname,\n        'gender' =&gt; $userDetails-&gt;gender,\n        'dob' =&gt; $userDetails-&gt;dob,\n        'age' =&gt; $userDetails-&gt;age,\n        'phone' =&gt; $userDetails-&gt;phone,\n        'second_email' =&gt; $userDetails-&gt;second_email,\n        'address_line1' =&gt; $userDetails-&gt;address_line1,\n        'address_line2' =&gt; $userDetails-&gt;address_line2,\n        'address_city' =&gt; $userDetails-&gt;address_city,\n        'address_state' =&gt; $userDetails-&gt;address_state,\n        'address_country' =&gt; $userDetails-&gt;address_country,\n        'address_pincode' =&gt; $userDetails-&gt;address_pincode,\n        'image_path' =&gt; $userDetails-&gt;image_path,\n     \n    ];\n}\" style=\"color:#b392f0;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki min-dark\" style=\"background-color: #1f1f1f\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F97583\">public<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">function<\/span><span style=\"color: #B392F0\"> login(<\/span><span style=\"color: #79B8FF\">Request<\/span><span style=\"color: #B392F0\"> $request)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    <\/span><span style=\"color: #F97583\">try<\/span><span style=\"color: #B392F0\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">       <\/span><span style=\"color: #6B737C\">\/\/ Define validation rules and error messages for the request.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">          $validationRules <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">              <\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;required|email&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #6B737C\">\/\/ Validate email format<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">              <\/span><span style=\"color: #FFAB70\">&#39;password&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;required&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">          ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">          $customValidationMessages <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">              <\/span><span style=\"color: #FFAB70\">&#39;email.required&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;The email field is required.&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">              <\/span><span style=\"color: #FFAB70\">&#39;email.email&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Invalid email format.&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">              <\/span><span style=\"color: #FFAB70\">&#39;password.required&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;The password field is required.&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">          ];<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Create a Validator instance to validate the incoming request data.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $validator <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">Validator<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">make<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">$request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">all<\/span><span style=\"color: #BBBBBB\">(),<\/span><span style=\"color: #B392F0\"> $validationRules<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $customValidationMessages<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    <\/span><span style=\"color: #6B737C\">\/\/ Check if validation fails.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #B392F0\"> ($validator<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">fails<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Prepare a response for validation errors.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $response <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;code&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">422<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #6B737C\">\/\/ 422 Unprocessable Entity is a more appropriate status for validation errors<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;status&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">false<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;message&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Validation error&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;errors&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $validator<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">errors<\/span><span style=\"color: #BBBBBB\">(),<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #6B737C\">\/\/ Include all validation errors<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #6B737C\">\/\/ Return a JSON response with the validation errors.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">$response<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">422<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">\/\/ Query the user based on &#39;email&#39;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $user <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">User<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">where<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #F97583\">function<\/span><span style=\"color: #B392F0\"> ($query) <\/span><span style=\"color: #F97583\">use<\/span><span style=\"color: #B392F0\"> ($request) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            $query<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">where<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">email<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        }<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">first<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">\/\/ Check user authentication and password<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #F97583\">if<\/span><span style=\"color: #B392F0\"> (<\/span><span style=\"color: #F97583\">!<\/span><span style=\"color: #B392F0\">$user <\/span><span style=\"color: #F97583\">||<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">!<\/span><span style=\"color: #79B8FF\">Hash<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">check<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">$request<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">password<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">password<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                <\/span><span style=\"color: #FFAB70\">&#39;code&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">401<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                <\/span><span style=\"color: #FFAB70\">&#39;status&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">false<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">                <\/span><span style=\"color: #FFAB70\">&#39;message&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Unauthorized&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            ]<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">401<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">\/\/ Revoke existing tokens to ensure security<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">tokens<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">each<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #F97583\">fn<\/span><span style=\"color: #B392F0\"> ($token) =&gt; $token<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">delete<\/span><span style=\"color: #BBBBBB\">())<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">\/\/ Create a new API token for the user<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $token <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">createToken<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;auth_token&#39;<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">plainTextToken;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">\/\/ Fetch user data using the &#39;getUserData&#39; function<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        $userData <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">$this<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">getUserData<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">$user<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">\/\/ Return a successful login response with user data and an access token<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;code&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;status&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">true<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;message&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;Logged in successfully!&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;access_token&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $token<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;data&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userData<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ]<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">200<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    } <\/span><span style=\"color: #F97583\">catch<\/span><span style=\"color: #B392F0\"> (<\/span><span style=\"color: #BBBBBB\">\\<\/span><span style=\"color: #79B8FF\">Throwable<\/span><span style=\"color: #B392F0\"> $th) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     <\/span><span style=\"color: #6B737C\">\/\/ Handle exceptions and return a server error response<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">         <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> response<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">json<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #B392F0\">[<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;code&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">500<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;status&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">false<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">            <\/span><span style=\"color: #FFAB70\">&#39;message&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #FFAB70\">&#39;An error occurred while processing your request.&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        ]<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F8F8F8\">500<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #B392F0\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F97583\">private<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">function<\/span><span style=\"color: #B392F0\"> getUserData(<\/span><span style=\"color: #79B8FF\">User<\/span><span style=\"color: #B392F0\"> $user)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    $userDetails <\/span><span style=\"color: #F97583\">=<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #79B8FF\">CustomerDetails<\/span><span style=\"color: #F97583\">::<\/span><span style=\"color: #B392F0\">where<\/span><span style=\"color: #BBBBBB\">(<\/span><span style=\"color: #FFAB70\">&#39;user_id&#39;<\/span><span style=\"color: #BBBBBB\">,<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">id<\/span><span style=\"color: #BBBBBB\">)<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">firstOrFail<\/span><span style=\"color: #BBBBBB\">()<\/span><span style=\"color: #B392F0\">;  <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6B737C\">\/\/ Build and return user data.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    <\/span><span style=\"color: #F97583\">return<\/span><span style=\"color: #B392F0\"> [<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;id&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">id<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;name&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">name<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;email&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $user<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">email<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;firstname&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">firstname<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;lastname&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">lastname<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;gender&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">gender<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;dob&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">dob<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;age&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">age<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;phone&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">phone<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;second_email&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">second_email<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;address_line1&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_line1<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;address_line2&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_line2<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;address_city&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_city<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;address_state&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_state<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;address_country&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_country<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;address_pincode&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">address_pincode<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">        <\/span><span style=\"color: #FFAB70\">&#39;image_path&#39;<\/span><span style=\"color: #B392F0\"> <\/span><span style=\"color: #F97583\">=&gt;<\/span><span style=\"color: #B392F0\"> $userDetails<\/span><span style=\"color: #F97583\">-&gt;<\/span><span style=\"color: #B392F0\">image_path<\/span><span style=\"color: #BBBBBB\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">     <\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">    ];<\/span><\/span>\n<span class=\"line\"><span style=\"color: #B392F0\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Here are the improvements and best practices applied to the code:<\/p>\n\n\n\n<ol>\n<li><strong>Improved Validation<\/strong>: We&#8217;ve improved the validation process. <\/li>\n\n\n\n<li><strong>Revised Queries<\/strong>: We use a closure to define the <code>where<\/code> clause for email which makes the query more concise.<\/li>\n\n\n\n<li><strong>Consistent Response Codes<\/strong>: We&#8217;re using HTTP status codes that better represent the response, like 401 for unauthorized access and 500 for server errors.<\/li>\n\n\n\n<li><strong>Separated User Data Retrieval<\/strong>: The code for fetching user details and statistics has been moved to a separate method (<code>getUserData<\/code>) to improve code organization and readability.<\/li>\n\n\n\n<li><strong>Refactored Error Handling<\/strong>: The error handling message provides a more generic error message to avoid exposing sensitive details in the event of an error.<\/li>\n\n\n\n<li><strong>Lambda Functions<\/strong>: We&#8217;ve used lambda functions (Closures) to simplify some operations, making the code more concise.<\/li>\n<\/ol>\n\n\n\n<p>These changes align with Laravel&#8217;s best practices, improve code readability, and enhance security by providing a more structured and secure login process. <\/p>\n\n\n\n<p>Thanks, Happy Coding \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The provided code is a Laravel 8 API endpoint for user login. It handles user authentication and returns a response with user information and an access token upon successful login. Here&#8217;s a breakdown of the code: This code accomplishes the following: This code demonstrates secure user authentication, token management, and error-handling practices commonly used in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59],"tags":[44,60,3,8,4],"_links":{"self":[{"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/posts\/454"}],"collection":[{"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/comments?post=454"}],"version-history":[{"count":5,"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/posts\/454\/revisions"}],"predecessor-version":[{"id":463,"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/posts\/454\/revisions\/463"}],"wp:attachment":[{"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/media?parent=454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/categories?post=454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rishikantsri.in\/blog\/wp-json\/wp\/v2\/tags?post=454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}