94 lines
3.4 KiB
PHP
94 lines
3.4 KiB
PHP
<?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): void
|
|
{
|
|
$id = (int)$request->routeParam('id');
|
|
$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');
|
|
}
|
|
} |