|
10 | 10 | * deno run --allow-net --allow-read --allow-env scripts/sync-changelog.ts |
11 | 11 | * |
12 | 12 | * Env: |
13 | | - * SUPABASE_URL — Supabase project URL |
14 | | - * SUPABASE_SERVICE_KEY — Service role key (for write access) |
15 | | - * GITHUB_TOKEN — (optional) GitHub PAT for higher rate limits |
16 | | - * VLLM_URL — vLLM endpoint for LLM rewrite (optional) |
17 | | - * VLLM_API_KEY — API key for vLLM |
| 13 | + * SUPABASE_URL — Supabase project URL |
| 14 | + * CHANGELOG_WRITE_KEY — Write key for sync-changelog Edge Function |
| 15 | + * SUPABASE_SERVICE_KEY — (fallback) Service role key for direct PostgREST |
| 16 | + * GITHUB_TOKEN — (optional) GitHub PAT for higher rate limits |
| 17 | + * VLLM_URL — vLLM endpoint for LLM rewrite (optional) |
| 18 | + * VLLM_API_KEY — API key for vLLM |
18 | 19 | */ |
19 | 20 |
|
20 | 21 | const SUPABASE_URL = Deno.env.get("SUPABASE_URL") || "https://gulptwduchsjcsbndmua.supabase.co"; |
| 22 | +const CHANGELOG_WRITE_KEY = Deno.env.get("CHANGELOG_WRITE_KEY") || ""; |
21 | 23 | const SUPABASE_KEY = Deno.env.get("SUPABASE_SERVICE_KEY") || Deno.env.get("SUPABASE_SERVICE_ROLE_KEY") || ""; |
22 | 24 | const GITHUB_TOKEN = Deno.env.get("GITHUB_TOKEN") || ""; |
23 | 25 | const VLLM_URL = Deno.env.get("VLLM_URL") || "https://inference.dos.ai"; |
@@ -228,11 +230,45 @@ async function rewriteEntries(entries: ChangelogEntry[]): Promise<ChangelogEntry |
228 | 230 | // --- 4. Upsert to Supabase --- |
229 | 231 |
|
230 | 232 | async function upsertEntries(entries: ChangelogEntry[]): Promise<number> { |
231 | | - if (!SUPABASE_KEY) { |
232 | | - console.error("SUPABASE_SERVICE_KEY not set, skipping DB sync"); |
| 233 | + // Prefer Edge Function (only needs write key, no service role exposure) |
| 234 | + if (CHANGELOG_WRITE_KEY) { |
| 235 | + return upsertViaEdgeFunction(entries); |
| 236 | + } |
| 237 | + // Fallback: direct PostgREST (local dev with service key) |
| 238 | + if (SUPABASE_KEY) { |
| 239 | + return upsertViaPostgREST(entries); |
| 240 | + } |
| 241 | + console.error("Neither CHANGELOG_WRITE_KEY nor SUPABASE_SERVICE_KEY set, skipping DB sync"); |
| 242 | + return 0; |
| 243 | +} |
| 244 | + |
| 245 | +async function upsertViaEdgeFunction(entries: ChangelogEntry[]): Promise<number> { |
| 246 | + const res = await fetch( |
| 247 | + `${SUPABASE_URL}/functions/v1/sync-changelog`, |
| 248 | + { |
| 249 | + method: "POST", |
| 250 | + headers: { |
| 251 | + "Content-Type": "application/json", |
| 252 | + "x-write-key": CHANGELOG_WRITE_KEY, |
| 253 | + }, |
| 254 | + body: JSON.stringify({ entries }), |
| 255 | + } |
| 256 | + ); |
| 257 | + |
| 258 | + if (!res.ok) { |
| 259 | + const err = await res.text(); |
| 260 | + console.error(`Edge Function error: ${res.status} ${err}`); |
233 | 261 | return 0; |
234 | 262 | } |
235 | 263 |
|
| 264 | + const result = await res.json(); |
| 265 | + if (result.errors?.length) { |
| 266 | + console.warn(` Edge Function partial errors:`, result.errors); |
| 267 | + } |
| 268 | + return result.upserted || 0; |
| 269 | +} |
| 270 | + |
| 271 | +async function upsertViaPostgREST(entries: ChangelogEntry[]): Promise<number> { |
236 | 272 | let total = 0; |
237 | 273 | for (let i = 0; i < entries.length; i += 50) { |
238 | 274 | const batch = entries.slice(i, i + 50); |
|
0 commit comments