From 7f98dfcdb1817a3834c5770cd34053c3c73d19b6 Mon Sep 17 00:00:00 2001 From: Jeff Emmett Date: Sat, 4 Apr 2026 04:05:51 +0000 Subject: [PATCH] fix: load persisted docs before module onInit to prevent re-seeding MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Module onInit functions (rvote, rtasks, rcal, etc.) call seedDemoIfEmpty which checks the sync server for existing docs. Previously onInit ran as an IIFE before loadAllDocs completed, so it always found empty docs and re-seeded demo data — overwriting user deletions/changes. Now onInit runs inside the loadAllDocs .then() chain, ensuring persisted data is loaded before any seed checks run. Co-Authored-By: Claude Opus 4.6 (1M context) --- server/index.ts | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/server/index.ts b/server/index.ts index 32deafa..c5b53e3 100644 --- a/server/index.ts +++ b/server/index.ts @@ -3992,33 +3992,35 @@ const server = Bun.serve({ // ── Startup ── -// Call onInit for each module that defines it (schema registration, DB init, etc.) -(async () => { - for (const mod of getAllModules()) { - if (mod.onInit) { - try { - await mod.onInit({ syncServer }); - console.log(`[Init] ${mod.name} initialized`); - } catch (e) { - console.error(`[Init] ${mod.name} failed:`, e); - } - } - } - // Pass syncServer to OAuth handlers - setNotionOAuthSyncServer(syncServer); - setGoogleOAuthSyncServer(syncServer); - setClickUpOAuthSyncServer(syncServer); - setOAuthStatusSyncServer(syncServer); -})(); - // Ensure generated files directory exists import { mkdirSync } from "node:fs"; try { mkdirSync(resolve(process.env.FILES_DIR || "./data/files", "generated"), { recursive: true }); } catch {} -ensureDemoCommunity().then(() => console.log("[Demo] Demo community ready")).catch((e) => console.error("[Demo] Failed:", e)); import { initTokenService, seedCUSDC } from "./token-service"; + +// IMPORTANT: Load persisted docs FIRST, then run module onInit + seeding. +// Previously onInit ran before loadAllDocs, causing seed functions to see +// empty docs and re-create demo data that users had already deleted. +ensureDemoCommunity().then(() => console.log("[Demo] Demo community ready")).catch((e) => console.error("[Demo] Failed:", e)); loadAllDocs(syncServer) .then(async () => { + // Now that persisted docs are loaded, init modules (which may seed) + for (const mod of getAllModules()) { + if (mod.onInit) { + try { + await mod.onInit({ syncServer }); + console.log(`[Init] ${mod.name} initialized`); + } catch (e) { + console.error(`[Init] ${mod.name} failed:`, e); + } + } + } + // Pass syncServer to OAuth handlers + setNotionOAuthSyncServer(syncServer); + setGoogleOAuthSyncServer(syncServer); + setClickUpOAuthSyncServer(syncServer); + setOAuthStatusSyncServer(syncServer); + // Seed all modules' demo data so /demo routes always have content for (const mod of getAllModules()) { if (mod.seedTemplate) {