uphold/src/db.js
2025-11-27 14:41:21 +00:00

70 lines
1.8 KiB
JavaScript

import pg from "pg";
import { setTimeout } from "timers/promises";
const { Pool } = pg;
const pool = new Pool({
connectionString: process.env.DATABASE_URL,
});
const CREATE_TABLE_QUERY = `
CREATE TABLE IF NOT EXISTS alerts (
id SERIAL PRIMARY KEY,
pair VARCHAR(20) NOT NULL,
direction VARCHAR(4) NOT NULL,
previous_price NUMERIC NOT NULL,
new_price NUMERIC NOT NULL,
percent_change NUMERIC NOT NULL,
config_interval INTEGER NOT NULL,
config_threshold NUMERIC NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
`;
export async function initDB() {
const maxRetries = 10;
const retryDelay = 2000;
for (let i = 0; i < maxRetries; i++) {
try {
await pool.query(CREATE_TABLE_QUERY);
console.log("[DB] Database initialized and connected.");
return;
} catch (err) {
if (i === maxRetries - 1) {
console.error("[DB] Failed to connect after all retries:", err.message);
throw err;
}
console.log(
`[DB] Connection attempt ${i + 1} failed, retrying in ${retryDelay}ms...`,
);
await setTimeout(retryDelay);
}
}
}
export async function insertIntoDB(data) {
const query = `
INSERT INTO alerts (
pair, direction, previous_price, new_price, percent_change,
config_interval, config_threshold
) VALUES ($1, $2, $3, $4, $5, $6, $7)
`;
const values = [
data.pair,
data.direction,
data.previousPrice,
data.newPrice,
data.percentChange,
data.interval,
data.threshold,
];
try {
await pool.query(query, values);
console.log(`[DB] Event saved for ${data.pair}`);
} catch (err) {
console.error(`[DB] Failed to save alert: ${err.message}`);
}
}