false, 'error' => 'usa POST'], 405); } $req = json_decode((string) file_get_contents('php://input'), true); $code = is_array($req) ? (string) ($req['pairing_code'] ?? '') : ''; $ops = is_array($req) && !empty($req['with_ops']); if ($code === '') hub_json(['ok' => false, 'error' => 'código em falta'], 400); // O emparelhamento automático guarda o estado e as chaves no system_settings, // portanto precisa mesmo de base de dados. Uma montra estática (ver a nota do // hub_bootstrap.php) inscreve-se à mão: chaves no .env do stack, linha na // tabela `apps` do hub. Diz-se isso, em vez de rebentar sobre um $pdo a null. if (!$pdo instanceof PDO) { hub_json(['ok' => false, 'error' => 'plataforma sem base de dados — inscreve-se à mão, com as chaves no .env'], 400); } $res = hub_pair_complete($pdo, $code, $ops); if (empty($res['ok'])) { // 403 e não 404: o pedido chegou ao sítio certo, o que falha é a permissão. hub_json(['ok' => false, 'error' => $res['error']], 403); } hub_json([ 'ok' => true, 'app' => hub_app_name(), 'api_key' => $res['api_key'], 'ops_key' => $res['ops_key'], // null quando o hub não pediu operações 'health' => hub_base_url('api/health.php'), 'ops' => hub_base_url('api/hub_ops.php'), ]);