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