name('chatbot.')->group(function () { Route::get('/', [ChatController::class, 'index'])->name('index'); Route::post('/ask', [ChatController::class, 'ask']) ->name('ask') ->middleware('throttle:20,1'); Route::post('/feedback', [FeedbackController::class, 'store'])->name('feedback'); }); // ── Admin Panel ─────────────────────────────────────────────────────────────── Route::prefix('admin')->name('admin.')->middleware(['auth', 'role:admin,staff'])->group(function () { // Dashboard Route::get('/', [DashboardController::class, 'index'])->name('dashboard'); // Kategori — admin sahaja (tiada show page, terus ke edit) Route::resource('categories', CategoryController::class) ->except(['show']) ->middleware('role:admin'); Route::patch('categories/{category}/toggle-status', [CategoryController::class, 'toggleStatus']) ->name('categories.toggle-status')->middleware('role:admin'); // Dokumen Route::resource('documents', DocumentController::class)->except(['destroy']); Route::post('documents/{document}/upload-version', [DocumentController::class, 'uploadVersion']) ->name('documents.upload-version'); Route::patch('documents/{document}/toggle-status', [DocumentController::class, 'toggleStatus']) ->name('documents.toggle-status'); Route::post('documents/{document}/reindex', [DocumentController::class, 'reindex']) ->name('documents.reindex')->middleware('role:admin'); // Route chunks kini diuruskan oleh ChunkReviewController (enhanced dengan status filter) Route::get('documents/{document}/versions/{version}/chunks', [ChunkReviewController::class, 'index']) ->name('documents.chunks'); Route::get('documents/{document}/versions/{version}/download', [DocumentController::class, 'download']) ->name('documents.download'); // Knowledge Items Route::resource('knowledge-items', KnowledgeItemController::class); Route::patch('knowledge-items/{knowledgeItem}/toggle-status', [KnowledgeItemController::class, 'toggleStatus']) ->name('knowledge-items.toggle-status'); Route::post('knowledge-items/{knowledgeItem}/reindex', [KnowledgeItemController::class, 'reindex']) ->name('knowledge-items.reindex'); // Chat Feedback & Review Route::prefix('chat-feedback')->name('chat-feedback.')->group(function () { Route::get('/', [ChatFeedbackController::class, 'index'])->name('index'); Route::get('{chatLog}', [ChatFeedbackController::class, 'show'])->name('show'); Route::post('{chatLog}/convert-to-faq', [ChatFeedbackController::class, 'convertToFaq']) ->name('convert-to-faq'); Route::patch('{chatLog}/toggle-flag', [ChatFeedbackController::class, 'toggleFlag']) ->name('toggle-flag'); }); // Chunk Review & Editing — admin sahaja // Resource: /admin/chunks/{chunk} Route::prefix('chunks')->name('chunks.')->middleware('role:admin')->group(function () { Route::get('{chunk}', [ChunkReviewController::class, 'show'])->name('show'); Route::patch('{chunk}', [ChunkReviewController::class, 'update'])->name('update'); Route::post('{chunk}/exclude', [ChunkReviewController::class, 'exclude'])->name('exclude'); Route::post('{chunk}/include', [ChunkReviewController::class, 'include'])->name('include'); Route::post('{chunk}/reindex', [ChunkReviewController::class, 'reindex'])->name('reindex'); Route::get('{chunk}/split', [ChunkReviewController::class, 'splitForm'])->name('split'); Route::post('{chunk}/split', [ChunkReviewController::class, 'doSplit'])->name('do-split'); }); // Audit Logs — admin sahaja Route::prefix('audit-logs')->name('audit-logs.')->middleware('role:admin')->group(function () { Route::get('/', [AuditLogController::class, 'index'])->name('index'); Route::get('{auditLog}', [AuditLogController::class, 'show'])->name('show'); }); }); // Redirect root ke chatbot Route::get('/', fn() => redirect()->route('chatbot.index'));