chat support

This commit is contained in:
Abhishek Mali
2025-12-15 11:03:30 +05:30
parent 0a65d5f596
commit 1aad6b231e
31 changed files with 4670 additions and 35 deletions

View File

@@ -1,12 +1,17 @@
<?php
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\RequestController;
use App\Http\Controllers\UserAuthController;
use App\Http\Controllers\MarkListController;
use App\Http\Controllers\User\UserOrderController;
use App\Http\Controllers\User\UserProfileController;
use App\Http\Controllers\User\ChatController;
//user send request
Route::post('/signup-request', [RequestController::class, 'usersignup']);
@@ -14,8 +19,6 @@ Route::post('/signup-request', [RequestController::class, 'usersignup']);
//login / logout
Route::post('/user/login', [UserAuthController::class, 'login']);
Route::middleware(['auth:api'])->group(function () {
//Route::post('/user/refresh', [UserAuthController::class, 'refreshToken']);
@@ -46,4 +49,40 @@ Route::middleware(['auth:api'])->group(function () {
Route::post('/user/profile-update-request', [UserProfileController::class, 'updateProfileRequest']);
// Route::post('/user/profile/update', [UserProfileController::class, 'updateProfile']);
// ===========================
// CHAT SUPPORT ROUTES
// ===========================
Route::get('/user/chat/start', [ChatController::class, 'startChat']);
Route::get('/user/chat/messages/{ticketId}', [ChatController::class, 'getMessages']);
Route::post('/user/chat/send/{ticketId}', [ChatController::class, 'sendMessage']);
});
Route::post('/broadcasting/auth', function (Request $request) {
$user = auth('api')->user(); // JWT user (Flutter)
if (! $user) {
\Log::warning('BROADCAST AUTH FAILED - NO USER');
return response()->json(['message' => 'Unauthorized'], 401);
}
\Log::info('BROADCAST AUTH OK', [
'user_id' => $user->id,
'channel' => $request->channel_name,
]);
return Broadcast::auth(
$request->setUserResolver(fn () => $user)
);
});

78
routes/channels.php Normal file
View File

@@ -0,0 +1,78 @@
<?php
use Illuminate\Support\Facades\Broadcast;
use App\Models\SupportTicket;
use App\Models\Admin;
use Illuminate\Support\Facades\Log;
file_put_contents(storage_path('logs/broadcast_debug.log'), now()." CHANNELS LOADED\n", FILE_APPEND);
Broadcast::routes([
'middleware' => ['web', 'auth:admin'],
]);
Broadcast::channel('ticket.{ticketId}', function ($user, $ticketId) {
try {
// Very explicit logging to see what arrives here
Log::info("CHANNEL AUTH CHECK (ENTER)", [
'user_present' => $user !== null,
'user_type' => is_object($user) ? get_class($user) : gettype($user),
'user_id' => $user->id ?? null,
'ticketId' => $ticketId,
]);
// Find ticket and log
$ticket = SupportTicket::find($ticketId);
Log::info("CHANNEL AUTH: found ticket", [
'ticket_exists' => $ticket ? true : false,
'ticket_id' => $ticket?->id,
'ticket_user_id' => $ticket?->user_id,
]);
if (! $ticket) {
Log::warning("CHANNEL AUTH: ticket not found", ['ticketId' => $ticketId]);
return false;
}
// If admin, allow
if ($user instanceof Admin) {
Log::info("CHANNEL AUTH: admin allowed", ['admin_id' => $user->id]);
return true;
}
// If normal user, check ownership
if (is_object($user) && isset($user->id)) {
$allowed = $ticket->user_id === $user->id;
Log::info("CHANNEL AUTH: user allowed check", [
'ticket_user_id' => $ticket->user_id,
'current_user_id' => $user->id,
'allowed' => $allowed
]);
return $allowed;
}
Log::warning("CHANNEL AUTH: default deny");
return false;
} catch (\Throwable $e) {
Log::error("CHANNEL AUTH ERROR", [
'message' => $e->getMessage(),
'trace' => $e->getTraceAsString()
]);
return false;
}
});
Broadcast::channel('admin.chat', function ($admin) {
return auth('admin')->check();
});
// Broadcast::channel('ticket.{ticketId}', function ($admin, $ticketId) {
// \Log::info('CHANNEL AUTH OK', [
// 'admin_id' => $admin->id,
// 'ticketId' => $ticketId,
// ]);
// return true;
// });

View File

@@ -11,6 +11,11 @@ use App\Http\Controllers\Admin\AdminCustomerController;
use App\Http\Controllers\Admin\AdminAccountController;
use App\Http\Controllers\Admin\AdminReportController;
use App\Http\Controllers\Admin\AdminStaffController;
use App\Http\Controllers\Admin\AdminChatController;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Http\Request;
// ---------------------------
// Public Front Page
@@ -23,18 +28,21 @@ Route::get('/', function () {
// ADMIN LOGIN ROUTES
// ---------------------------
// login routes (public)
Route::prefix('admin')->group(function () {
Route::prefix('admin')->middleware('web')->group(function () {
Route::get('/login', [AdminAuthController::class, 'showLoginForm'])->name('admin.login');
Route::post('/login', [AdminAuthController::class, 'login'])->name('admin.login.submit');
Route::post('/logout', [AdminAuthController::class, 'logout'])->name('admin.logout');
});
// ==========================================
// PROTECTED ADMIN ROUTES (session protected)
// ==========================================
Route::prefix('admin')
->middleware('auth:admin')
->middleware(['web', 'auth:admin'])
->group(function () {
// Dashboard
@@ -199,8 +207,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');
// ---------------------------
@@ -220,13 +228,26 @@ Route::prefix('admin')
Route::post('/customers/{id}/status', [AdminCustomerController::class, 'toggleStatus'])
->name('admin.customers.status');
// Chat list page
Route::get('/chat-support', [AdminChatController::class, 'index'])
->name('admin.chat_support');
// Chat window (open specific user's chat)
Route::get('/chat-support/{ticketId}', [AdminChatController::class, 'openChat'])
->name('admin.chat.open');
// Admin sending message
Route::post('/chat-support/{ticketId}/send', [AdminChatController::class, 'sendMessage'])
->name('admin.chat.send');
});
// ==========================================
// ADMIN ACCOUNT (AJAX) ROUTES
// ==========================================
Route::prefix('admin/account')
->middleware('auth:admin')
->middleware(['web', 'auth:admin'])
->name('admin.account.')
->group(function () {
@@ -285,7 +306,7 @@ Route::prefix('admin')
->name('admin.orders.download.excel');
Route::prefix('admin/account')->middleware('auth:admin')->name('admin.account.')->group(function () {
Route::prefix('admin/account')->middleware(['web', 'auth:admin'])->name('admin.account.')->group(function () {
Route::post('/toggle-payment', [AdminAccountController::class, 'togglePayment'])->name('toggle');
});
@@ -293,7 +314,7 @@ Route::prefix('admin')
//Edit Button Route
//---------------------------
// protected admin routes
Route::middleware(['auth:admin'])
Route::middleware(['web', 'auth:admin'])
->prefix('admin')
->name('admin.')
->group(function () {