Add complete ScoutIQ system: Crawler (RSS+AI), CRUD Controllers (Organizations, Contacts, Opportunities, Sources), dynamic Views, API routes, CLI collector

This commit is contained in:
Hamza-Ayed
2026-06-05 02:23:32 +03:00
parent d2f323a563
commit bd7984f8e3
20 changed files with 2084 additions and 0 deletions

View File

@@ -6,6 +6,10 @@ $app = require_once __DIR__ . '/../bootstrap/app.php';
use App\Controllers\HomeController;
use App\Controllers\AuthController;
use App\Controllers\Admin\DashboardController;
use App\Controllers\Admin\OrganizationsController;
use App\Controllers\Admin\OpportunitiesController;
use App\Controllers\Admin\ContactsController;
use App\Controllers\Admin\SourcesController;
use App\Middleware\SecurityHeaders;
use App\Middleware\RateLimit;
use App\Middleware\CsrfProtection;
@@ -34,11 +38,53 @@ $app->router->group([
'prefix' => '/admin',
'middleware' => [Authenticate::class, CsrfProtection::class]
], function($r) {
// Dashboard
$r->get('/dashboard', [DashboardController::class, 'index']);
// Organizations CRUD
$r->get('/organizations', [OrganizationsController::class, 'index']);
$r->get('/organizations/create', [OrganizationsController::class, 'create']);
$r->post('/organizations/store', [OrganizationsController::class, 'store']);
$r->get('/organizations/{id}', [OrganizationsController::class, 'show']);
$r->get('/organizations/{id}/edit', [OrganizationsController::class, 'edit']);
$r->post('/organizations/{id}/update', [OrganizationsController::class, 'store']);
$r->get('/organizations/{id}/delete', [OrganizationsController::class, 'delete']);
// Opportunities
$r->get('/opportunities', [OpportunitiesController::class, 'index']);
$r->get('/opportunities/{id}', [OpportunitiesController::class, 'show']);
// Contacts CRUD
$r->get('/contacts', [ContactsController::class, 'index']);
$r->get('/contacts/create', [ContactsController::class, 'create']);
$r->post('/contacts/store', [ContactsController::class, 'store']);
$r->get('/contacts/{id}', [ContactsController::class, 'show']);
$r->get('/contacts/{id}/edit', [ContactsController::class, 'edit']);
$r->post('/contacts/{id}/update', [ContactsController::class, 'store']);
$r->get('/contacts/{id}/delete', [ContactsController::class, 'delete']);
$r->post('/contacts/{id}/interaction', [ContactsController::class, 'addInteraction']);
// Sources
$r->get('/sources', [SourcesController::class, 'index']);
$r->get('/sources/create', [SourcesController::class, 'create']);
$r->post('/sources/store', [SourcesController::class, 'store']);
$r->get('/sources/{id}/edit', [SourcesController::class, 'edit']);
$r->post('/sources/{id}/update', [SourcesController::class, 'store']);
$r->get('/sources/{id}/delete', [SourcesController::class, 'delete']);
$r->get('/sources/{id}/run', [SourcesController::class, 'run']);
});
// Logout endpoint
$router->get('/logout', [AuthController::class, 'logout']);
});
// API Routes (no CSRF, uses JWT)
$app->router->group([
'prefix' => '/api',
'middleware' => [RateLimit::class, Authenticate::class]
], function($r) {
$r->get('/organizations', [OrganizationsController::class, 'index']);
$r->get('/opportunities', [OpportunitiesController::class, 'index']);
});
$app->run();