integratedhub/verify-schema.ts
2026-02-14 02:20:19 +00:00

120 lines
3.1 KiB
TypeScript

import { loadSync } from "$std/dotenv/mod.ts";
loadSync({ allowEmptyValues: true, export: true });
import { Pool } from "pg";
const pool = new Pool({
connectionString: Deno.env.get("POSTGRES_OPTIONS")?.replace(
"postgresql://",
"postgres://",
),
});
async function verifySchema() {
const client = await pool.connect();
try {
console.log("Testing database connection...");
// Test connection with a simple query
const result = await client.query(`
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
ORDER BY table_name
`);
console.log("✅ Database connection established");
// Expected tables
const expectedTables = [
"users",
"roles",
"user_roles",
"state_keys",
"user_tokens",
"web_tokens",
"obligations",
"incomes",
"financial_balances",
"properties",
"rent_schedules",
"leases",
"payment_methods",
"property_media",
"lease_documents",
"tenant_applications",
"tenant_invites",
"payment_transactions",
"reminders",
"messages",
"maintenance_requests",
"user_pins",
"session_configs",
];
const existingTables = result.rows.map((row) => String(row["table_name"]));
console.log("\n📋 Existing tables:", existingTables);
console.log("📋 Total tables:", existingTables.length);
const missingTables = expectedTables.filter(
(table) => !existingTables.includes(table),
);
if (missingTables.length > 0) {
console.error("\n❌ Missing tables:", missingTables);
Deno.exit(1);
} else {
console.log("\n✅ All expected tables exist in database!");
}
// Verify key columns on critical tables
console.log("\n🔍 Verifying key columns...");
const usersColumns = await client.query(`
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'users' AND table_schema = 'public'
ORDER BY column_name
`);
console.log(
"✅ users table columns:",
usersColumns.rows.map((r) => r["column_name"]),
);
const propertiesColumns = await client.query(`
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'properties' AND table_schema = 'public'
ORDER BY column_name
`);
console.log(
"✅ properties table columns:",
propertiesColumns.rows.map((r) => r["column_name"]),
);
const leasesColumns = await client.query(`
SELECT column_name
FROM information_schema.columns
WHERE table_name = 'leases' AND table_schema = 'public'
ORDER BY column_name
`);
console.log(
"✅ leases table columns:",
leasesColumns.rows.map((r) => r["column_name"]),
);
console.log("\n✅ Database schema verification complete!");
client.release();
await pool.end();
Deno.exit(0);
} catch (error) {
console.error("❌ Database schema verification failed:", error);
client.release();
await pool.end();
Deno.exit(1);
}
}
verifySchema();