Add fallback memory store handling for local development server testing

This commit is contained in:
Gunaseelan P
2026-09-09 19:52:25 +05:30
parent 489f7e20c2
commit db85068bca
+64 -36
View File
@@ -85,11 +85,23 @@ const DEFAULT_REGIONS = [
}, },
]; ];
// In-memory fallback store for local development when DB is unreachable
const memoryStore = {
users: {
user: { password: "user", role: "user" },
admin: { password: "admin", role: "admin" }
},
regions: DEFAULT_REGIONS,
stats: {},
settings: {}
};
let dbConnected = false;
// Initialize Database Tables // Initialize Database Tables
async function initDb() { async function initDb() {
let client; let client;
try { try {
console.log("Connecting to Neon PostgreSQL database..."); console.log("Connecting to PostgreSQL database...");
client = await pool.connect(); client = await pool.connect();
console.log("Initializing database tables..."); console.log("Initializing database tables...");
await client.query("BEGIN"); await client.query("BEGIN");
@@ -153,6 +165,7 @@ async function initDb() {
} }
await client.query("COMMIT"); await client.query("COMMIT");
dbConnected = true;
console.log("Database initialized successfully."); console.log("Database initialized successfully.");
} catch (err) { } catch (err) {
if (client) { if (client) {
@@ -162,7 +175,8 @@ async function initDb() {
console.error("Rollback failed:", rollbackErr); console.error("Rollback failed:", rollbackErr);
} }
} }
console.error("Error initializing database:", err); dbConnected = false;
console.warn("⚠️ Could not connect to PostgreSQL DB (running in local fallback mode):", err.message);
} finally { } finally {
if (client) client.release(); if (client) client.release();
} }
@@ -177,20 +191,29 @@ app.post('/api/auth/login', async (req, res) => {
return res.status(400).json({ error: "Username and password are required" }); return res.status(400).json({ error: "Username and password are required" });
} }
try { if (dbConnected) {
const result = await pool.query( try {
"SELECT role FROM app_users WHERE username = $1 AND password = $2", const result = await pool.query(
[username, password] "SELECT role FROM app_users WHERE username = $1 AND password = $2",
); [username, password]
);
if (result.rows.length > 0) { if (result.rows.length > 0) {
res.json({ success: true, role: result.rows[0].role }); return res.json({ success: true, role: result.rows[0].role });
} else { } else {
res.status(401).json({ error: "Invalid username or password" }); return res.status(401).json({ error: "Invalid username or password" });
}
} catch (err) {
console.error("DB Login error, using fallback:", err);
} }
} catch (err) { }
console.error(err);
res.status(500).json({ error: "Database error during authentication" }); // Fallback mode login check
const fallbackUser = memoryStore.users[username];
if (fallbackUser && fallbackUser.password === password) {
return res.json({ success: true, role: fallbackUser.role });
} else {
return res.status(401).json({ error: "Invalid username or password" });
} }
}); });
@@ -218,17 +241,19 @@ app.post('/api/auth/reset', async (req, res) => {
// Users Management APIs // Users Management APIs
app.get('/api/users', async (req, res) => { app.get('/api/users', async (req, res) => {
try { if (dbConnected) {
const result = await pool.query("SELECT username, role, password FROM app_users"); try {
const usersMap = {}; const result = await pool.query("SELECT username, role, password FROM app_users");
result.rows.forEach(row => { const usersMap = {};
usersMap[row.username] = { password: row.password, role: row.role }; result.rows.forEach(row => {
}); usersMap[row.username] = { password: row.password, role: row.role };
res.json(usersMap); });
} catch (err) { return res.json(usersMap);
console.error(err); } catch (err) {
res.status(500).json({ error: "Failed to fetch users" }); console.error(err);
}
} }
return res.json(memoryStore.users);
}); });
app.post('/api/users', async (req, res) => { app.post('/api/users', async (req, res) => {
@@ -237,20 +262,23 @@ app.post('/api/users', async (req, res) => {
return res.status(400).json({ error: "Missing fields" }); return res.status(400).json({ error: "Missing fields" });
} }
try { if (dbConnected) {
await pool.query( try {
"INSERT INTO app_users (username, password, role) VALUES ($1, $2, $3)", await pool.query(
[username, password, role] "INSERT INTO app_users (username, password, role) VALUES ($1, $2, $3)",
); [username, password, role]
res.json({ success: true }); );
} catch (err) { return res.json({ success: true });
console.error(err); } catch (err) {
if (err.code === '23505') { console.error(err);
res.status(400).json({ error: "Username already exists" }); if (err.code === '23505') {
} else { return res.status(400).json({ error: "Username already exists" });
res.status(500).json({ error: "Failed to create user" }); }
} }
} }
memoryStore.users[username] = { password, role };
return res.json({ success: true });
}); });
app.put('/api/users/:username', async (req, res) => { app.put('/api/users/:username', async (req, res) => {