AI Knowledge Base - Routes Structure
AI Knowledge Base - Routes Structure
Menu SQL: /Users/nscapati/Desktop/ai_knowledge_base_menu.sql
Data: 22 Ottobre 2025
---
π Routes da Implementare
Gruppo: AI Knowledge Base (admin/ai/kb)
``php
// routes/ai_kb.php
Route::prefix('admin/ai/kb')->name('admin.ai.kb.')->middleware(['auth', 'role:super-admin'])->group(function () { // ======================================== // 1. DASHBOARD KB // ======================================== Route::get('/dashboard', [AiKbDashboardController::class, 'index']) ->name('dashboard'); // ======================================== // 2. AMBITI // ======================================== Route::prefix('ambiti')->name('ambiti.')->group(function () { Route::get('/', [AiAmbitiController::class, 'index'])->name('index'); Route::get('/create', [AiAmbitiController::class, 'create'])->name('create'); Route::post('/', [AiAmbitiController::class, 'store'])->name('store'); Route::get('/{ambito}', [AiAmbitiController::class, 'show'])->name('show'); Route::get('/{ambito}/edit', [AiAmbitiController::class, 'edit'])->name('edit'); Route::put('/{ambito}', [AiAmbitiController::class, 'update'])->name('update'); Route::delete('/{ambito}', [AiAmbitiController::class, 'destroy'])->name('destroy'); // Toggle attivo/disattivo Route::post('/{ambito}/toggle', [AiAmbitiController::class, 'toggle'])->name('toggle'); // Riordina (drag & drop) Route::post('/reorder', [AiAmbitiController::class, 'reorder'])->name('reorder'); }); // ======================================== // 3. TEMPLATE // ======================================== Route::prefix('templates')->name('templates.')->group(function () { // CRUD Standard Route::get('/', [AiTemplatesController::class, 'index'])->name('index'); Route::get('/create', [AiTemplatesController::class, 'create'])->name('create'); Route::post('/', [AiTemplatesController::class, 'store'])->name('store'); Route::get('/{template}', [AiTemplatesController::class, 'show'])->name('show'); Route::get('/{template}/edit', [AiTemplatesController::class, 'edit'])->name('edit'); Route::put('/{template}', [AiTemplatesController::class, 'update'])->name('update'); Route::delete('/{template}', [AiTemplatesController::class, 'destroy'])->name('destroy'); // Clone template Route::post('/{template}/clone', [AiTemplatesController::class, 'clone'])->name('clone'); // Toggle attivo/disattivo Route::post('/{template}/toggle', [AiTemplatesController::class, 'toggle'])->name('toggle'); // ======================================== // 3.1 GENERAZIONE AI // ======================================== Route::get('/generate', [AiTemplateGeneratorController::class, 'form'])->name('generate'); Route::post('/generate', [AiTemplateGeneratorController::class, 'generate'])->name('generate.process'); // Genera suggestions (AJAX) Route::post('/generate/suggestions', [AiTemplateGeneratorController::class, 'suggestions']) ->name('generate.suggestions'); // Genera SQL da natural language (AJAX) Route::post('/generate/sql', [AiTemplateGeneratorController::class, 'generateSql']) ->name('generate.sql'); // Genera response template (AJAX) Route::post('/generate/response', [AiTemplateGeneratorController::class, 'generateResponse']) ->name('generate.response'); // ======================================== // 3.2 BATCH OPERATIONS // ======================================== Route::get('/import', [AiTemplateBatchController::class, 'importForm'])->name('import'); Route::post('/import', [AiTemplateBatchController::class, 'import'])->name('import.process'); Route::get('/export', [AiTemplateBatchController::class, 'export'])->name('export'); Route::post('/export-selected', [AiTemplateBatchController::class, 'exportSelected']) ->name('export.selected'); // ======================================== // 3.3 TESTING // ======================================== Route::post('/{template}/test', [AiTemplateTestController::class, 'test'])->name('test'); Route::post('/{template}/test-sql', [AiTemplateTestController::class, 'testSql'])->name('test.sql'); Route::post('/{template}/validate', [AiTemplateTestController::class, 'validate'])->name('validate'); }); // ======================================== // 4. PATTERN LIBRARY // ======================================== Route::prefix('patterns')->name('patterns.')->group(function () { Route::get('/', [AiPatternsController::class, 'index'])->name('index'); Route::post('/', [AiPatternsController::class, 'store'])->name('store'); Route::put('/{pattern}', [AiPatternsController::class, 'update'])->name('update'); Route::delete('/{pattern}', [AiPatternsController::class, 'destroy'])->name('destroy'); // Test pattern regex Route::post('/test', [AiPatternsController::class, 'test'])->name('test'); }); // ======================================== // 5. PLAYGROUND (Test & Preview) // ======================================== Route::get('/playground', [AiPlaygroundController::class, 'index'])->name('playground'); Route::post('/playground/test', [AiPlaygroundController::class, 'test'])->name('playground.test'); Route::post('/playground/batch-test', [AiPlaygroundController::class, 'batchTest']) ->name('playground.batch'); // Quick test (modal/sidebar) Route::post('/quick-test', [AiPlaygroundController::class, 'quickTest'])->name('quick-test'); // ======================================== // 6. ANALYTICS KB // ======================================== Route::get('/analytics', [AiKbAnalyticsController::class, 'index'])->name('analytics'); Route::get('/analytics/template/{template}', [AiKbAnalyticsController::class, 'templateDetail']) ->name('analytics.template'); Route::get('/analytics/ambito/{ambito}', [AiKbAnalyticsController::class, 'ambitoDetail']) ->name('analytics.ambito'); // Export analytics Route::get('/analytics/export', [AiKbAnalyticsController::class, 'export']) ->name('analytics.export'); // ======================================== // 7. QUERY NON RISOLTE // ======================================== Route::get('/unmatched', [AiUnmatchedQueriesController::class, 'index'])->name('unmatched'); Route::post('/unmatched/{query}/create-template', [AiUnmatchedQueriesController::class, 'createTemplate']) ->name('unmatched.create-template'); Route::delete('/unmatched/{query}', [AiUnmatchedQueriesController::class, 'dismiss']) ->name('unmatched.dismiss'); // ======================================== // 8. CONFIGURAZIONE AI // ======================================== Route::get('/settings', [AiSettingsController::class, 'index'])->name('settings'); Route::put('/settings', [AiSettingsController::class, 'update'])->name('settings.update'); // Test OpenAI connection Route::post('/settings/test-openai', [AiSettingsController::class, 'testOpenAi']) ->name('settings.test-openai'); });
// ========================================
// 9. CONVERSAZIONI & FEEDBACK (Monitoring)
// ========================================
Route::prefix('admin/ai')->name('admin.ai.')->middleware(['auth', 'role:super-admin'])->group(function () {
// Conversazioni
Route::get('/conversations', [AiConversationsController::class, 'index'])
->name('conversations.index');
Route::get('/conversations/{conversation}', [AiConversationsController::class, 'show'])
->name('conversations.show');
Route::delete('/conversations/{conversation}', [AiConversationsController::class, 'destroy'])
->name('conversations.destroy');
// Feedback
Route::get('/feedback', [AiFeedbackController::class, 'index'])
->name('feedback.index');
Route::get('/feedback/{feedback}', [AiFeedbackController::class, 'show'])
->name('feedback.show');
});
`
---
π― Controllers da Creare
Struttura Cartelle
`
app/Http/Controllers/Admin/AI/KB/
βββ AiKbDashboardController.php
βββ AiAmbitiController.php
βββ AiTemplatesController.php
βββ AiTemplateGeneratorController.php
βββ AiTemplateBatchController.php
βββ AiTemplateTestController.php
βββ AiPatternsController.php
βββ AiPlaygroundController.php
βββ AiKbAnalyticsController.php
βββ AiUnmatchedQueriesController.php
βββ AiSettingsController.php
app/Http/Controllers/Admin/AI/
βββ AiConversationsController.php
βββ AiFeedbackController.php
`
---
π Views da Creare
Struttura Cartelle
`
resources/views/admin/ai/kb/
βββ dashboard.blade.php
β
βββ ambiti/
β βββ index.blade.php
β βββ create.blade.php
β βββ edit.blade.php
β βββ show.blade.php
β
βββ templates/
β βββ index.blade.php
β βββ create.blade.php (wizard 6 step)
β βββ edit.blade.php
β βββ show.blade.php
β βββ generate.blade.php (AI generator)
β βββ import.blade.php
β βββ components/
β βββ template-card.blade.php
β βββ pattern-tester.blade.php
β βββ sql-builder.blade.php
β βββ response-preview.blade.php
β
βββ patterns/
β βββ index.blade.php
β
βββ playground/
β βββ index.blade.php
β
βββ analytics/
β βββ index.blade.php
β βββ template-detail.blade.php
β βββ ambito-detail.blade.php
β
βββ unmatched/
β βββ index.blade.php
β
βββ settings/
βββ index.blade.php
resources/views/admin/ai/
βββ conversations/
β βββ index.blade.php
β βββ show.blade.php
β
βββ feedback/
βββ index.blade.php
βββ show.blade.php
`
---
π¨ Layout Sidebar Menu (Esempio)
Layout Collapsible
`blade
<!-- resources/views/layouts/admin.blade.php -->
<!-- AI KNOWLEDGE BASE MENU -->
<li class="nav-item has-treeview {{ request()->is('admin/ai/kb*') ? 'menu-open' : '' }}">
<a href="#" class="nav-link {{ request()->is('admin/ai/kb*') ? 'active' : '' }}">
<i data-lucide="brain"></i>
<p>
AI Knowledge Base
<i class="right fas fa-angle-left"></i>
<span class="badge badge-info right">KB</span>
</p>
</a>
<ul class="nav nav-treeview">
<!-- Dashboard KB -->
<li class="nav-item">
<a href="{{ route('admin.ai.kb.dashboard') }}" class="nav-link">
<i data-lucide="layout-dashboard"></i>
<p>Dashboard KB</p>
</a>
</li>
<!-- Ambiti -->
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i data-lucide="folder-tree"></i>
<p>
Ambiti
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('admin.ai.kb.ambiti.index') }}" class="nav-link">
<i data-lucide="list"></i>
<p>Elenco Ambiti</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.ambiti.create') }}" class="nav-link">
<i data-lucide="plus-circle"></i>
<p>Nuovo Ambito</p>
</a>
</li>
<li class="nav-divider"></li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.ambiti.show', 'produzione') }}" class="nav-link">
<i data-lucide="trending-up"></i>
<p>π Produzione</p>
</a>
</li>
<!-- ... altri ambiti ... -->
</ul>
</li>
<!-- Template -->
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i data-lucide="file-code"></i>
<p>
Template
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.index') }}" class="nav-link">
<i data-lucide="list"></i>
<p>Elenco Template</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.create') }}" class="nav-link">
<i data-lucide="plus-circle"></i>
<p>Nuovo Template</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.generate') }}" class="nav-link">
<i data-lucide="sparkles"></i>
<p>π€ Genera con AI</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.import') }}" class="nav-link">
<i data-lucide="upload"></i>
<p>Import Batch</p>
</a>
</li>
</ul>
</li>
<!-- Altri menu ... -->
</ul>
</li>
`
---
π Middleware & Permissions
Route Middleware
`php
// Tutti i route AI KB richiedono:
`
Gate Policies (opzionale per granularitΓ )
`php
// app/Policies/AiTemplatePolicy.php
public function view(User $user, AiTemplate $template) { return $user->hasRole('super-admin'); }
public function create(User $user) { return $user->hasRole('super-admin'); }
public function update(User $user, AiTemplate $template) { return $user->hasRole('super-admin'); }
public function delete(User $user, AiTemplate $template)
{
return $user->hasRole('super-admin');
}
`
---
π API Endpoints (AJAX/JSON)
Per UI Interattiva
`php
// AJAX endpoints (return JSON)
Route::post('/admin/ai/kb/templates/generate/suggestions', ...);
Route::post('/admin/ai/kb/templates/generate/sql', ...);
Route::post('/admin/ai/kb/patterns/test', ...);
Route::post('/admin/ai/kb/playground/test', ...);
`
Response Format:
`json
{
"success": true,
"data": { ... },
"message": "Operazione completata"
}
`
---
β Checklist Implementazione
Step 1: Database & Menu (Fatto β )
Step 2: Routes
Step 3: Controllers Skeleton
Step 4: Views Base
Step 5: FunzionalitΓ Core
Step 6: AI Features
---
π Prossimo Step
Vuoi che inizi con:
1. Controllers Skeleton (struttura base tutti i controller) 2. Views Base (Dashboard + layout principale) 3. CRUD Ambiti (implementazione completa primo modulo) 4. Template Generator (feature AI piΓΉ cool)
Dimmi da dove vuoi partire e procediamo al contrattacco! πͺ
Analisi Codice
Blocco 1 php
// routes/ai_kb.php
Route::prefix('admin/ai/kb')->name('admin.ai.kb.')->middleware(['auth', 'role:super-admin'])->group(function () {
// ========================================
// 1. DASHBOARD KB
// ========================================
Route::get('/dashboard', [AiKbDashboardController::class, 'index'])
->name('dashboard');
// ========================================
// 2. AMBITI
// ========================================
Route::prefix('ambiti')->name('ambiti.')->group(function () {
Route::get('/', [AiAmbitiController::class, 'index'])->name('index');
Route::get('/create', [AiAmbitiController::class, 'create'])->name('create');
Route::post('/', [AiAmbitiController::class, 'store'])->name('store');
Route::get('/{ambito}', [AiAmbitiController::class, 'show'])->name('show');
Route::get('/{ambito}/edit', [AiAmbitiController::class, 'edit'])->name('edit');
Route::put('/{ambito}', [AiAmbitiController::class, 'update'])->name('update');
Route::delete('/{ambito}', [AiAmbitiController::class, 'destroy'])->name('destroy');
// Toggle attivo/disattivo
Route::post('/{ambito}/toggle', [AiAmbitiController::class, 'toggle'])->name('toggle');
// Riordina (drag & drop)
Route::post('/reorder', [AiAmbitiController::class, 'reorder'])->name('reorder');
});
// ========================================
// 3. TEMPLATE
// ========================================
Route::prefix('templates')->name('templates.')->group(function () {
// CRUD Standard
Route::get('/', [AiTemplatesController::class, 'index'])->name('index');
Route::get('/create', [AiTemplatesController::class, 'create'])->name('create');
Route::post('/', [AiTemplatesController::class, 'store'])->name('store');
Route::get('/{template}', [AiTemplatesController::class, 'show'])->name('show');
Route::get('/{template}/edit', [AiTemplatesController::class, 'edit'])->name('edit');
Route::put('/{template}', [AiTemplatesController::class, 'update'])->name('update');
Route::delete('/{template}', [AiTemplatesController::class, 'destroy'])->name('destroy');
// Clone template
Route::post('/{template}/clone', [AiTemplatesController::class, 'clone'])->name('clone');
// Toggle attivo/disattivo
Route::post('/{template}/toggle', [AiTemplatesController::class, 'toggle'])->name('toggle');
// ========================================
// 3.1 GENERAZIONE AI
// ========================================
Route::get('/generate', [AiTemplateGeneratorController::class, 'form'])->name('generate');
Route::post('/generate', [AiTemplateGeneratorController::class, 'generate'])->name('generate.process');
// Genera suggestions (AJAX)
Route::post('/generate/suggestions', [AiTemplateGeneratorController::class, 'suggestions'])
->name('generate.suggestions');
// Genera SQL da natural language (AJAX)
Route::post('/generate/sql', [AiTemplateGeneratorController::class, 'generateSql'])
->name('generate.sql');
// Genera response template (AJAX)
Route::post('/generate/response', [AiTemplateGeneratorController::class, 'generateResponse'])
->name('generate.response');
// ========================================
// 3.2 BATCH OPERATIONS
// ========================================
Route::get('/import', [AiTemplateBatchController::class, 'importForm'])->name('import');
Route::post('/import', [AiTemplateBatchController::class, 'import'])->name('import.process');
Route::get('/export', [AiTemplateBatchController::class, 'export'])->name('export');
Route::post('/export-selected', [AiTemplateBatchController::class, 'exportSelected'])
->name('export.selected');
// ========================================
// 3.3 TESTING
// ========================================
Route::post('/{template}/test', [AiTemplateTestController::class, 'test'])->name('test');
Route::post('/{template}/test-sql', [AiTemplateTestController::class, 'testSql'])->name('test.sql');
Route::post('/{template}/validate', [AiTemplateTestController::class, 'validate'])->name('validate');
});
// ========================================
// 4. PATTERN LIBRARY
// ========================================
Route::prefix('patterns')->name('patterns.')->group(function () {
Route::get('/', [AiPatternsController::class, 'index'])->name('index');
Route::post('/', [AiPatternsController::class, 'store'])->name('store');
Route::put('/{pattern}', [AiPatternsController::class, 'update'])->name('update');
Route::delete('/{pattern}', [AiPatternsController::class, 'destroy'])->name('destroy');
// Test pattern regex
Route::post('/test', [AiPatternsController::class, 'test'])->name('test');
});
// ========================================
// 5. PLAYGROUND (Test & Preview)
// ========================================
Route::get('/playground', [AiPlaygroundController::class, 'index'])->name('playground');
Route::post('/playground/test', [AiPlaygroundController::class, 'test'])->name('playground.test');
Route::post('/playground/batch-test', [AiPlaygroundController::class, 'batchTest'])
->name('playground.batch');
// Quick test (modal/sidebar)
Route::post('/quick-test', [AiPlaygroundController::class, 'quickTest'])->name('quick-test');
// ========================================
// 6. ANALYTICS KB
// ========================================
Route::get('/analytics', [AiKbAnalyticsController::class, 'index'])->name('analytics');
Route::get('/analytics/template/{template}', [AiKbAnalyticsController::class, 'templateDetail'])
->name('analytics.template');
Route::get('/analytics/ambito/{ambito}', [AiKbAnalyticsController::class, 'ambitoDetail'])
->name('analytics.ambito');
// Export analytics
Route::get('/analytics/export', [AiKbAnalyticsController::class, 'export'])
->name('analytics.export');
// ========================================
// 7. QUERY NON RISOLTE
// ========================================
Route::get('/unmatched', [AiUnmatchedQueriesController::class, 'index'])->name('unmatched');
Route::post('/unmatched/{query}/create-template', [AiUnmatchedQueriesController::class, 'createTemplate'])
->name('unmatched.create-template');
Route::delete('/unmatched/{query}', [AiUnmatchedQueriesController::class, 'dismiss'])
->name('unmatched.dismiss');
// ========================================
// 8. CONFIGURAZIONE AI
// ========================================
Route::get('/settings', [AiSettingsController::class, 'index'])->name('settings');
Route::put('/settings', [AiSettingsController::class, 'update'])->name('settings.update');
// Test OpenAI connection
Route::post('/settings/test-openai', [AiSettingsController::class, 'testOpenAi'])
->name('settings.test-openai');
});
// ========================================
// 9. CONVERSAZIONI & FEEDBACK (Monitoring)
// ========================================
Route::prefix('admin/ai')->name('admin.ai.')->middleware(['auth', 'role:super-admin'])->group(function () {
// Conversazioni
Route::get('/conversations', [AiConversationsController::class, 'index'])
->name('conversations.index');
Route::get('/conversations/{conversation}', [AiConversationsController::class, 'show'])
->name('conversations.show');
Route::delete('/conversations/{conversation}', [AiConversationsController::class, 'destroy'])
->name('conversations.destroy');
// Feedback
Route::get('/feedback', [AiFeedbackController::class, 'index'])
->name('feedback.index');
Route::get('/feedback/{feedback}', [AiFeedbackController::class, 'show'])
->name('feedback.show');
});
Blocco 2
app/Http/Controllers/Admin/AI/KB/
βββ AiKbDashboardController.php
βββ AiAmbitiController.php
βββ AiTemplatesController.php
βββ AiTemplateGeneratorController.php
βββ AiTemplateBatchController.php
βββ AiTemplateTestController.php
βββ AiPatternsController.php
βββ AiPlaygroundController.php
βββ AiKbAnalyticsController.php
βββ AiUnmatchedQueriesController.php
βββ AiSettingsController.php
app/Http/Controllers/Admin/AI/
βββ AiConversationsController.php
βββ AiFeedbackController.php
Blocco 3
resources/views/admin/ai/kb/
βββ dashboard.blade.php
β
βββ ambiti/
β βββ index.blade.php
β βββ create.blade.php
β βββ edit.blade.php
β βββ show.blade.php
β
βββ templates/
β βββ index.blade.php
β βββ create.blade.php (wizard 6 step)
β βββ edit.blade.php
β βββ show.blade.php
β βββ generate.blade.php (AI generator)
β βββ import.blade.php
β βββ components/
β βββ template-card.blade.php
β βββ pattern-tester.blade.php
β βββ sql-builder.blade.php
β βββ response-preview.blade.php
β
βββ patterns/
β βββ index.blade.php
β
βββ playground/
β βββ index.blade.php
β
βββ analytics/
β βββ index.blade.php
β βββ template-detail.blade.php
β βββ ambito-detail.blade.php
β
βββ unmatched/
β βββ index.blade.php
β
βββ settings/
βββ index.blade.php
resources/views/admin/ai/
βββ conversations/
β βββ index.blade.php
β βββ show.blade.php
β
βββ feedback/
βββ index.blade.php
βββ show.blade.php
Blocco 4 blade
<!-- resources/views/layouts/admin.blade.php -->
<!-- AI KNOWLEDGE BASE MENU -->
<li class="nav-item has-treeview {{ request()->is('admin/ai/kb*') ? 'menu-open' : '' }}">
<a href="#" class="nav-link {{ request()->is('admin/ai/kb*') ? 'active' : '' }}">
<i data-lucide="brain"></i>
<p>
AI Knowledge Base
<i class="right fas fa-angle-left"></i>
<span class="badge badge-info right">KB</span>
</p>
</a>
<ul class="nav nav-treeview">
<!-- Dashboard KB -->
<li class="nav-item">
<a href="{{ route('admin.ai.kb.dashboard') }}" class="nav-link">
<i data-lucide="layout-dashboard"></i>
<p>Dashboard KB</p>
</a>
</li>
<!-- Ambiti -->
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i data-lucide="folder-tree"></i>
<p>
Ambiti
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('admin.ai.kb.ambiti.index') }}" class="nav-link">
<i data-lucide="list"></i>
<p>Elenco Ambiti</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.ambiti.create') }}" class="nav-link">
<i data-lucide="plus-circle"></i>
<p>Nuovo Ambito</p>
</a>
</li>
<li class="nav-divider"></li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.ambiti.show', 'produzione') }}" class="nav-link">
<i data-lucide="trending-up"></i>
<p>π Produzione</p>
</a>
</li>
<!-- ... altri ambiti ... -->
</ul>
</li>
<!-- Template -->
<li class="nav-item has-treeview">
<a href="#" class="nav-link">
<i data-lucide="file-code"></i>
<p>
Template
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.index') }}" class="nav-link">
<i data-lucide="list"></i>
<p>Elenco Template</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.create') }}" class="nav-link">
<i data-lucide="plus-circle"></i>
<p>Nuovo Template</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.generate') }}" class="nav-link">
<i data-lucide="sparkles"></i>
<p>π€ Genera con AI</p>
</a>
</li>
<li class="nav-item">
<a href="{{ route('admin.ai.kb.templates.import') }}" class="nav-link">
<i data-lucide="upload"></i>
<p>Import Batch</p>
</a>
</li>
</ul>
</li>
<!-- Altri menu ... -->
</ul>
</li>
Blocco 5 php
// Tutti i route AI KB richiedono:
- 'auth' (autenticato)
- 'role:super-admin' (solo super-admin)
Blocco 6 php
// app/Policies/AiTemplatePolicy.php
public function view(User $user, AiTemplate $template)
{
return $user->hasRole('super-admin');
}
public function create(User $user)
{
return $user->hasRole('super-admin');
}
public function update(User $user, AiTemplate $template)
{
return $user->hasRole('super-admin');
}
public function delete(User $user, AiTemplate $template)
{
return $user->hasRole('super-admin');
}
Blocco 7 php
// AJAX endpoints (return JSON)
Route::post('/admin/ai/kb/templates/generate/suggestions', ...);
Route::post('/admin/ai/kb/templates/generate/sql', ...);
Route::post('/admin/ai/kb/patterns/test', ...);
Route::post('/admin/ai/kb/playground/test', ...);
Blocco 8 json
{
"success": true,
"data": { ... },
"message": "Operazione completata"
}