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

@@ -0,0 +1,93 @@
<?php
namespace App\Controllers\Admin;
use App\Controllers\Controller;
use App\Core\Request;
use App\Core\Response;
use App\Services\Database\Connection;
use App\Services\Crawler\Collector;
use PDO;
use Throwable;
class SourcesController extends Controller
{
private PDO $pdo;
private Collector $collector;
public function __construct(Connection $connection, Collector $collector)
{
parent::__construct();
$this->pdo = $connection->getPdo();
$this->collector = $collector;
}
public function index(Request $request, Response $response): string
{
$sources = $this->collector->getActiveSources();
// Also get inactive ones
$stmt = $this->pdo->query("SELECT * FROM sources ORDER BY status, name");
$allSources = $stmt->fetchAll();
return $this->render('admin/sources/index', ['sources' => $allSources], 'admin');
}
public function create(Request $request, Response $response): string
{
return $this->render('admin/sources/form', ['source' => null], 'admin');
}
public function edit(Request $request, Response $response, int $id): string
{
$stmt = $this->pdo->prepare("SELECT * FROM sources WHERE id = ?");
$stmt->execute([$id]);
$source = $stmt->fetch();
if (!$source) { $response->redirect('/admin/sources'); return ''; }
return $this->render('admin/sources/form', ['source' => $source], 'admin');
}
public function store(Request $request, Response $response): void
{
$id = $request->post('id', '');
$name = $request->post('name', '');
$url = $request->post('url', '');
$type = $request->post('type', 'rss');
$status = $request->post('status', 'active');
try {
if ($id) {
$stmt = $this->pdo->prepare("UPDATE sources SET name=?, url=?, type=?, status=? WHERE id=?");
$stmt->execute([$name, $url, $type, $status, $id]);
} else {
$stmt = $this->pdo->prepare("INSERT INTO sources (name, url, type, status) VALUES (?, ?, ?, ?)");
$stmt->execute([$name, $url, $type, $status]);
}
$this->session->setFlash('success', 'Source saved.');
} catch (Throwable $e) {
$this->session->setFlash('error', 'Error: ' . $e->getMessage());
}
$response->redirect('/admin/sources');
}
public function delete(Request $request, Response $response, int $id): void
{
$this->pdo->prepare("DELETE FROM sources WHERE id = ?")->execute([$id]);
$this->session->setFlash('success', 'Source deleted.');
$response->redirect('/admin/sources');
}
public function run(Request $request, Response $response, int $id): void
{
$stmt = $this->pdo->prepare("SELECT * FROM sources WHERE id = ?");
$stmt->execute([$id]);
$source = $stmt->fetch();
if (!$source) { $this->session->setFlash('error', 'Source not found.'); $response->redirect('/admin/sources'); return; }
try {
$result = $this->collector->collectSource($source);
$this->session->setFlash('success', "Collected {$result['entries_found']} entries, {$result['opportunities']} new opportunities.");
} catch (Throwable $e) {
$this->session->setFlash('error', 'Collection error: ' . $e->getMessage());
}
$response->redirect('/admin/sources');
}
}