| 
<?phpnamespace 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()]);
 }
 }
 }
 |