diff --git a/app/Events/NewChatMessage.php b/app/Events/NewChatMessage.php index 8cf8c58..92f616a 100644 --- a/app/Events/NewChatMessage.php +++ b/app/Events/NewChatMessage.php @@ -60,6 +60,7 @@ class NewChatMessage implements ShouldBroadcastNow 'sender_id' => $this->message->sender_id, 'sender_type' => $this->message->sender_type, 'message' => $this->message->message, + 'client_id' => $this->message->client_id, // ✅ relative path only 'file_path' => $this->message->file_path ?? null, diff --git a/app/Http/Controllers/Admin/AdminInvoiceController.php b/app/Http/Controllers/Admin/AdminInvoiceController.php index b88b4d6..0209ff0 100644 --- a/app/Http/Controllers/Admin/AdminInvoiceController.php +++ b/app/Http/Controllers/Admin/AdminInvoiceController.php @@ -183,6 +183,8 @@ class AdminInvoiceController extends Controller // Mark as 'paid' if GST-inclusive total is cleared if ($newPaid >= $invoice->final_amount_with_gst) { $invoice->update(['status' => 'paid']); + + $this->generateInvoicePDF($invoice); } return response()->json([ @@ -210,6 +212,8 @@ class AdminInvoiceController extends Controller // Update status if not fully paid anymore if ($remaining > 0 && $invoice->status === "paid") { $invoice->update(['status' => 'pending']); + + $this->generateInvoicePDF($invoice); } return response()->json([ diff --git a/app/Http/Controllers/UserAuthController.php b/app/Http/Controllers/UserAuthController.php index 256f98a..9d407b2 100644 --- a/app/Http/Controllers/UserAuthController.php +++ b/app/Http/Controllers/UserAuthController.php @@ -6,76 +6,48 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use PHPOpenSourceSaver\JWTAuth\Facades\JWTAuth; use App\Models\User; +use Illuminate\Support\Facades\Log; class UserAuthController extends Controller { - public function refreshToken() - { - \Log::info('🔄 refreshToken() called'); +public function refreshToken() +{ + Log::info('🔄 [JWT-REFRESH] called'); - try { - // Get current token - $currentToken = JWTAuth::getToken(); + try { + $newToken = JWTAuth::parseToken()->refresh(); - if (!$currentToken) { - \Log::warning('⚠ No token provided in refreshToken()'); - return response()->json([ - 'success' => false, - 'message' => 'Token not provided', - ], 401); - } + Log::info('✅ [JWT-REFRESH] Token refreshed'); - \Log::info('📥 Current Token:', ['token' => (string) $currentToken]); + return response()->json([ + 'success' => true, + 'token' => $newToken, + ]); - // Try refreshing token - $newToken = JWTAuth::refresh($currentToken); + } catch (\PHPOpenSourceSaver\JWTAuth\Exceptions\TokenExpiredException $e) { + Log::warning('⛔ [JWT-REFRESH] Refresh TTL expired'); - \Log::info('✅ Token refreshed successfully', ['new_token' => $newToken]); + return response()->json([ + 'success' => false, + 'message' => 'Refresh expired. Please login again.', + ], 401); - return response()->json([ - 'success' => true, - 'token' => $newToken, - ]); + } catch (\Exception $e) { + Log::error('🔥 [JWT-REFRESH] Exception', [ + 'error' => $e->getMessage(), + ]); - } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) { - \Log::error('❌ TokenExpiredException in refreshToken()', [ - 'message' => $e->getMessage(), - ]); - return response()->json([ - 'success' => false, - 'message' => 'Token expired, cannot refresh.', - ], 401); - - } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) { - \Log::error('❌ TokenInvalidException in refreshToken()', [ - 'message' => $e->getMessage(), - ]); - return response()->json([ - 'success' => false, - 'message' => 'Invalid token.', - ], 401); - - } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) { - \Log::error('❌ JWTException in refreshToken()', [ - 'message' => $e->getMessage(), - ]); - return response()->json([ - 'success' => false, - 'message' => 'Could not refresh token.', - ], 401); - - } catch (\Exception $e) { - \Log::error('❌ General Exception in refreshToken()', [ - 'message' => $e->getMessage(), - 'trace' => $e->getTraceAsString(), - ]); - return response()->json([ - 'success' => false, - 'message' => 'Unexpected error while refreshing token.', - ], 500); - } + return response()->json([ + 'success' => false, + 'message' => 'Unable to refresh token.', + ], 401); } +} + + + + /** * User Login diff --git a/app/Http/Controllers/user/ChatController.php b/app/Http/Controllers/user/ChatController.php index ed1e9e4..8ca12f7 100644 --- a/app/Http/Controllers/user/ChatController.php +++ b/app/Http/Controllers/user/ChatController.php @@ -67,7 +67,7 @@ class ChatController extends Controller 'sender_id' => auth()->id(), 'sender_type' => \App\Models\User::class, 'message' => $request->message, - + 'client_id' => $request->client_id, // ✅ ADD 'read_by_admin' => false, 'read_by_user' => true, ]; diff --git a/app/Models/ChatMessage.php b/app/Models/ChatMessage.php index 3723ed3..c059d1f 100644 --- a/app/Models/ChatMessage.php +++ b/app/Models/ChatMessage.php @@ -18,6 +18,7 @@ class ChatMessage extends Model 'file_type', 'read_by_admin', 'read_by_user', + 'client_id', ]; diff --git a/config/jwt.php b/config/jwt.php index 50d2e2a..fcaf30a 100644 --- a/config/jwt.php +++ b/config/jwt.php @@ -89,7 +89,7 @@ return [ | */ - 'ttl' => (int) env('JWT_TTL', 86400), + 'ttl' => (int) env('JWT_TTL', 15), /* |-------------------------------------------------------------------------- @@ -108,7 +108,7 @@ return [ | */ - 'refresh_ttl' => (int) env('JWT_REFRESH_TTL', 129600), + 'refresh_ttl' => (int) env('JWT_REFRESH_TTL', 60), /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2025_12_17_053233_add_client_id_to_chat_messages.php b/database/migrations/2025_12_17_053233_add_client_id_to_chat_messages.php new file mode 100644 index 0000000..ad2e653 --- /dev/null +++ b/database/migrations/2025_12_17_053233_add_client_id_to_chat_messages.php @@ -0,0 +1,25 @@ +string('client_id') + ->nullable() + ->after('sender_type') + ->index(); + }); + } + + public function down(): void + { + Schema::table('chat_messages', function (Blueprint $table) { + $table->dropColumn('client_id'); + }); + } +}; diff --git a/public/invoices/invoice-INV-2025-000014.pdf b/public/invoices/invoice-INV-2025-000014.pdf index a2f5b70..ab8e570 100644 Binary files a/public/invoices/invoice-INV-2025-000014.pdf and b/public/invoices/invoice-INV-2025-000014.pdf differ diff --git a/public/invoices/invoice-INV-2025-000027.pdf b/public/invoices/invoice-INV-2025-000027.pdf new file mode 100644 index 0000000..67f4c00 Binary files /dev/null and b/public/invoices/invoice-INV-2025-000027.pdf differ diff --git a/public/invoices/invoice-INV-2025-000028.pdf b/public/invoices/invoice-INV-2025-000028.pdf index 2778e4d..3a24644 100644 Binary files a/public/invoices/invoice-INV-2025-000028.pdf and b/public/invoices/invoice-INV-2025-000028.pdf differ diff --git a/public/invoices/invoice-INV-2025-000029.pdf b/public/invoices/invoice-INV-2025-000029.pdf index f5a8e87..212a927 100644 Binary files a/public/invoices/invoice-INV-2025-000029.pdf and b/public/invoices/invoice-INV-2025-000029.pdf differ diff --git a/public/invoices/invoice-INV-2025-000030.pdf b/public/invoices/invoice-INV-2025-000030.pdf index 605f767..2f12f72 100644 Binary files a/public/invoices/invoice-INV-2025-000030.pdf and b/public/invoices/invoice-INV-2025-000030.pdf differ diff --git a/public/profile_upload/profile_1765625223.jpg b/public/profile_upload/profile_1765625223.jpg deleted file mode 100644 index c6978fa..0000000 Binary files a/public/profile_upload/profile_1765625223.jpg and /dev/null differ diff --git a/public/profile_upload/profile_1766120292.jpg b/public/profile_upload/profile_1766120292.jpg new file mode 100644 index 0000000..3923309 Binary files /dev/null and b/public/profile_upload/profile_1766120292.jpg differ diff --git a/routes/api.php b/routes/api.php index 1dc3d54..8cb2ed3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -19,8 +19,11 @@ Route::post('/signup-request', [RequestController::class, 'usersignup']); //login / logout Route::post('/user/login', [UserAuthController::class, 'login']); + +Route::post('/auth/refresh', [UserAuthController::class, 'refreshToken']); + + Route::middleware(['auth:api'])->group(function () { - //Route::post('/user/refresh', [UserAuthController::class, 'refreshToken']); Route::post('/user/logout', [UserAuthController::class, 'logout']); @@ -35,9 +38,10 @@ Route::middleware(['auth:api'])->group(function () { Route::get('/user/order/{order_id}/shipment', [UserOrderController::class, 'orderShipment']); Route::get('/user/order/{order_id}/invoice', [UserOrderController::class, 'orderInvoice']); Route::get('/user/order/{order_id}/track', [UserOrderController::class, 'trackOrder']); - Route::get('/user/invoice/{invoice_id}/details', [UserOrderController::class, 'invoiceDetails']); + // Invoice List + Route::get('/user/invoice/{invoice_id}/details', [UserOrderController::class, 'invoiceDetails']); Route::get('/user/invoices', [UserOrderController::class, 'allInvoices']); Route::get('/user/invoice/{invoice_id}/installments', [UserOrderController::class, 'invoiceInstallmentsById']); diff --git a/routes/web.php b/routes/web.php index eb68c01..5a67036 100644 --- a/routes/web.php +++ b/routes/web.php @@ -35,6 +35,10 @@ Route::prefix('admin')->middleware('web')->group(function () { }); +Route::get('/login', function () { + return redirect()->route('admin.login'); +})->name('login'); + @@ -217,8 +221,8 @@ Route::prefix('admin') ->name('admin.invoice.installment.delete'); - //Add New Invoice - Route::get('/admin/invoices/create', [InvoiceController::class, 'create'])->name('admin.invoices.create'); + // //Add New Invoice + Route::get('/admin/invoices/create', [InvoiceController::class, 'create'])->name('admin.invoices.create'); // ---------------------------