51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
// reset-db.ts
|
|
// Development command to wipe the database and apply all migrations from scratch
|
|
|
|
import { migrate, pool, connectionConfig } from "../database";
|
|
|
|
async function main(): Promise<void> {
|
|
const args = process.argv.slice(2);
|
|
|
|
// Require explicit confirmation unless --force is passed
|
|
if (!args.includes("--force")) {
|
|
console.error("This will DROP ALL TABLES in the database!");
|
|
console.error(` Database: ${connectionConfig.database}`);
|
|
console.error(` Host: ${connectionConfig.host}:${connectionConfig.port}`);
|
|
console.error("");
|
|
console.error("Run with --force to proceed.");
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
console.log("Dropping all tables...");
|
|
|
|
// Get all table names in the public schema
|
|
const result = await pool.query<{ tablename: string }>(`
|
|
SELECT tablename FROM pg_tables
|
|
WHERE schemaname = 'public'
|
|
`);
|
|
|
|
if (result.rows.length > 0) {
|
|
// Drop all tables with CASCADE to handle foreign key constraints
|
|
const tableNames = result.rows.map((r) => `"${r.tablename}"`).join(", ");
|
|
await pool.query(`DROP TABLE IF EXISTS ${tableNames} CASCADE`);
|
|
console.log(`Dropped ${result.rows.length} table(s)`);
|
|
} else {
|
|
console.log("No tables to drop");
|
|
}
|
|
|
|
console.log("");
|
|
await migrate();
|
|
|
|
console.log("");
|
|
console.log("Database reset complete.");
|
|
} finally {
|
|
await pool.end();
|
|
}
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error("Failed to reset database:", err.message);
|
|
process.exit(1);
|
|
});
|