File: /var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Api/Transporter/AuthController.php
<?php
namespace App\Http\Controllers\Api\Transporter;
use App\Http\Controllers\Controller;
use App\Models\Transporter;
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)
{
$validator = Validator::make($request->all(), [
'phone' => 'required|digits:10|exists:transporters,phone',
]);
if ($validator->fails()) {
return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
}
$transporter = Transporter::where('phone', $request->phone)->first();
// $otp = rand(1000, 9999);
$otp = 1234;
$transporter->otp = $otp;
$transporter->otp_expires_at = now()->addMinutes(5);
$transporter->save();
// try {
// Log::info("OTP for {$transporter->phone} is $otp");
// $twilio->sendSms('+91' . $transporter->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)
{
try {
$validator = Validator::make($request->all(), [
'phone' => 'required|digits:10|exists:transporters,phone',
'otp' => 'required|digits:4',
]);
if ($validator->fails()) {
return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
}
$transporter = Transporter::where('phone', $request->phone)
->where('otp', $request->otp)
->where('otp_expires_at', '>', now())
->first();
if (!$transporter) {
return response()->json([
'status' => false,
'message' => 'Invalid or expired OTP.'
], 401);
}
$transporter->otp = null;
$transporter->otp_expires_at = null;
$transporter->save();
$token = $transporter->createToken('auth_token')->plainTextToken;
return response()->json([
'status' => true,
'message' => 'OTP verified successfully.',
'token' => $token,
'transporter' => $transporter
]);
} 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:transporters,phone',
]);
if ($validator->fails()) {
return response()->json(['status' => false, 'errors' => $validator->errors()], 422);
}
$otp = rand(1000, 9999);
$transporter = Transporter::where('phone', $request->phone)->first();
$transporter->update([
'otp' => $otp,
'otp_expires_at' => now()->addMinutes(5),
]);
Log::info("Resent OTP to {$transporter->phone}: $otp");
$twilio->sendSms('+91' . $transporter->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 {
$transporter = $request->user();
if ($transporter && $transporter->currentAccessToken()) {
$transporter->currentAccessToken()->delete();
return response()->json([
'status' => true,
'message' => 'Logged out successfully.'
]);
}
return response()->json([
'status' => false,
'message' => 'Transporter 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 {
$transporter = auth('transporter-api')->user();
$documents = [
'aadhaar' => null,
'pan' => null,
'gst' => null
];
foreach ($transporter->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' => 'Transporter profile fetched successfully.',
'transporter' => [
'id' => $transporter->id,
'company_name' => $transporter->company_name,
'contact_person' => $transporter->contact_person,
'first_name' => $transporter->first_name,
'last_name' => $transporter->last_name,
'email' => $transporter->email,
'phone' => $transporter->phone,
'status' => $transporter->status,
'mode' => $transporter->mode,
],
'documents' => $documents
]);
} catch (\Exception $e) {
return response()->json([
'status' => false,
'message' => 'Failed to fetch profile: ' . $e->getMessage()
], 500);
}
}
public function updateProfile(Request $request)
{
try {
$transporter = $request->user();
$validated = $request->validate([
'company_name' => 'required|string|max:255',
'contact_person' => 'nullable|string|max:255',
'first_name' => 'nullable|string|max:255',
'last_name' => 'nullable|string|max:255',
'email' => 'nullable|email|max:255',
'phone' => 'nullable|string|max:15',
'status' => 'nullable|string|in:active,inactive',
'aadhaar' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',
'pan' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',
'gst' => 'nullable|file|mimes:jpg,jpeg,png,pdf|max:2048',
]);
// Update transporter basic info
$transporter->fill([
'company_name' => $validated['company_name'],
'contact_person' => $validated['contact_person'] ?? $transporter->contact_person,
'first_name' => $validated['first_name'] ?? $transporter->first_name,
'last_name' => $validated['last_name'] ?? $transporter->last_name,
'email' => $validated['email'] ?? $transporter->email,
'phone' => $validated['phone'] ?? $transporter->phone,
'status' => $validated['status'] ?? $transporter->status,
])->save();
// Document numbers
$docNumbers = [
'aadhaar' => $request->input('aadhaar_number'),
'pan' => $request->input('pan_number'),
'gst' => $request->input('gst_number')
];
// Save each document
foreach (['aadhaar', 'pan', 'gst'] as $type) {
if ($request->hasFile($type)) {
$path = $request->file($type)->store("uploads/transporters/{$transporter->id}", 'public');
// Delete old document of this type
$transporter->documents()->where('doc_type', $type)->delete();
// Create new document
$transporter->documents()->create([
'doc_type' => $type,
'doc_number' => $docNumbers[$type] ?? null,
'file_url' => $path,
]);
}
}
$transporter->load('documents');
$documents = [
'aadhaar' => null,
'pan' => null,
'gst' => null
];
foreach ($transporter->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' => 'Transporter profile updated successfully.',
'transporter' => [
'id' => $transporter->id,
'company_name' => $transporter->company_name,
'contact_person' => $transporter->contact_person,
'first_name' => $transporter->first_name,
'last_name' => $transporter->last_name,
'email' => $transporter->email,
'phone' => $transporter->phone,
'status' => $transporter->status,
],
'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'
]);
$transporter = auth('transporter-api')->user();
$transporter->mode = $request->mode;
$transporter->save();
return response()->json([
'status' => true,
'message' => 'Mode updated successfully',
'data' => $transporter
]);
} catch (\Exception $e) {
return response()->json([
'status' => false,
'message' => 'Failed to update mode: ' . $e->getMessage()
], 500);
}
}
}