2020-04-11 18:02:55 +02:00
|
|
|
-- Gochan master template for new database script
|
|
|
|
-- Contains macros in the form [curlybrace open]macro text[curlybrace close]
|
|
|
|
-- Macros are substituted by build_initdb.py to the supported database files. Must not contain extra spaces
|
2020-04-10 16:15:07 +02:00
|
|
|
-- Versioning numbering goes by whole numbers. Upgrade script migrate existing databases between versions
|
|
|
|
-- Database version: 1
|
|
|
|
|
|
|
|
CREATE TABLE database_version(
|
2020-04-12 16:10:30 +02:00
|
|
|
version INT NOT NULL
|
2020-04-10 16:15:07 +02:00
|
|
|
);
|
|
|
|
|
|
|
|
INSERT INTO database_version(version)
|
|
|
|
VALUES(1);
|
|
|
|
|
|
|
|
CREATE TABLE sections(
|
2020-04-12 16:10:30 +02:00
|
|
|
id BIGSERIAL PRIMARY KEY,
|
2020-04-10 16:15:07 +02:00
|
|
|
name TEXT NOT NULL,
|
|
|
|
abbreviation TEXT NOT NULL,
|
|
|
|
position SMALLINT NOT NULL,
|
|
|
|
hidden BOOL NOT NULL,
|
|
|
|
UNIQUE(position)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE boards(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
section_id BIGINT NOT NULL,
|
|
|
|
uri TEXT NOT NULL,
|
|
|
|
dir VARCHAR(45) NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
navbar_position SMALLINT NOT NULL,
|
2019-06-13 16:36:02 -07:00
|
|
|
title VARCHAR(45) NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
subtitle VARCHAR(64) NOT NULL,
|
|
|
|
description VARCHAR(64) NOT NULL,
|
|
|
|
max_file_size SMALLINT NOT NULL,
|
|
|
|
max_threads SMALLINT NOT NULL,
|
|
|
|
default_style VARCHAR(45) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
locked BOOL NOT NULL,
|
|
|
|
created_at TIMESTAMP NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
anonymous_name VARCHAR(45) NOT NULL DEFAULT 'Anonymous',
|
2020-04-12 16:10:30 +02:00
|
|
|
force_anonymous BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
autosage_after SMALLINT NOT NULL,
|
|
|
|
no_images_after SMALLINT NOT NULL,
|
|
|
|
max_message_length SMALLINT NOT NULL,
|
|
|
|
min_message_length SMALLINT NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
allow_embeds BOOL NOT NULL,
|
|
|
|
redictect_to_thread BOOL NOT NULL,
|
|
|
|
require_file BOOL NOT NULL,
|
|
|
|
enable_catalog BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(section_id) REFERENCES sections(id),
|
|
|
|
UNIQUE(dir),
|
|
|
|
UNIQUE(uri),
|
|
|
|
UNIQUE(navbar_position)
|
2019-06-13 16:36:02 -07:00
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE threads(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
board_id BIGINT NOT NULL,
|
|
|
|
locked BOOL NOT NULL,
|
|
|
|
stickied BOOL NOT NULL,
|
|
|
|
anchored BOOL NOT NULL,
|
|
|
|
cyclical BOOL NOT NULL,
|
|
|
|
last_bump TIMESTAMP NOT NULL,
|
|
|
|
deleted_at TIMESTAMP NOT NULL,
|
|
|
|
is_deleted BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(board_id) REFERENCES boards(id)
|
|
|
|
);
|
|
|
|
|
2020-04-10 16:54:18 +02:00
|
|
|
CREATE INDEX thread_deleted_index ON threads(is_deleted);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE posts(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
thread_id BIGINT NOT NULL,
|
|
|
|
is_top_post BOOL NOT NULL,
|
|
|
|
ip INT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
created_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2019-06-13 16:36:02 -07:00
|
|
|
name VARCHAR(50) NOT NULL,
|
|
|
|
tripcode VARCHAR(10) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
is_role_signature BOOL NOT NULL DEFAULT FALSE,
|
2019-06-13 16:36:02 -07:00
|
|
|
email VARCHAR(50) NOT NULL,
|
|
|
|
subject VARCHAR(100) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
message TEXT NOT NULL,
|
|
|
|
message_raw TEXT NOT NULL,
|
|
|
|
password TEXT NOT NULL,
|
|
|
|
deleted_at TIMESTAMP NOT NULL,
|
|
|
|
is_deleted BOOL NOT NULL,
|
|
|
|
banned_message TEXT,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(thread_id) REFERENCES threads(id)
|
|
|
|
);
|
|
|
|
|
2020-04-10 16:54:18 +02:00
|
|
|
CREATE INDEX top_post_index ON posts(is_top_post);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE files(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
post_id BIGINT NOT NULL,
|
|
|
|
file_order INT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
original_filename VARCHAR(255) NOT NULL,
|
|
|
|
filename VARCHAR(45) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
checksum INT NOT NULL,
|
|
|
|
file_size INT NOT NULL,
|
|
|
|
is_spoilered BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(post_id) REFERENCES posts(id),
|
|
|
|
UNIQUE(post_id, file_order)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE staff(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
2020-04-10 16:15:07 +02:00
|
|
|
username VARCHAR(45) NOT NULL,
|
|
|
|
password_checksum VARCHAR(120) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
global_rank INT,
|
2020-04-10 16:15:07 +02:00
|
|
|
added_on TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
last_login TIMESTAMP NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
is_active BOOL NOT NULL DEFAULT TRUE,
|
2020-04-10 16:15:07 +02:00
|
|
|
UNIQUE(username)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE sessions(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
staff_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
expires TIMESTAMP NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
data VARCHAR(45) NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE board_staff(
|
|
|
|
board_id BIGINT NOT NULL,
|
|
|
|
staff_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(board_id) REFERENCES boards(id),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE announcements(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
staff_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
subject VARCHAR(45) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
message TEXT NOT NULL,
|
2019-06-13 16:36:02 -07:00
|
|
|
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE ip_ban(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
staff_id BIGINT NOT NULL,
|
|
|
|
board_id BIGINT NOT NULL,
|
|
|
|
banned_for_post_id BIGINT NOT NULL,
|
|
|
|
copy_post_text TEXT NOT NULL,
|
|
|
|
is_active BOOL NOT NULL,
|
|
|
|
ip INT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
issued_at TIMESTAMP NOT NULL,
|
|
|
|
appeal_at TIMESTAMP NOT NULL,
|
|
|
|
expires_at TIMESTAMP NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
permanent BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
staff_note VARCHAR(255) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
message TEXT NOT NULL,
|
|
|
|
can_appeal BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(board_id) REFERENCES boards(id),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id),
|
|
|
|
FOREIGN KEY(banned_for_post_id) REFERENCES posts(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE ip_ban_audit(
|
|
|
|
ip_ban_id BIGINT NOT NULL,
|
2019-06-13 16:36:02 -07:00
|
|
|
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-04-12 16:10:30 +02:00
|
|
|
staff_id BIGINT NOT NULL,
|
|
|
|
is_active BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
expires_at TIMESTAMP NOT NULL,
|
|
|
|
appeal_at TIMESTAMP NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
permanent BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
staff_note VARCHAR(255) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
message TEXT NOT NULL,
|
|
|
|
can_appeal BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
PRIMARY KEY(ip_ban_id, timestamp),
|
|
|
|
FOREIGN KEY(ip_ban_id) REFERENCES ip_ban(id),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
2019-06-13 16:36:02 -07:00
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE ip_ban_appeals(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
staff_id BIGINT,
|
|
|
|
ip_ban_id BIGINT NOT NULL,
|
|
|
|
appeal_text TEXT NOT NULL,
|
|
|
|
staff_response TEXT,
|
|
|
|
is_denied BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id),
|
|
|
|
FOREIGN KEY(ip_ban_id) REFERENCES ip_ban(id)
|
2019-06-13 16:36:02 -07:00
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE ip_ban_appeals_audit(
|
|
|
|
appeal_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-04-12 16:10:30 +02:00
|
|
|
staff_id BIGINT,
|
|
|
|
appeal_text TEXT NOT NULL,
|
|
|
|
staff_response TEXT,
|
|
|
|
is_denied BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
PRIMARY KEY(appeal_id, timestamp),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id),
|
|
|
|
FOREIGN KEY(appeal_id) REFERENCES ip_ban_appeals(id)
|
2019-06-13 16:36:02 -07:00
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE reports(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
handled_by_staff_id BIGINT,
|
|
|
|
post_id BIGINT NOT NULL,
|
|
|
|
ip INT NOT NULL,
|
|
|
|
reason TEXT NOT NULL,
|
|
|
|
is_cleared BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(handled_by_staff_id) REFERENCES staff(id),
|
|
|
|
FOREIGN KEY(post_id) REFERENCES posts(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE reports_audit(
|
|
|
|
report_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-04-12 16:10:30 +02:00
|
|
|
handled_by_staff_id BIGINT,
|
|
|
|
is_cleared BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(handled_by_staff_id) REFERENCES staff(id),
|
|
|
|
FOREIGN KEY(report_id) REFERENCES reports(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE filename_ban(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
board_id BIGINT,
|
|
|
|
staff_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
staff_note VARCHAR(255) NOT NULL,
|
|
|
|
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
filename VARCHAR(255) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
is_regex BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(board_id) REFERENCES boards(id),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE username_ban(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
board_id BIGINT,
|
|
|
|
staff_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
staff_note VARCHAR(255) NOT NULL,
|
|
|
|
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
username VARCHAR(255) NOT NULL,
|
2020-04-12 16:10:30 +02:00
|
|
|
is_regex BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(board_id) REFERENCES boards(id),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE file_ban(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
board_id BIGINT,
|
|
|
|
staff_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
staff_note VARCHAR(255) NOT NULL,
|
|
|
|
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2020-04-12 16:10:30 +02:00
|
|
|
checksum INT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
FOREIGN KEY(board_id) REFERENCES boards(id),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
2019-06-13 16:36:02 -07:00
|
|
|
);
|
|
|
|
|
2020-04-12 16:10:30 +02:00
|
|
|
CREATE TABLE wordfilters(
|
|
|
|
id BIGSERIAL PRIMARY KEY,
|
|
|
|
board_id BIGINT,
|
|
|
|
staff_id BIGINT NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
staff_note VARCHAR(255) NOT NULL,
|
|
|
|
issued_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
2019-06-13 16:36:02 -07:00
|
|
|
search VARCHAR(75) NOT NULL CHECK (search <> ''),
|
2020-04-12 16:10:30 +02:00
|
|
|
is_regex BOOL NOT NULL,
|
2020-04-10 16:15:07 +02:00
|
|
|
change_to VARCHAR(75) NOT NULL,
|
|
|
|
FOREIGN KEY(board_id) REFERENCES boards(id),
|
|
|
|
FOREIGN KEY(staff_id) REFERENCES staff(id)
|
2019-06-13 16:36:02 -07:00
|
|
|
);
|