77 lines
2.4 KiB
TypeScript
77 lines
2.4 KiB
TypeScript
import { Pool } from "pg";
|
|||
|
|
|
||
|
|
const pool = new Pool({
|
||
|
|
connectionString: process.env.DATABASE_URL,
|
||
|
|
ssl:
|
||
|
|
process.env.NODE_ENV === "production"
|
||
|
|
? { rejectUnauthorized: false }
|
||
|
|
: false,
|
||
|
|
});
|
||
|
|
|
||
|
|
export async function query(text: string, params?: any[]) {
|
||
|
|
const result = await pool.query(text, params);
|
||
|
|
return result;
|
||
|
|
}
|
||
|
|
|
||
|
|
export async function initDatabase() {
|
||
|
|
await query(`
|
||
|
|
CREATE TABLE IF NOT EXISTS tasks (
|
||
|
|
id SERIAL PRIMARY KEY,
|
||
|
|
text TEXT NOT NULL,
|
||
|
|
description TEXT,
|
||
|
|
checklist JSONB DEFAULT '[]',
|
||
|
|
category VARCHAR(20) NOT NULL CHECK(category IN ('urgent', 'deadline', 'admin', 'creative')),
|
||
|
|
status VARCHAR(20) NOT NULL DEFAULT 'todo' CHECK(status IN ('todo', 'doing', 'done', 'archived')),
|
||
|
|
added VARCHAR(50) NOT NULL,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
|
|
)
|
||
|
|
`);
|
||
|
|
|
||
|
|
await query(`
|
||
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
||
|
|
id SERIAL PRIMARY KEY,
|
||
|
|
mode VARCHAR(20) NOT NULL CHECK(mode IN ('normal', 'crisis')),
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
exported_at TIMESTAMP
|
||
|
|
)
|
||
|
|
`);
|
||
|
|
|
||
|
|
await query(`
|
||
|
|
CREATE TABLE IF NOT EXISTS session_answers (
|
||
|
|
id SERIAL PRIMARY KEY,
|
||
|
|
session_id INTEGER NOT NULL REFERENCES sessions(id) ON DELETE CASCADE,
|
||
|
|
question_index INTEGER NOT NULL,
|
||
|
|
category TEXT NOT NULL,
|
||
|
|
question TEXT NOT NULL,
|
||
|
|
answer TEXT NOT NULL
|
||
|
|
)
|
||
|
|
`);
|
||
|
|
|
||
|
|
await query(`
|
||
|
|
CREATE TABLE IF NOT EXISTS questions (
|
||
|
|
id SERIAL PRIMARY KEY,
|
||
|
|
category TEXT NOT NULL,
|
||
|
|
question TEXT NOT NULL,
|
||
|
|
mode VARCHAR(20) NOT NULL CHECK(mode IN ('normal', 'crisis')),
|
||
|
|
order_index INTEGER NOT NULL DEFAULT 0,
|
||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||
|
|
)
|
||
|
|
`);
|
||
|
|
|
||
|
|
await query(
|
||
|
|
`CREATE INDEX IF NOT EXISTS idx_tasks_category ON tasks(category)`
|
||
|
|
);
|
||
|
|
await query(`CREATE INDEX IF NOT EXISTS idx_tasks_status ON tasks(status)`);
|
||
|
|
await query(
|
||
|
|
`CREATE INDEX IF NOT EXISTS idx_sessions_mode ON sessions(mode)`
|
||
|
|
);
|
||
|
|
await query(
|
||
|
|
`CREATE INDEX IF NOT EXISTS idx_session_answers_session_id ON session_answers(session_id)`
|
||
|
|
);
|
||
|
|
await query(
|
||
|
|
`CREATE INDEX IF NOT EXISTS idx_questions_mode ON questions(mode)`
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
export default { query, initDatabase };
|