From 9864a09fc18492c7d06a29d18c5004605e4fb750 Mon Sep 17 00:00:00 2001 From: Jean-Luc Makiola Date: Mon, 13 Apr 2026 14:20:03 +0200 Subject: [PATCH] chore: shell script for nuke-and-reseed (runs inside container) Co-Authored-By: Claude Opus 4.6 (1M context) --- scripts/nuke-and-reseed.sh | 38 +++++++++++++++++++++++++++ scripts/nuke-dev-user.ts | 54 -------------------------------------- 2 files changed, 38 insertions(+), 54 deletions(-) create mode 100755 scripts/nuke-and-reseed.sh delete mode 100644 scripts/nuke-dev-user.ts diff --git a/scripts/nuke-and-reseed.sh b/scripts/nuke-and-reseed.sh new file mode 100755 index 0000000..dd5fa59 --- /dev/null +++ b/scripts/nuke-and-reseed.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Nuke dev seed user and re-seed. Run inside the container: +# docker exec -it bash scripts/nuke-and-reseed.sh +# Delete after use. + +set -e + +echo "Deleting dev seed user..." +bun -e " +import { eq } from 'drizzle-orm'; +import { db } from './src/db/index.ts'; +import { apiKeys, categories, items, sessions, settings, setupItems, setups, threadCandidates, threads, users } from './src/db/schema.ts'; + +const [user] = await db.select().from(users).where(eq(users.logtoSub, 'dev-user-seed')).limit(1); +if (!user) { console.log('No dev user found'); process.exit(0); } +const uid = user.id; + +const userSetups = await db.select().from(setups).where(eq(setups.userId, uid)); +for (const s of userSetups) await db.delete(setupItems).where(eq(setupItems.setupId, s.id)); +await db.delete(setups).where(eq(setups.userId, uid)); + +const userThreads = await db.select().from(threads).where(eq(threads.userId, uid)); +for (const t of userThreads) await db.delete(threadCandidates).where(eq(threadCandidates.threadId, t.id)); +await db.delete(threads).where(eq(threads.userId, uid)); + +await db.delete(items).where(eq(items.userId, uid)); +await db.delete(settings).where(eq(settings.userId, uid)); +await db.delete(apiKeys).where(eq(apiKeys.userId, uid)); +await db.delete(sessions).where(eq(sessions.userId, uid)); +await db.delete(categories).where(eq(categories.userId, uid)); +await db.delete(users).where(eq(users.id, uid)); +console.log('Dev user deleted'); +" + +echo "Re-seeding..." +bun run db:seed:dev + +echo "Done!" diff --git a/scripts/nuke-dev-user.ts b/scripts/nuke-dev-user.ts deleted file mode 100644 index 3662890..0000000 --- a/scripts/nuke-dev-user.ts +++ /dev/null @@ -1,54 +0,0 @@ -// Temporary script to delete dev seed user and all related data. -// Usage: bun run scripts/nuke-dev-user.ts && bun run db:seed:dev -// Delete this file after use. - -import { eq } from "drizzle-orm"; -import { db } from "../src/db/index.ts"; -import { - apiKeys, - categories, - items, - sessions, - settings, - setupItems, - setups, - threadCandidates, - threads, - users, -} from "../src/db/schema.ts"; - -const [user] = await db - .select() - .from(users) - .where(eq(users.logtoSub, "dev-user-seed")) - .limit(1); - -if (!user) { - console.log("No dev user found"); - process.exit(0); -} - -const uid = user.id; - -// Delete in FK order -const userSetups = await db.select().from(setups).where(eq(setups.userId, uid)); -for (const s of userSetups) - await db.delete(setupItems).where(eq(setupItems.setupId, s.id)); -await db.delete(setups).where(eq(setups.userId, uid)); - -const userThreads = await db - .select() - .from(threads) - .where(eq(threads.userId, uid)); -for (const t of userThreads) - await db.delete(threadCandidates).where(eq(threadCandidates.threadId, t.id)); -await db.delete(threads).where(eq(threads.userId, uid)); - -await db.delete(items).where(eq(items.userId, uid)); -await db.delete(settings).where(eq(settings.userId, uid)); -await db.delete(apiKeys).where(eq(apiKeys.userId, uid)); -await db.delete(sessions).where(eq(sessions.userId, uid)); -await db.delete(categories).where(eq(categories.userId, uid)); -await db.delete(users).where(eq(users.id, uid)); - -console.log("Dev user and all related data deleted");