Add complete ScoutIQ system: Crawler (RSS+AI), CRUD Controllers (Organizations, Contacts, Opportunities, Sources), dynamic Views, API routes, CLI collector
This commit is contained in:
93
app/Controllers/Admin/SourcesController.php
Normal file
93
app/Controllers/Admin/SourcesController.php
Normal 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');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user