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/Driver/AuthController.php
<?php

namespace App\Http\Controllers\Api\Driver;

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

class AuthController extends Controller
{
    public function login(Request $request, TwilioService $twilio)
    {
        // dd($request->all());
        $validator = Validator::make($request->all(), [
            'phone' => 'required|digits:10|exists:drivers,phone',
        ]);
        if ($validator->fails()) {
            return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
        }

        $driver = Driver::where('phone', $request->phone)->first();
        $otp = rand(1000, 9999);
        $driver->otp = $otp;
        $driver->otp_expires_at = now()->addMinutes(5);
        $driver->save();

        try {
            Log::info("OTP for {$driver->phone} is $otp");
            $twilio->sendSms('+91' . $driver->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);
        }
    }

    public function verifyOtp(Request $request)
    {
        try {
            $validator = Validator::make($request->all(), [
                'phone' => 'required|digits:10|exists:drivers,phone',
                'otp'   => 'required|digits:4',
            ]);

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

            $driver = Driver::where('phone', $request->phone)
                ->where('otp', $request->otp)
                ->where('otp_expires_at', '>', now())
                ->first();

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

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

            $token = $driver->createToken('auth_token')->plainTextToken;

            return response()->json([
                'status'  => true,
                'message' => 'OTP verified successfully.',
                'token'   => $token,
                'driver'  => $driver
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'status'  => false,
                'message' => 'OTP verification failed: ' . $e->getMessage()
            ], 500);
        }
    }

    public function resendOtp(Request $request, TwilioService $twilio)
    {
        try {
            $validator = Validator::make($request->all(), [
                'phone' => 'required|digits:10|exists:drivers,phone',
            ]);

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

            $otp = rand(1000, 9999);

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

            Log::info("Resent OTP to {$driver->phone}: $otp");
            $twilio->sendSms('+91' . $driver->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);
        }
    }

    public function logout(Request $request)
    {
        try {
            $driver = $request->user();

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

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

            return response()->json([
                'status'  => false,
                'message' => 'Driver not authenticated or token missing.'
            ], 401);
        } catch (\Exception $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Logout failed: ' . $e->getMessage()
            ], 500);
        }
    }

    public function profile(Request $request)
    {
        try {
            $driver = $request->user();
            $driver->load('documents');

            $documents = [
                'dl' => null,
                'aadhaar_front_photo' => null,
                'aadhaar_back_photo' => null,
                'image' => $driver->image ? asset('storage/' . $driver->image) : null
            ];

            foreach ($driver->documents as $doc) {
                $documents[$doc->doc_type] = [
                    'doc_number' => $doc->doc_number,
                    'file_url' => $doc->file_url ? asset('storage/' . $doc->file_url) : null
                ];
            }

            return response()->json([
                'status'  => true,
                'message' => 'Driver profile fetched successfully.',
                'driver'  => [
                    'id' => $driver->id,
                    'name' => $driver->name,
                    'email' => $driver->email,
                    'phone' => $driver->phone,
                    'alternate_number' => $driver->alternate_number,
                    'age' => $driver->age,
                    'gender' => $driver->gender,
                    'license_number' => $driver->license_number,
                    'aadhaar_number' => $driver->aadhaar_number,
                    'status' => $driver->status,
                    'mode' => $driver->mode,
                    'profile_image' => $driver->image ? asset('storage/' . $driver->image) : null,
                ],
                'documents' => $documents
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Failed to fetch profile: ' . $e->getMessage()
            ], 500);
        }
    }

    public function updateProfile(Request $request)
    {
        try {
            $driver = $request->user();

            $validated = $request->validate([
                'name' => 'required|string|max:255',
                'email' => 'nullable|email|max:255',
                'phone' => 'required|string|max:15',
                'alternate_number' => 'nullable|string|max:15',
                'age' => 'nullable|integer|min:18',
                'gender' => 'nullable|in:male,female,Other',

                'license_number' => 'nullable|string|max:50',
                'dl' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',

                'aadhaar_number' => 'nullable|string|max:20',
                'aadhaar_front_photo' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',
                'aadhaar_back_photo' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',

                'image' => 'nullable|file|mimes:jpg,jpeg,png|max:2048',
            ]);

            // Update basic details
            $driver->fill([
                'name' => $validated['name'],
                'email' => $validated['email'] ?? $driver->email,
                'phone' => $validated['phone'],
                'alternate_number' => $validated['alternate_number'] ?? $driver->alternate_number,
                'age' => $validated['age'] ?? $driver->age,
                'gender' => $validated['gender'] ?? $driver->gender,
                'license_number' => $validated['license_number'] ?? $driver->license_number,
                'aadhaar_number' => $validated['aadhaar_number'] ?? $driver->aadhaar_number,
            ]);

            if ($request->hasFile('image')) {
                $driver->image = $request->file('image')->store("uploads/driver/{$driver->id}", 'public');
            }

            $driver->save();

            $docFiles = [
                'dl' => $request->input('license_number'),
                'aadhaar_front_photo' => $request->input('aadhaar_number'),
                'aadhaar_back_photo' => $request->input('aadhaar_number'),
            ];

            foreach ($docFiles as $type => $docNumber) {
                if ($request->hasFile($type)) {
                    $path = $request->file($type)->store("uploads/driver/{$driver->id}", 'public');

                    $driver->documents()->where('doc_type', $type)->delete();

                    $driver->documents()->create([
                        'doc_type' => $type,
                        'doc_number' => $docNumber,
                        'file_url' => $path,
                    ]);
                }
            }

            $driver->load('documents');

            $documents = [
                'dl' => null,
                'aadhaar_front_photo' => null,
                'aadhaar_back_photo' => null,
                'image' => $driver->image ? asset('storage/' . $driver->image) : null
            ];

            foreach ($driver->documents as $doc) {
                $documents[$doc->doc_type] = [
                    'doc_number' => $doc->doc_number,
                    'file_url' => $doc->file_url ? asset('storage/' . $doc->file_url) : null
                ];
            }

            return response()->json([
                'status' => true,
                'message' => 'Driver profile updated successfully.',
                'driver' => [
                    'id' => $driver->id,
                    'name' => $driver->name,
                    'email' => $driver->email,
                    'phone' => $driver->phone,
                    'alternate_number' => $driver->alternate_number,
                    'age' => $driver->age,
                    'gender' => $driver->gender,
                    'license_number' => $driver->license_number,
                    'aadhaar_number' => $driver->aadhaar_number,
                    'status' => $driver->status,
                    'profile_image' => $driver->image ? asset('storage/' . $driver->image) : null,
                ],
                'documents' => $documents
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Failed to update profile: ' . $e->getMessage()
            ], 500);
        }
    }

    public function updateMode(Request $request)
    {
        try {
            $request->validate([
                'mode' => 'required|string|in:0,1'
            ]);

            $driver = auth('driver-api')->user();
            $driver->mode = $request->mode;
            $driver->save();

            return response()->json([
                'status' => true,
                'message' => 'Mode updated successfully',
                'data' => $driver
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'status'  => false,
                'message' => 'Failed to update mode: ' . $e->getMessage()
            ], 500);
        }
    }
}