Files
SkyArtShop/backend/config/database.js
Local Server e4b3de4a46 Updatweb
2025-12-19 20:44:46 -06:00

70 lines
1.8 KiB
JavaScript

const { Pool } = require("pg");
const logger = require("./logger");
require("dotenv").config();
const pool = new Pool({
host: process.env.DB_HOST || "localhost",
port: process.env.DB_PORT || 5432,
database: process.env.DB_NAME || "skyartshop",
user: process.env.DB_USER || "skyartapp",
password: process.env.DB_PASSWORD,
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
pool.on("connect", () => logger.info("✓ PostgreSQL connected"));
pool.on("error", (err) => logger.error("PostgreSQL error:", err));
const query = async (text, params) => {
const start = Date.now();
try {
const res = await pool.query(text, params);
const duration = Date.now() - start;
logger.debug("Executed query", { duration, rows: res.rowCount });
return res;
} catch (error) {
logger.error("Query error:", { text, error: error.message });
throw error;
}
};
// Transaction helper
const transaction = async (callback) => {
const client = await pool.connect();
try {
await client.query("BEGIN");
const result = await callback(client);
await client.query("COMMIT");
return result;
} catch (error) {
await client.query("ROLLBACK");
logger.error("Transaction rolled back:", error);
throw error;
} finally {
client.release();
}
};
// Health check
const healthCheck = async () => {
try {
const result = await query(
"SELECT NOW() as time, current_database() as database"
);
return {
healthy: true,
database: result.rows[0].database,
timestamp: result.rows[0].time,
};
} catch (error) {
logger.error("Database health check failed:", error);
return {
healthy: false,
error: error.message,
};
}
};
module.exports = { pool, query, transaction, healthCheck };