···11+#!/usr/bin/env bun
22+33+import db from "../src/db/schema";
44+55+const email = process.argv[2];
66+77+if (!email) {
88+ console.error("Usage: bun scripts/remove-from-classes.ts <email>");
99+ console.error(" Removes a user from all their enrolled classes");
1010+ process.exit(1);
1111+}
1212+1313+const user = db
1414+ .query<{ id: number; email: string }, [string]>(
1515+ "SELECT id, email FROM users WHERE email = ?",
1616+ )
1717+ .get(email);
1818+1919+if (!user) {
2020+ console.error(`User with email ${email} not found`);
2121+ process.exit(1);
2222+}
2323+2424+// Get current enrollments
2525+const enrollments = db
2626+ .query<{ class_id: string }, [number]>(
2727+ "SELECT class_id FROM class_members WHERE user_id = ?",
2828+ )
2929+ .all(user.id);
3030+3131+if (enrollments.length === 0) {
3232+ console.log(`User ${email} is not enrolled in any classes`);
3333+ process.exit(0);
3434+}
3535+3636+// Remove from all classes
3737+db.run("DELETE FROM class_members WHERE user_id = ?", [user.id]);
3838+3939+console.log(`✅ Successfully removed ${email} from ${enrollments.length} class(es)`);
···225225 VALUES (0, 'ghosty@thistle.internal', NULL, 'Ghosty', '👻', 'user', strftime('%s', 'now'));
226226 `,
227227 },
228228+ {
229229+ version: 2,
230230+ name: "Add sections support to classes and class members",
231231+ sql: `
232232+ -- Add section_number to classes (nullable for existing classes)
233233+ ALTER TABLE classes ADD COLUMN section_number TEXT;
234234+235235+ -- Add section_id to class_members (nullable - NULL means default section)
236236+ ALTER TABLE class_members ADD COLUMN section_id TEXT;
237237+238238+ -- Create sections table to track all available sections for a class
239239+ CREATE TABLE IF NOT EXISTS class_sections (
240240+ id TEXT PRIMARY KEY,
241241+ class_id TEXT NOT NULL,
242242+ section_number TEXT NOT NULL,
243243+ created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
244244+ FOREIGN KEY (class_id) REFERENCES classes(id) ON DELETE CASCADE,
245245+ UNIQUE(class_id, section_number)
246246+ );
247247+248248+ CREATE INDEX IF NOT EXISTS idx_class_sections_class_id ON class_sections(class_id);
249249+250250+ -- Add section_id to transcriptions to track which section uploaded it
251251+ ALTER TABLE transcriptions ADD COLUMN section_id TEXT;
252252+253253+ CREATE INDEX IF NOT EXISTS idx_transcriptions_section_id ON transcriptions(section_id);
254254+ `,
255255+ },
228256];
229257230258function getCurrentVersion(): number {