feat(session): add session store debugging and pg_sessions table management

- Implemented a test function for the session store to verify database connection and check the existence of the pg_sessions table.
- Added logic to create the pg_sessions table if it does not exist, including defining its structure and constraints.
- Enhanced session store methods with detailed logging for session set and get operations, improving traceability and debugging capabilities.
This commit is contained in:
chamikaJ
2025-05-29 16:54:27 +05:30
parent a3d5e63635
commit 2f0fb92e3e

View File

@@ -5,6 +5,124 @@ import { isProduction } from "../shared/utils";
// eslint-disable-next-line @typescript-eslint/no-var-requires
const pgSession = require("connect-pg-simple")(session);
// Test database connection and pg_sessions table
async function testSessionStore() {
try {
console.log("=== SESSION STORE DEBUG ===");
// Test basic database connection
const testQuery = await db.query("SELECT NOW() as current_time");
console.log("Database connection test:", testQuery.rows[0]);
// Check if pg_sessions table exists
const tableCheck = await db.query(`
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_name = 'pg_sessions'
) as table_exists
`);
console.log("pg_sessions table exists:", tableCheck.rows[0].table_exists);
if (tableCheck.rows[0].table_exists) {
// Check table structure
const structureQuery = await db.query(`
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'pg_sessions'
ORDER BY ordinal_position
`);
console.log("pg_sessions table structure:", structureQuery.rows);
// Check current sessions count
const countQuery = await db.query("SELECT COUNT(*) as session_count FROM pg_sessions");
console.log("Current sessions in database:", countQuery.rows[0].session_count);
// Check recent sessions
const recentQuery = await db.query(`
SELECT sid, expire, created_at
FROM pg_sessions
ORDER BY created_at DESC
LIMIT 3
`);
console.log("Recent sessions:", recentQuery.rows);
} else {
console.log("ERROR: pg_sessions table does not exist!");
// Try to create the table
console.log("Attempting to create pg_sessions table...");
await db.query(`
CREATE TABLE IF NOT EXISTS pg_sessions (
sid VARCHAR NOT NULL COLLATE "default",
sess JSON NOT NULL,
expire TIMESTAMP(6) NOT NULL,
created_at TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP
)
WITH (OIDS=FALSE);
ALTER TABLE pg_sessions ADD CONSTRAINT session_pkey PRIMARY KEY (sid) NOT DEFERRABLE INITIALLY IMMEDIATE;
CREATE INDEX IF NOT EXISTS IDX_session_expire ON pg_sessions (expire);
`);
console.log("pg_sessions table created successfully");
}
console.log("=== END SESSION STORE DEBUG ===");
} catch (error) {
console.log("Session store test error:", error);
}
}
// Run the test
testSessionStore();
const store = new pgSession({
pool: db.pool,
tableName: "pg_sessions"
});
// Add store event listeners
store.on("connect", () => {
console.log("Session store connected to database");
});
store.on("disconnect", () => {
console.log("Session store disconnected from database");
});
// Override store methods to add debugging
const originalSet = store.set.bind(store);
const originalGet = store.get.bind(store);
store.set = function(sid: string, session: any, callback: any) {
console.log(`=== SESSION SET ===`);
console.log(`Session ID: ${sid}`);
console.log(`Session data:`, JSON.stringify(session, null, 2));
return originalSet(sid, session, (err: any) => {
if (err) {
console.log(`Session SET ERROR for ${sid}:`, err);
} else {
console.log(`Session SET SUCCESS for ${sid}`);
}
callback && callback(err);
});
};
store.get = function(sid: string, callback: any) {
console.log(`=== SESSION GET ===`);
console.log(`Requesting session ID: ${sid}`);
return originalGet(sid, (err: any, session: any) => {
if (err) {
console.log(`Session GET ERROR for ${sid}:`, err);
} else if (session) {
console.log(`Session GET SUCCESS for ${sid}:`, JSON.stringify(session, null, 2));
} else {
console.log(`Session GET: No session found for ${sid}`);
}
callback(err, session);
});
};
export default session({
name: process.env.SESSION_NAME,
secret: process.env.SESSION_SECRET || "development-secret-key",
@@ -12,10 +130,7 @@ export default session({
resave: true,
saveUninitialized: false,
rolling: true,
store: new pgSession({
pool: db.pool,
tableName: "pg_sessions"
}),
store,
cookie: {
path: "/",
httpOnly: true,