Files
term_portal/postgres/init/006_auth_and_aut.sql
T

89 lines
2.7 KiB
SQL

DROP TABLE IF EXISTS user_role CASCADE;
DROP TABLE IF EXISTS user_token_remember_me;
DROP TABLE IF EXISTS user_token_activation;
DROP TABLE IF EXISTS "user" CASCADE;
DROP TYPE IF EXISTS user_role_name;
DROP TYPE IF EXISTS user_hits_per_page;
DROP TYPE IF EXISTS user_status;
CREATE TYPE user_status AS ENUM ('registered', 'active', 'inactive', 'closed');
CREATE TYPE user_hits_per_page AS ENUM ('10', '20', '50', '100');
CREATE TYPE user_language AS ENUM ('sl', 'en');
CREATE TYPE user_role_name AS ENUM ('portal admin', 'dictionaries admin', 'consultancy admin', 'consultant', 'editor');
CREATE TABLE "user" (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
username VARCHAR NOT NULL UNIQUE,
first_name VARCHAR NOT NULL,
last_name VARCHAR NOT NULL,
email VARCHAR NOT NULL UNIQUE,
status user_status NOT NULL DEFAULT 'registered',
bcrypt_hash VARCHAR NOT NULL,
time_registered TIMESTAMPTZ NOT NULL DEFAULT NOW(),
time_activated TIMESTAMPTZ,
time_closed TIMESTAMPTZ,
hits_per_page user_hits_per_page NOT NULL DEFAULT '10',
language user_language NOT NULL DEFAULT 'sl'
);
CREATE TABLE user_token_activation (
token VARCHAR PRIMARY KEY,
user_id INT NOT NULL REFERENCES "user",
time_created TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE user_token_remember_me (
token VARCHAR PRIMARY KEY,
user_id INT NOT NULL REFERENCES "user",
time_created TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE user_token_reset_password (
token VARCHAR PRIMARY KEY,
user_id INT NOT NULL REFERENCES "user",
time_created TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE user_token_change_email (
token VARCHAR PRIMARY KEY,
user_id INT NOT NULL REFERENCES "user",
new_email VARCHAR NOT NULL,
time_created TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TABLE user_role (
user_id INT NOT NULL REFERENCES "user",
role_name user_role_name NOT NULL,
domains VARCHAR,
dictionary_id INT REFERENCES dictionary ON DELETE CASCADE, -- Consider indexing this one, since deletion of rows from dictionary will require a scan of this table for references.
administration BOOL,
editing BOOL,
terminology_review BOOL,
language_review BOOL,
CHECK (
CASE
WHEN role_name != 'consultant'
THEN domains IS NULL
ELSE TRUE
END
),
CHECK (
CASE
WHEN role_name = 'editor'
THEN dictionary_id IS NOT NULL
AND administration IS NOT NULL
AND editing IS NOT NULL
AND terminology_review IS NOT NULL
AND language_review IS NOT NULL
ELSE dictionary_id IS NULL
AND administration IS NULL
AND editing IS NULL
AND terminology_review IS NULL
AND language_review IS NULL
END
)
);