fix: add sessions table to Drizzle schema + auto-create at startup
This commit is contained in:
@@ -18,6 +18,26 @@ if (Number.isNaN(port) || port <= 0) {
|
|||||||
throw new Error(`Invalid PORT value: "${rawPort}"`);
|
throw new Error(`Invalid PORT value: "${rawPort}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function ensureSessionsTable(): Promise<void> {
|
||||||
|
try {
|
||||||
|
const exists = await db.execute(
|
||||||
|
sql`SELECT EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'sessions')`,
|
||||||
|
);
|
||||||
|
const rows = exists.rows as [{ exists: boolean }];
|
||||||
|
if (rows[0]?.exists) return;
|
||||||
|
|
||||||
|
await db.execute(
|
||||||
|
sql`CREATE TABLE "sessions" ("sid" varchar NOT NULL, "sess" json NOT NULL, "expire" timestamp(6) NOT NULL)`,
|
||||||
|
);
|
||||||
|
await db.execute(
|
||||||
|
sql`ALTER TABLE "sessions" ADD PRIMARY KEY ("sid")`,
|
||||||
|
);
|
||||||
|
logger.info("Sessions table created");
|
||||||
|
} catch (err) {
|
||||||
|
logger.error({ err }, "Failed to ensure sessions table");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function seedAdminUser(): Promise<void> {
|
async function seedAdminUser(): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const [row] = await db.select({ count: sql<number>`count(*)::int` }).from(usersTable);
|
const [row] = await db.select({ count: sql<number>`count(*)::int` }).from(usersTable);
|
||||||
@@ -49,5 +69,6 @@ app.listen(port, (err) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
logger.info({ port }, "Server listening");
|
logger.info({ port }, "Server listening");
|
||||||
|
ensureSessionsTable();
|
||||||
seedAdminUser();
|
seedAdminUser();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,3 +2,4 @@ export * from "./tools";
|
|||||||
export * from "./ratings";
|
export * from "./ratings";
|
||||||
export * from "./users";
|
export * from "./users";
|
||||||
export * from "./audit-logs";
|
export * from "./audit-logs";
|
||||||
|
export * from "./sessions";
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
import { pgTable, text, json, timestamp } from "drizzle-orm/pg-core";
|
||||||
|
|
||||||
|
export const sessionsTable = pgTable("sessions", {
|
||||||
|
sid: text("sid").notNull().primaryKey(),
|
||||||
|
sess: json("sess").notNull(),
|
||||||
|
expire: timestamp("expire", { withTimezone: true, precision: 6 }).notNull(),
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user