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);
}
}
}