-- Copyright (c) 2025 Nikolai Papin -- -- This file is part of Easywish -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See -- the GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . ; CREATE EXTENSION IF NOT EXISTS "pgcrypto"; CREATE TABLE IF NOT EXISTS "users" ( id BIGSERIAL PRIMARY KEY, username VARCHAR(20) UNIQUE NOT NULL, verified BOOLEAN DEFAULT FALSE, registration_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, role INTEGER NOT NULL DEFAULT 0, deleted BOOLEAN DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS "banned_users" ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, reason VARCHAR(512), expires_at TIMESTAMP, banned_by VARCHAR(20) DEFAULT 'system', pardoned BOOLEAN DEFAULT FALSE, pardoned_by VARCHAR(20) ); CREATE TABLE IF NOT EXISTS "login_informations" ( id BIGSERIAL PRIMARY KEY, user_id BIGINT UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE, email VARCHAR(75) UNIQUE, password_hash VARCHAR(512) NOT NULL, totp_encrypted VARCHAR(512), email_2fa_enabled BOOLEAN DEFAULT FALSE, password_change_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS "confirmation_codes" ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, code_type INTEGER NOT NULL CHECK (code_type IN (0, 1)), code_hash VARCHAR(512) NOT NULL, expires_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + INTERVAL '10 minutes', used BOOLEAN DEFAULT FALSE, deleted BOOLEAN DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS "sessions" ( id BIGSERIAL PRIMARY KEY, user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE, guid UUID NOT NULL DEFAULT gen_random_uuid(), name VARCHAR(175), platform VARCHAR(175), latest_ip VARCHAR(16), login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, last_refresh_exp_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP + INTERVAL '10080 seconds', last_seen_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, terminated BOOLEAN DEFAULT FALSE ); CREATE TABLE IF NOT EXISTS "profiles" ( id BIGSERIAL PRIMARY KEY, user_id BIGINT UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE, name VARCHAR(75) NOT NULL, bio VARCHAR(512), avatar_url VARCHAR(255), birthday TIMESTAMP, color VARCHAR(7), color_grad VARCHAR(7) ); CREATE TABLE IF NOT EXISTS "profile_settings" ( id BIGSERIAL PRIMARY KEY, profile_id BIGINT UNIQUE NOT NULL REFERENCES profiles(id) ON DELETE CASCADE, hide_fulfilled BOOLEAN DEFAULT TRUE, hide_profile_details BOOLEAN DEFAULT FALSE, hide_for_unauthenticated BOOLEAN DEFAULT FALSE, hide_birthday BOOLEAN DEFAULT FALSE, hide_dates BOOLEAN DEFAULT FALSE, captcha BOOLEAN DEFAULT FALSE, followers_only_interaction BOOLEAN DEFAULT FALSE )