114 lines
2.6 KiB
JavaScript
114 lines
2.6 KiB
JavaScript
require('dotenv').config();
|
|
const { Pool } = require('pg');
|
|
|
|
const pool = new Pool
|
|
({
|
|
user: process.env.POSTGRES_USER,
|
|
host: process.env.POSTGRES_HOST,
|
|
database: process.env.POSTGRES_DB,
|
|
password: process.env.POSTGRES_PASSWORD,
|
|
port: 5432,
|
|
});
|
|
|
|
async function waitForDb(retries = 10, delay = 2000)
|
|
{
|
|
for (let i = 0; i < retries; i++)
|
|
{
|
|
try
|
|
{
|
|
await pool.query('SELECT 1');
|
|
console.log('Database is ready!');
|
|
return ;
|
|
}
|
|
catch (err)
|
|
{
|
|
await new Promise(r => setTimeout(r, delay));
|
|
}
|
|
}
|
|
throw new Error('Could not connect to database after multiple attempts');
|
|
}
|
|
|
|
async function createTables()
|
|
{
|
|
try
|
|
{
|
|
await pool.query(`
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id SERIAL PRIMARY KEY,
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
email VARCHAR(100),
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS messages(
|
|
id SERIAL PRIMARY KEY,
|
|
sender_id INT REFERENCES users(id),
|
|
received_id INT REFERENCES users(id),
|
|
content TEXT,
|
|
created_at TIMESTAMP DEFAULT NOW()
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS friendship (
|
|
id_user1 INT NOT NULL,
|
|
id_user2 INT NOT NULL,
|
|
status VARCHAR(20) NOT NULL,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
CHECK (id_user1 < id_user2),
|
|
PRIMARY KEY (id_user1, id_user2),
|
|
FOREIGN KEY (id_user1) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (id_user2) REFERENCES users(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS oauth_clients (
|
|
id SERIAL PRIMARY KEY,
|
|
provider VARCHAR(50) NOT NULL,
|
|
client_id VARCHAR(200) NOT NULL,
|
|
client_secret TEXT,
|
|
redirect_uri VARCHAR(255),
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
UNIQUE(provider, client_id)
|
|
);
|
|
`);
|
|
console.log('Tables created!');
|
|
}
|
|
catch (err)
|
|
{
|
|
console.error('Error creating tables:', err);
|
|
}
|
|
}
|
|
|
|
async function query(text, params)
|
|
{
|
|
return (pool.query(text, params));
|
|
}
|
|
|
|
async function ensureOauthClient(provider, client_id, client_secret, redirect_uri)
|
|
{
|
|
try
|
|
{
|
|
const res = await pool.query(
|
|
`SELECT id FROM oauth_clients WHERE provider = $1 AND client_id = $2`, [provider, client_id]
|
|
);
|
|
if (res.rows.length > 0)
|
|
return res.rows[0];
|
|
const insert = await pool.query(
|
|
`INSERT INTO oauth_clients (provider, client_id, client_secret, redirect_uri) VALUES ($1, $2, $3, $4) RETURNING id`,
|
|
[provider, client_id, client_secret, redirect_uri]
|
|
);
|
|
return insert.rows[0];
|
|
}
|
|
catch (err)
|
|
{
|
|
console.error('Error ensuring oauth client:', err);
|
|
throw err;
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
waitForDb,
|
|
createTables,
|
|
query,
|
|
ensureOauthClient
|
|
};
|