wip
This commit is contained in:
parent
bd4a475923
commit
9a164b984a
36 changed files with 2500 additions and 77 deletions
|
|
@ -1,43 +1,29 @@
|
|||
CREATE TABLE public.user (
|
||||
id serial NOT NULL,
|
||||
"name" varchar NOT NULL,
|
||||
"username" varchar NOT NULL,
|
||||
"password" char(96) NOT NULL,
|
||||
totp varchar NOT NULL,
|
||||
last_login timestamp with time zone NOT NULL DEFAULT '1970-01-01 00:00:00',
|
||||
CONSTRAINT user_pk PRIMARY KEY (id),
|
||||
CONSTRAINT user_un UNIQUE (username)
|
||||
CREATE TABLE public."user" (
|
||||
id SERIAL NOT NULL,
|
||||
username VARCHAR NOT NULL,
|
||||
name VARCHAR NOT NULL,
|
||||
"password" VARCHAR NOT NULL,
|
||||
last_login TIMESTAMP NOT NULL DEFAULT now(),
|
||||
CONSTRAINT newtable_pk PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
CREATE TABLE public.session (
|
||||
id serial NOT NULL,
|
||||
user_id int4 NULL,
|
||||
"uuid" char(36) NOT NULL,
|
||||
created timestamp with time zone NOT NULL DEFAULT NOW(),
|
||||
last_used timestamp with time zone NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT session_pk PRIMARY KEY (id),
|
||||
CONSTRAINT session_un UNIQUE ("uuid"),
|
||||
CONSTRAINT session_user_fk FOREIGN KEY (user_id) REFERENCES "user"(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
CREATE TABLE public."session" (
|
||||
uuid UUID NOT NULL,
|
||||
user_id INT4 NULL,
|
||||
created TIMESTAMP NOT NULL DEFAULT now(),
|
||||
CONSTRAINT session_pk PRIMARY KEY (uuid),
|
||||
CONSTRAINT user_session_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
CREATE EXTENSION IF NOT EXISTS pgcrypto SCHEMA public;
|
||||
CREATE TABLE public.node (
|
||||
id SERIAL NOT NULL,
|
||||
user_id INT4 NOT NULL,
|
||||
parent_id INT4 NULL,
|
||||
"name" VARCHAR(256) NOT NULL DEFAULT '',
|
||||
"content" TEXT NOT NULL DEFAULT '',
|
||||
CONSTRAINT name_length CHECK (LENGTH(TRIM(name)) > 0),
|
||||
CONSTRAINT node_pk PRIMARY KEY (id),
|
||||
CONSTRAINT user_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
|
||||
CONSTRAINT node_fk FOREIGN KEY (parent_id) REFERENCES public.node(id) ON DELETE RESTRICT ON UPDATE RESTRICT
|
||||
);
|
||||
|
||||
CREATE FUNCTION password_hash(salt_hex char(32), pass bytea)
|
||||
RETURNS char(96)
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
RETURN (
|
||||
SELECT
|
||||
salt_hex ||
|
||||
encode(
|
||||
sha256(
|
||||
decode(salt_hex, 'hex') || /* salt in binary */
|
||||
pass /* password */
|
||||
),
|
||||
'hex'
|
||||
)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
|
|
|||
|
|
@ -1,33 +1,4 @@
|
|||
CREATE EXTENSION pg_trgm;
|
||||
|
||||
CREATE TABLE public.crypto_key (
|
||||
id serial4 NOT NULL,
|
||||
user_id int4 NOT NULL,
|
||||
description varchar(255) DEFAULT ''::character varying NOT NULL,
|
||||
"key" bpchar(144) NOT NULL,
|
||||
CONSTRAINT crypto_key_pk PRIMARY KEY (id),
|
||||
CONSTRAINT crypto_user_description_un UNIQUE (user_id, description),
|
||||
CONSTRAINT crypto_key_user_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE RESTRICT
|
||||
);
|
||||
|
||||
CREATE TABLE public.node (
|
||||
id serial4 NOT NULL,
|
||||
user_id int4 NOT NULL,
|
||||
parent_id int4 NULL,
|
||||
"name" varchar(256) DEFAULT ''::character varying NOT NULL,
|
||||
"content" text DEFAULT ''::text NOT NULL,
|
||||
updated timestamptz DEFAULT now() NOT NULL,
|
||||
crypto_key_id int4 NULL,
|
||||
content_encrypted text DEFAULT ''::text NOT NULL,
|
||||
markdown bool DEFAULT false NOT NULL,
|
||||
CONSTRAINT name_length CHECK ((length(TRIM(BOTH FROM name)) > 0)),
|
||||
CONSTRAINT node_pk PRIMARY KEY (id),
|
||||
CONSTRAINT crypto_key_fk FOREIGN KEY (crypto_key_id) REFERENCES public.crypto_key(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
|
||||
CONSTRAINT node_fk FOREIGN KEY (parent_id) REFERENCES public.node(id) ON DELETE RESTRICT ON UPDATE RESTRICT,
|
||||
CONSTRAINT node_user_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE RESTRICT
|
||||
);
|
||||
CREATE INDEX node_search_index ON public.node USING gin (name gin_trgm_ops, content gin_trgm_ops);
|
||||
|
||||
ALTER TABLE node ADD COLUMN updated TIMESTAMP NOT NULL DEFAULT NOW();
|
||||
|
||||
CREATE OR REPLACE FUNCTION node_update_timestamp()
|
||||
RETURNS TRIGGER
|
||||
|
|
|
|||
10
sql/00003.sql
Normal file
10
sql/00003.sql
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
CREATE TABLE public.file (
|
||||
id serial NOT NULL,
|
||||
user_id int4 NOT NULL,
|
||||
filename varchar(256) NOT NULL DEFAULT '<noname>',
|
||||
"size" int4 NOT NULL DEFAULT 0,
|
||||
mime varchar(256) NOT NULL DEFAULT '',
|
||||
uploaded timestamp NOT NULL DEFAULT NOW(),
|
||||
CONSTRAINT file_pk PRIMARY KEY (id),
|
||||
CONSTRAINT file_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE RESTRICT ON UPDATE RESTRICT
|
||||
);
|
||||
1
sql/00004.sql
Normal file
1
sql/00004.sql
Normal file
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE file ADD COLUMN md5 CHAR(32) DEFAULT ''
|
||||
2
sql/00005.sql
Normal file
2
sql/00005.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE public.file ADD node_id int4 NOT NULL;
|
||||
ALTER TABLE public.file ADD CONSTRAINT file_node_fk FOREIGN KEY (node_id) REFERENCES public.node(id) ON DELETE RESTRICT ON UPDATE RESTRICT;
|
||||
5
sql/00006.sql
Normal file
5
sql/00006.sql
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
ALTER TABLE public.file DROP CONSTRAINT file_node_fk;
|
||||
ALTER TABLE public.file ADD CONSTRAINT file_node_fk FOREIGN KEY (node_id) REFERENCES public.node(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
|
||||
ALTER TABLE public.file DROP CONSTRAINT file_fk;
|
||||
ALTER TABLE public.file ADD CONSTRAINT file_user_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE ON UPDATE CASCADE;
|
||||
10
sql/00007.sql
Normal file
10
sql/00007.sql
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
CREATE TABLE public.crypto_key (
|
||||
id serial NOT NULL,
|
||||
user_id int4 NOT NULL,
|
||||
description varchar(255) NOT NULL DEFAULT '',
|
||||
"key" char(144) NOT NULL,
|
||||
CONSTRAINT crypto_key_pk PRIMARY KEY (id),
|
||||
CONSTRAINT crypto_key_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
COMMENT ON COLUMN public.crypto_key.key IS 'salt(16 bytes) + [key encrypted with pbkdf2(pass, salt)]';
|
||||
2
sql/00008.sql
Normal file
2
sql/00008.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE public.node ADD crypto_key_id int4 NULL;
|
||||
ALTER TABLE public.node ADD CONSTRAINT crypto_key_fk FOREIGN KEY (crypto_key_id) REFERENCES public.crypto_key(id) ON DELETE RESTRICT ON UPDATE RESTRICT;
|
||||
1
sql/00009.sql
Normal file
1
sql/00009.sql
Normal file
|
|
@ -0,0 +1 @@
|
|||
CREATE SEQUENCE aes_ccm_counter AS int8 INCREMENT BY 1 NO CYCLE;
|
||||
1
sql/00010.sql
Normal file
1
sql/00010.sql
Normal file
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE public.crypto_key ADD CONSTRAINT crypto_user_description_un UNIQUE (user_id, description);
|
||||
5
sql/00011.sql
Normal file
5
sql/00011.sql
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
ALTER TABLE node ADD COLUMN content_encrypted TEXT NOT NULL DEFAULT '';
|
||||
UPDATE node SET content_encrypted = content, content = '' WHERE crypto_key_id IS NOT NULL;
|
||||
|
||||
CREATE EXTENSION pg_trgm;
|
||||
CREATE INDEX node_content_index ON node USING gin (content gin_trgm_ops);
|
||||
2
sql/00012.sql
Normal file
2
sql/00012.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
DROP INDEX node_content_index;
|
||||
CREATE INDEX node_search_index ON node USING gin (name gin_trgm_ops, content gin_trgm_ops);
|
||||
1
sql/00013.sql
Normal file
1
sql/00013.sql
Normal file
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE public.node ADD COLUMN markdown bool NOT NULL DEFAULT false;
|
||||
18
sql/00014.sql
Normal file
18
sql/00014.sql
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
CREATE TABLE checklist_group (
|
||||
id serial NOT NULL,
|
||||
node_id int4 NOT NULL,
|
||||
"order" int NOT NULL DEFAULT 0,
|
||||
label varchar NOT NULL,
|
||||
CONSTRAINT checklist_group_pk PRIMARY KEY (id),
|
||||
CONSTRAINT checklist_group_node_fk FOREIGN KEY (node_id) REFERENCES public."node"(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE checklist_item (
|
||||
id serial NOT NULL,
|
||||
checklist_group_id int4 NOT NULL,
|
||||
"order" int NOT NULL DEFAULT 0,
|
||||
label varchar NOT NULL,
|
||||
checked bool NOT NULL DEFAULT false,
|
||||
CONSTRAINT checklist_item_pk PRIMARY KEY (id),
|
||||
CONSTRAINT checklist_group_item_fk FOREIGN KEY (checklist_group_id) REFERENCES public."checklist_group"(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
)
|
||||
14
sql/00015.sql
Normal file
14
sql/00015.sql
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
CREATE TABLE public.schedule (
|
||||
id SERIAL NOT NULL,
|
||||
user_id INT4 NOT NULL,
|
||||
node_id INT4 NOT NULL,
|
||||
schedule_uuid CHAR(36) DEFAULT GEN_RANDOM_UUID() NOT NULL,
|
||||
"time" TIMESTAMP NOT NULL,
|
||||
description VARCHAR DEFAULT '' NOT NULL,
|
||||
acknowledged BOOL DEFAULT false NOT NULL,
|
||||
|
||||
CONSTRAINT schedule_pk PRIMARY KEY (id),
|
||||
CONSTRAINT schedule_uuid UNIQUE (schedule_uuid),
|
||||
CONSTRAINT schedule_node_fk FOREIGN KEY (node_id) REFERENCES public.node(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
CONSTRAINT schedule_user_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
1
sql/00016.sql
Normal file
1
sql/00016.sql
Normal file
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE public.schedule ADD CONSTRAINT schedule_event UNIQUE (user_id, node_id, "time", description);
|
||||
11
sql/00017.sql
Normal file
11
sql/00017.sql
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
CREATE TABLE public.notification (
|
||||
id SERIAl NOT NULL,
|
||||
user_id INT4 NOT NULL,
|
||||
service VARCHAR DEFAULT 'NTFY' NOT NULL,
|
||||
"configuration" JSONB DEFAULT '{}' NOT NULL,
|
||||
prio INT DEFAULT 0 NOT NULL,
|
||||
|
||||
CONSTRAINT notification_pk PRIMARY KEY (id),
|
||||
CONSTRAINT notification_unique UNIQUE (user_id,prio),
|
||||
CONSTRAINT notification_user_fk FOREIGN KEY (user_id) REFERENCES public."user"(id) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
);
|
||||
2
sql/00018.sql
Normal file
2
sql/00018.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE public.schedule ALTER COLUMN "time" TYPE timestamptz USING "time"::timestamptz;
|
||||
|
||||
1
sql/00019.sql
Normal file
1
sql/00019.sql
Normal file
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE public.schedule ADD COLUMN remind_minutes int NOT NULL DEFAULT 0;
|
||||
2
sql/00020.sql
Normal file
2
sql/00020.sql
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
ALTER TABLE public."user" ADD timezone varchar DEFAULT 'UTC' NOT NULL;
|
||||
ALTER TABLE public.schedule ALTER COLUMN "time" TYPE timestamp USING "time"::timestamp;
|
||||
1
sql/00021.sql
Normal file
1
sql/00021.sql
Normal file
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE public.node ALTER COLUMN updated TYPE timestamptz USING updated::timestamptz;
|
||||
21
sql/00022.sql
Normal file
21
sql/00022.sql
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
||||
|
||||
CREATE FUNCTION public.password_hash(salt_hex char(32), pass bytea)
|
||||
RETURNS char(96)
|
||||
LANGUAGE plpgsql
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
RETURN (
|
||||
SELECT
|
||||
salt_hex ||
|
||||
encode(
|
||||
sha256(
|
||||
decode(salt_hex, 'hex') || /* salt in binary */
|
||||
pass /* password */
|
||||
),
|
||||
'hex'
|
||||
)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
Loading…
Add table
Add a link
Reference in a new issue