121 lines
3.8 KiB
SQL
121 lines
3.8 KiB
SQL
-- Create types
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'question_type') THEN
|
|
CREATE TYPE question_type AS ENUM (
|
|
'variant',
|
|
'images',
|
|
'varimg',
|
|
'emoji',
|
|
'text',
|
|
'select',
|
|
'date',
|
|
'number',
|
|
'file',
|
|
'page',
|
|
'rating'
|
|
);
|
|
END IF;
|
|
|
|
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'quiz_status') THEN
|
|
CREATE TYPE quiz_status AS ENUM (
|
|
'draft',
|
|
'template',
|
|
'stop',
|
|
'start',
|
|
'timeout',
|
|
'offlimit'
|
|
);
|
|
END IF;
|
|
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
END$$;
|
|
|
|
-- Create tables
|
|
CREATE TABLE IF NOT EXISTS account (
|
|
id UUID PRIMARY KEY,
|
|
user_id VARCHAR(24),
|
|
email VARCHAR(50),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
deleted BOOLEAN DEFAULT false
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS quiz (
|
|
id bigserial UNIQUE NOT NULL PRIMARY KEY,
|
|
qid uuid DEFAULT uuid_generate_v4(),
|
|
accountid varchar(30) NOT NULL,
|
|
deleted boolean DEFAULT false,
|
|
archived boolean DEFAULT false,
|
|
fingerprinting boolean DEFAULT false,
|
|
repeatable boolean DEFAULT false,
|
|
note_prevented boolean DEFAULT false,
|
|
mail_notifications boolean DEFAULT false,
|
|
unique_answers boolean DEFAULT false,
|
|
super boolean DEFAULT false,
|
|
group_id bigint DEFAULT 0,
|
|
name varchar(280),
|
|
description text,
|
|
config text,
|
|
status quiz_status DEFAULT 'draft',
|
|
limit_answers integer DEFAULT 0,
|
|
due_to integer DEFAULT 0,
|
|
time_of_passing integer DEFAULT 0,
|
|
pausable boolean DEFAULT false,
|
|
version smallint DEFAULT 0,
|
|
version_comment text DEFAULT '',
|
|
parent_ids integer[],
|
|
created_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
questions_count integer DEFAULT 0,
|
|
answers_count integer DEFAULT 0,
|
|
average_time_passing integer DEFAULT 0
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS question (
|
|
id bigserial UNIQUE NOT NULL PRIMARY KEY,
|
|
quiz_id bigint NOT NULL,
|
|
title varchar(512) NOT NULL,
|
|
description text,
|
|
questiontype question_type DEFAULT 'text',
|
|
required boolean DEFAULT false,
|
|
deleted boolean DEFAULT false,
|
|
page smallint DEFAULT 0,
|
|
content text,
|
|
version smallint DEFAULT 0,
|
|
parent_ids integer[],
|
|
created_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at timestamp DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT quiz_relation FOREIGN KEY(quiz_id) REFERENCES quiz(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS answer (
|
|
id bigserial UNIQUE NOT NULL PRIMARY KEY,
|
|
content text,
|
|
quiz_id bigint NOT NULL REFERENCES quiz(id),
|
|
question_id bigint NOT NULL REFERENCES question(id),
|
|
fingerprint varchar(1024),
|
|
session varchar(20),
|
|
created_at timestamp DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS privileges (
|
|
id SERIAL PRIMARY KEY,
|
|
privilegeID VARCHAR(50),
|
|
account_id UUID,
|
|
privilege_name VARCHAR(255),
|
|
amount INT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (account_id) REFERENCES account (id)
|
|
);
|
|
|
|
-- Create indexes
|
|
CREATE INDEX IF NOT EXISTS active ON question(deleted) WHERE deleted=false;
|
|
CREATE INDEX IF NOT EXISTS relation ON question(quiz_id DESC);
|
|
CREATE INDEX IF NOT EXISTS required ON question(required DESC);
|
|
CREATE INDEX IF NOT EXISTS questiontype ON question(questiontype);
|
|
CREATE INDEX IF NOT EXISTS active ON quiz(deleted, archived, status) WHERE deleted = false AND archived = false AND status = 'start';
|
|
CREATE INDEX IF NOT EXISTS timeouted ON quiz(due_to DESC) WHERE deleted = false AND due_to <> 0 AND status <> 'timeout';
|
|
CREATE INDEX IF NOT EXISTS groups ON quiz(super) WHERE super = true;
|
|
CREATE INDEX IF NOT EXISTS birthtime ON quiz(created_at DESC);
|
|
CREATE INDEX IF NOT EXISTS subquizes ON quiz(group_id DESC) WHERE group_id <> 0;
|