HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: //var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Api/Customer/AuthController.php
<?php

namespace App\Http\Controllers\Api\Customer;

use App\Http\Controllers\Controller;
use App\Models\Customer;
use App\Services\TwilioService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
    public function signup(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'first_name'     => 'required|string|max:255',
            'last_name'      => 'nullable|string|max:255',
            'email'         => 'required|email|unique:customers,email',
            'phone'      => 'required|digits:10|unique:customers,phone',
            'alternative_phone' => 'nullable|digits:10',
            'date_of_birth'     => 'required',
            'gender'        => 'required',
        ]);

        if ($validator->fails()) {
            return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
        }

        // $otp = rand(1000, 9999);
        $otp = 1234;

        $user = Customer::create([
            'first_name'     => $request->first_name,
            'last_name'      => $request->last_name,
            'email'          => $request->email,
            'phone'       => $request->phone,
            'alternative_no' => $request->alternative_phone,
            'date_of_birth'  => $request->date_of_birth,
            'gender'         => $request->gender,
            'otp'            => $otp,
            'otp_expires_at' => now()->addMinutes(5),
        ]);

        // try {
        //     Log::info("OTP for {$user->phone} is $otp");
        //     // $twilio->sendSms("+91" . $user->phone, "Your OTP is: $otp");
        // } catch (\Exception $e) {
        //     return response()->json(['status' => false, 'message' => 'Failed to send SMS', 'error' => $e->getMessage()], 500);
        // }

        return response()->json([
            'status'  => true,
            'message' => 'Signup initiated. OTP sent to phone.'
        ]);
    }
    public function login(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits:10|exists:customers,phone',
        ]);
        if ($validator->fails()) {
            return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
        }

        $customer = Customer::where('phone', $request->phone)->first();
        // $otp = rand(1000, 9999);
        $otp = 1234;
        $customer->otp = $otp;
        $customer->otp_expires_at = now()->addMinutes(5);
        $customer->save();

        // try {
        //     Log::info("OTP for {$customer->phone} is $otp");
        //     $twilio->sendSms('+91' . $customer->phone, "Your OTP is: $otp");
        //     return response()->json([
        //         'status'  => true,
        //         'message' => 'OTP sent to your phone number.',
        //     ]);
        // } catch (\Exception $e) {
        //     return response()->json([
        //         'status'  => false,
        //         'message' => 'Failed to send OTP.',
        //         'error'   => $e->getMessage(),
        //     ], 500);
        // }
         return response()->json([
            'status'  => true,
            'message' => 'OTP sent to your phone number.',
        ]);
    }

    public function verifyOtp(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits:10|exists:customers,phone',
            'otp' => 'required|digits:4',
        ]);
        if ($validator->fails()) {
            return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
        }
        $customer = Customer::where('phone', $request->phone)
            ->where('otp', $request->otp)
            ->where('otp_expires_at', '>', now())
            ->first();

        if (!$customer) {
            return response()->json([
                'status'  => false,
                'message' => 'Invalid or expired OTP.'
            ], 401);
        }

        $customer->otp = null;
        $customer->otp_expires_at = null;
        $customer->save();

        $token = $customer->createToken('auth_token')->plainTextToken;
        return response()->json([
            'status'  => true,
            'message' => 'OTP verified successfully.',
            'token'   => $token,
            'customer'    => $customer
        ]);
    }
    public function resendOtp(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits:10|exists:customers,phone',
        ]);
        if ($validator->fails()) {
            return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
        }

        $otp = 1234;
        // $otp = rand(1000, 9999);

        $customer = Customer::where('phone', $request->phone)->first();
        $customer->update([
            'otp'             => $otp,
            'otp_expires_at'  => now()->addMinutes(5),
        ]);

        // try {
        //     Log::info("Resent OTP to {$customer->phone}: $otp");
        //     $twilio->sendSms('+91' . $customer->phone, "Your new OTP is: $otp");
            
        //     return response()->json([
        //         'status'  => true,
        //         'message' => 'OTP resent successfully to your phone number.',
        //     ]);
        // } catch (\Exception $e) {
        //     return response()->json([
        //         'status'  => false,
        //         'message' => 'Failed to send OTP.',
        //         'error'   => $e->getMessage(),
        //     ], 500);
        // }
         return response()->json([
            'status'  => true,
            'message' => 'OTP sent to your phone number.',
        ]);
    }
    public function logout(Request $request)
    {
        $customer = $request->user();

        if ($customer && $customer->currentAccessToken()) {
            $customer->currentAccessToken()->delete();

            return response()->json([
                'status' => true,
                'message' => 'Logged out successfully.'
            ]);
        }

        return response()->json([
            'status' => false,
            'message' => 'customer not authenticated or token missing.'
        ], 401);
    }

    public function profile(Request $request)
    {
        $customer = $request->user();

        return response()->json([
            'status' => true,
            'message' => 'customer profile fetched successfully.',
            'customer' => $customer
        ]);
    }
    public function updateProfile(Request $request)
    {
        $customer = $request->user();

        $validated = $request->validate([
            'first_name'        => 'required|string|max:255',
            'last_name'         => 'required|string|max:255',
            'email'             => 'required|email|unique:customers,email,' . $customer->id,
            'phone'             => 'required|string|max:15',
            'alternative_phone' => 'nullable|string|max:15',
            'date_of_birth'     => 'nullable|date',
            'gender'            => 'nullable|in:male,female,other',
        ]);

        $customer->update($validated);

        return response()->json([
            'status' => true,
            'message' => 'Customer profile updated successfully.',
            'customer' => $customer->fresh()
        ]);
    }
    public function deleteAccount(Request $request)
{
    $customer = $request->user();

    if ($customer) {
        $customer->tokens()->delete(); 
        $customer->delete(); 

        return response()->json([
            'status' => true,
            'message' => 'Your account has been deleted successfully.'
        ]);
    }

    return response()->json([
        'status' => false,
        'message' => 'Customer not authenticated.'
    ], 401);
}
}