75 lines
2.3 KiB
SQL
75 lines
2.3 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');
|
|
|
|
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,
|
|
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_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
|
|
)
|
|
);
|