<?php
namespace App;
class Router
{
private Database $db;
private SchemaInspector $inspector;
private ApiGenerator $api;
public Authenticator $auth;
public function __construct(Database $db, Authenticator $auth)
{
$pdo = $db->getPdo();
$this->db = $db;
$this->inspector = new SchemaInspector($pdo);
$this->api = new ApiGenerator($pdo);
$this->auth = $auth;
}
public function route(array $query)
{
header('Content-Type: application/json');
// JWT login endpoint (always accessible if method is JWT)
if (($query['action'] ?? '') === 'login' && ($this->auth->config['auth_method'] ?? '') === 'jwt') {
$post = $_POST;
$users = $this->auth->config['basic_users'] ?? [];
$user = $post['username'] ?? '';
$pass = $post['password'] ?? '';
if (isset($users[$user]) && $users[$user] === $pass) {
$token = $this->auth->createJwt(['sub' => $user]);
echo json_encode(['token' => $token]);
} else {
http_response_code(401);
echo json_encode(['error' => 'Invalid credentials']);
}
return;
}
// Require authentication for all others
$this->auth->requireAuth();
try {
switch ($query['action'] ?? '') {
case 'tables':
echo json_encode($this->inspector->getTables());
break;
case 'columns':
if (isset($query['table'])) {
echo json_encode($this->inspector->getColumns($query['table']));
} else {
http_response_code(400);
echo json_encode(['error' => 'Missing table parameter']);
}
break;
case 'list':
if (isset($query['table'])) {
echo json_encode($this->api->list($query['table']));
} else {
http_response_code(400);
echo json_encode(['error' => 'Missing table parameter']);
}
break;
case 'read':
if (isset($query['table'], $query['id'])) {
echo json_encode($this->api->read($query['table'], $query['id']));
} else {
http_response_code(400);
echo json_encode(['error' => 'Missing table or id parameter']);
}
break;
case 'create':
if (isset($query['table'])) {
$data = $_POST;
echo json_encode($this->api->create($query['table'], $data));
} else {
http_response_code(400);
echo json_encode(['error' => 'Missing table parameter']);
}
break;
case 'update':
if (isset($query['table'], $query['id'])) {
$data = $_POST;
echo json_encode($this->api->update($query['table'], $query['id'], $data));
} else {
http_response_code(400);
echo json_encode(['error' => 'Missing table or id parameter']);
}
break;
case 'delete':
if (isset($query['table'], $query['id'])) {
echo json_encode(['success' => $this->api->delete($query['table'], $query['id'])]);
} else {
http_response_code(400);
echo json_encode(['error' => 'Missing table or id parameter']);
}
break;
case 'openapi':
echo json_encode(OpenApiGenerator::generate(
$this->inspector->getTables(),
$this->inspector
));
break;
default:
http_response_code(400);
echo json_encode(['error' => 'Invalid action']);
}
} catch (\Throwable $e) {
http_response_code(500);
echo json_encode(['error' => $e->getMessage()]);
}
}
}
|