import { pool } from './client.js' export async function ensureDatabaseSchema() { await pool.query(` CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, login_id VARCHAR(60) UNIQUE, password_hash VARCHAR(255) NOT NULL, nickname VARCHAR(60) NOT NULL, role VARCHAR(20) NOT NULL DEFAULT 'user', disabled_at TIMESTAMPTZ, email_verified_at TIMESTAMPTZ, last_login_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL, updated_at TIMESTAMPTZ NOT NULL ); ALTER TABLE users ADD COLUMN IF NOT EXISTS login_id VARCHAR(60); ALTER TABLE users ADD COLUMN IF NOT EXISTS role VARCHAR(20) NOT NULL DEFAULT 'user'; ALTER TABLE users ADD COLUMN IF NOT EXISTS disabled_at TIMESTAMPTZ; ALTER TABLE users ADD COLUMN IF NOT EXISTS email_verified_at TIMESTAMPTZ; ALTER TABLE users ADD COLUMN IF NOT EXISTS last_login_at TIMESTAMPTZ; CREATE TABLE IF NOT EXISTS auth_sessions ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, token_hash VARCHAR(255) NOT NULL UNIQUE, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL ); CREATE INDEX IF NOT EXISTS auth_sessions_user_id_idx ON auth_sessions (user_id); CREATE TABLE IF NOT EXISTS planner_entries ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, entry_date VARCHAR(10) NOT NULL, payload JSONB NOT NULL, created_at TIMESTAMPTZ NOT NULL, updated_at TIMESTAMPTZ NOT NULL ); CREATE UNIQUE INDEX IF NOT EXISTS planner_entries_user_date_unique ON planner_entries (user_id, entry_date); CREATE INDEX IF NOT EXISTS planner_entries_user_id_idx ON planner_entries (user_id); CREATE TABLE IF NOT EXISTS goals ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, title VARCHAR(120) NOT NULL, target_date VARCHAR(10) NOT NULL, active_from VARCHAR(10), active_until VARCHAR(10), color VARCHAR(32) NOT NULL DEFAULT '#1c1917', created_at TIMESTAMPTZ NOT NULL, updated_at TIMESTAMPTZ NOT NULL ); CREATE INDEX IF NOT EXISTS goals_user_id_idx ON goals (user_id); CREATE TABLE IF NOT EXISTS email_verification_tokens ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, token_hash VARCHAR(255) NOT NULL UNIQUE, expires_at TIMESTAMPTZ NOT NULL, used_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL ); CREATE INDEX IF NOT EXISTS email_verification_tokens_user_id_idx ON email_verification_tokens (user_id); CREATE TABLE IF NOT EXISTS password_reset_tokens ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, token_hash VARCHAR(255) NOT NULL UNIQUE, expires_at TIMESTAMPTZ NOT NULL, used_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL ); CREATE INDEX IF NOT EXISTS password_reset_tokens_user_id_idx ON password_reset_tokens (user_id); `) }