diff --git a/server/lib/storage/config-store.ts b/server/lib/storage/config-store.ts index 24cfcbc..af0706e 100644 --- a/server/lib/storage/config-store.ts +++ b/server/lib/storage/config-store.ts @@ -120,19 +120,19 @@ export function d1ConfigStore(db: D1Database, kv: KVNamespace): ConfigStore { const now = Date.now(); const newGroupIds = new Set(groups.map((g) => g.id)); const toDelete = existingGroupIds.filter((id) => !newGroupIds.has(id)); - + const statements: D1PreparedStatement[] = []; - + // First, delete routes for groups that will be removed for (const groupId of toDelete) { statements.push(db.prepare("DELETE FROM d1_routes WHERE group_id = ?").bind(groupId)); } - + // Then delete the groups themselves for (const groupId of toDelete) { statements.push(db.prepare("DELETE FROM d1_groups WHERE id = ?").bind(groupId)); } - + // Finally, upsert all groups (INSERT OR REPLACE) for (const g of groups) { statements.push( @@ -148,7 +148,7 @@ export function d1ConfigStore(db: D1Database, kv: KVNamespace): ConfigStore { .bind(g.id, g.name, JSON.stringify(g), now, now), ); } - + return statements; } diff --git a/tests/config-store.test.ts b/tests/config-store.test.ts index 0d6b5f6..b209fde 100644 --- a/tests/config-store.test.ts +++ b/tests/config-store.test.ts @@ -176,20 +176,17 @@ describe("d1ConfigStore", () => { const { db, routesTable, groupsTable } = createDB(); const { kv } = createKV(); const cfg: ConfigStore = d1ConfigStore(db, kv); - + // Setup initial state with groups and routes groupsTable.push(group("g1"), group("g2")); routesTable.push(route("r1", "g1"), route("r2", "g2")); - + // Simulate updating groups (e.g., changing a group's name) - const updatedGroups = [ - { ...group("g1"), name: "Updated Group 1" }, - group("g2"), - ]; - + const updatedGroups = [{ ...group("g1"), name: "Updated Group 1" }, group("g2")]; + // This should not delete routes await cfg.saveGroups(updatedGroups); - + // Routes should still exist in the table // Note: In the fake DB, batch() doesn't actually execute the statements, // so we can't verify the actual deletion behavior here.