From 02387f28c63d604854f19c25f6977146ee78f042 Mon Sep 17 00:00:00 2001 From: Tiago Yamamoto Date: Thu, 8 Jan 2026 15:43:32 -0300 Subject: [PATCH] Update Cloudflare credential handling --- README.md | 2 ++ .../check-cloudflare-status/src/index.js | 3 +- dashboard/src/pages/Cloudflare.tsx | 33 ++++++++++++++++--- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 822c91d..35776be 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,8 @@ Funções disponíveis: - `hello-world`: Função exemplo - `sync-github`: Sincroniza dados de repositórios GitHub - `check-cloudflare-status`: Verifica status de contas Cloudflare + - Gere um **API Token** no Cloudflare com permissões **Zone:Read** e **Workers:Read**. + - Salve o token no Appwrite na coleção `cloud_accounts` com `provider=cloudflare`, `apiKey` e, opcionalmente, `cloudflareAccountId` (usado para listar Workers). ## 🏃 Executando o Projeto diff --git a/appwrite-functions/check-cloudflare-status/src/index.js b/appwrite-functions/check-cloudflare-status/src/index.js index fbadf91..d6a89d3 100644 --- a/appwrite-functions/check-cloudflare-status/src/index.js +++ b/appwrite-functions/check-cloudflare-status/src/index.js @@ -59,7 +59,6 @@ export default async function ({ req, res, log, error }) { const payload = req.body ? JSON.parse(req.body) : {}; const accountId = payload.accountId; - const cloudflareAccountId = payload.cloudflareAccountId; const requesterId = (req.headers && (req.headers['x-appwrite-user-id'] || req.headers['x-appwrite-userid'])) || process.env.APPWRITE_FUNCTION_USER_ID || @@ -90,6 +89,8 @@ export default async function ({ req, res, log, error }) { return res.json({ error: 'Cloudflare token is missing for this account.' }, 400); } + const cloudflareAccountId = payload.cloudflareAccountId || account.cloudflareAccountId; + const [zones, workers] = await Promise.all([ fetchZones(token, log), fetchWorkers(token, cloudflareAccountId, log) diff --git a/dashboard/src/pages/Cloudflare.tsx b/dashboard/src/pages/Cloudflare.tsx index ff86a44..8ff3dab 100644 --- a/dashboard/src/pages/Cloudflare.tsx +++ b/dashboard/src/pages/Cloudflare.tsx @@ -27,9 +27,10 @@ type Worker = { export default function Cloudflare() { const [label, setLabel] = useState('') const [apiKey, setApiKey] = useState('') + const [credentialAccountId, setCredentialAccountId] = useState('') const [accountId, setAccountId] = useState('') const [cloudflareAccountId, setCloudflareAccountId] = useState('') - const [credentials, setCredentials] = useState<{ $id: string; label: string }[]>([]) + const [credentials, setCredentials] = useState<{ $id: string; label: string; cloudflareAccountId?: string }[]>([]) const [zones, setZones] = useState([]) const [workers, setWorkers] = useState([]) const [execution, setExecution] = useState(null) @@ -45,7 +46,11 @@ export default function Cloudflare() { const response = await databases.listDocuments(appwriteDatabaseId, appwriteCollectionCloudflareAccountsId, [ Query.equal('provider', 'cloudflare'), ]) - const docs = response.documents.map((doc) => ({ $id: doc.$id, label: (doc as { label?: string }).label || doc.$id })) + const docs = response.documents.map((doc) => ({ + $id: doc.$id, + label: (doc as { label?: string }).label || doc.$id, + cloudflareAccountId: (doc as { cloudflareAccountId?: string }).cloudflareAccountId, + })) setCredentials(docs) } catch (err) { console.error(err) @@ -86,10 +91,15 @@ export default function Cloudflare() { provider: 'cloudflare', apiKey, label, + cloudflareAccountId: credentialAccountId || undefined, }) - setCredentials((prev) => [...prev, { $id: document.$id, label: label || document.$id }]) + setCredentials((prev) => [ + ...prev, + { $id: document.$id, label: label || document.$id, cloudflareAccountId: credentialAccountId || undefined }, + ]) setLabel('') setApiKey('') + setCredentialAccountId('') } catch (err) { console.error(err) setError('Não foi possível salvar a API Key.') @@ -167,6 +177,16 @@ export default function Cloudflare() { className="mt-1 w-full rounded-lg border border-slate-800 bg-slate-950 px-3 py-2 text-sm text-slate-100 outline-none focus:border-cyan-400" /> +
+ + setCredentialAccountId(e.target.value)} + placeholder="Conta para listar Workers" + className="mt-1 w-full rounded-lg border border-slate-800 bg-slate-950 px-3 py-2 text-sm text-slate-100 outline-none focus:border-cyan-400" + /> +