You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.8 KiB
116 lines
3.8 KiB
import pg from "pg";
|
|
|
|
export async function getClient() {
|
|
const client = new pg.Client({
|
|
user: process.env.DB_USER,
|
|
password: process.env.DB_PASSWORD,
|
|
host: process.env.DB_HOST,
|
|
database: process.env.DB_NAME,
|
|
port: 5432
|
|
})
|
|
|
|
await client.connect();
|
|
return client;
|
|
}
|
|
|
|
export async function initDb() {
|
|
|
|
const client = await getClient();
|
|
|
|
try {
|
|
let query = `CREATE TABLE IF NOT EXISTS users (
|
|
id SERIAL PRIMARY KEY,
|
|
email VARCHAR(255) NOT NULL,
|
|
username VARCHAR(255) NOT NULL,
|
|
password VARCHAR(255) NOT NULL,
|
|
picture VARCHAR(255)
|
|
);`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS channels (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT NOT NULL,
|
|
owner INTEGER NOT NULL REFERENCES users(id)
|
|
)`
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS videos (
|
|
id SERIAL PRIMARY KEY,
|
|
title VARCHAR(255) NOT NULL,
|
|
thumbnail VARCHAR(255) NOT NULL,
|
|
description TEXT NOT NULL,
|
|
channel INTEGER NOT NULL REFERENCES channels(id),
|
|
visibility VARCHAR(50) NOT NULL DEFAULT 'public',
|
|
file VARCHAR(255) NOT NULL,
|
|
slug VARCHAR(255) NOT NULL,
|
|
format VARCHAR(50) NOT NULL,
|
|
release_date TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS comments
|
|
(
|
|
id SERIAL PRIMARY KEY,
|
|
content TEXT NOT NULL,
|
|
author INTEGER NOT NULL REFERENCES users(id),
|
|
video INTEGER NOT NULL REFERENCES videos(id),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
)`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS likes (
|
|
id SERIAL PRIMARY KEY,
|
|
owner INTEGER NOT NULL REFERENCES users(id),
|
|
video INTEGER NOT NULL REFERENCES videos(id),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS playlists (
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
owner INTEGER NOT NULL REFERENCES users(id)
|
|
)`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS playlist_elements (
|
|
id SERIAL PRIMARY KEY,
|
|
video INTEGER NOT NULL REFERENCES videos(id),
|
|
playlist INTEGER NOT NULL REFERENCES playlists(id)
|
|
)`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS subscriptions (
|
|
id SERIAL PRIMARY KEY,
|
|
channel INTEGER NOT NULL REFERENCES channels(id),
|
|
owner INTEGER NOT NULL REFERENCES users(id)
|
|
)`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS tags(
|
|
id SERIAL PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
usage_count INTEGER NOT NULL DEFAULT 0
|
|
)`;
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS video_tags (
|
|
video INTEGER NOT NULL REFERENCES videos(id),
|
|
tag INTEGER NOT NULL REFERENCES tags(id)
|
|
)`
|
|
await client.query(query);
|
|
|
|
query = `CREATE TABLE IF NOT EXISTS history (
|
|
id SERIAL PRIMARY KEY,
|
|
user_id INTEGER NOT NULL REFERENCES users(id),
|
|
video INTEGER NOT NULL REFERENCES videos(id),
|
|
viewed_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
)`;
|
|
await client.query(query);
|
|
|
|
} catch (e) {
|
|
console.error("Error initializing database:", e);
|
|
}
|
|
|
|
}
|