221 lines
12 KiB
SQL
221 lines
12 KiB
SQL
-- Agreements
|
|
-- DROP TABLE IF EXISTS public.agreement CASCADE;
|
|
CREATE TABLE public.agreement (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT REFERENCES public.user(id),
|
|
version SMALLINT NOT NULL,
|
|
parent TEXT NOT NULL,
|
|
agreement_id_uuid UUID UNIQUE NOT NULL,
|
|
created BIGINT NOT NULL,
|
|
created_as_ts TIMESTAMPTZ NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
CREATE INDEX idx__public__agreement__user_id ON public.agreement (user_id);
|
|
CREATE INDEX idx__public__agreement__version ON public.agreement (version);
|
|
CREATE INDEX idx__public__agreement__parent ON public.agreement (parent);
|
|
CREATE INDEX idx__public__agreement__agreement_id_uuid ON public.agreement (agreement_id_uuid);
|
|
CREATE INDEX idx__public__agreement__created ON public.agreement (created);
|
|
CREATE INDEX idx__public__agreement__created_as_ts ON public.agreement (created_as_ts);
|
|
CREATE INDEX idx__public__agreement__created_ts ON public.agreement (created_ts);
|
|
CREATE INDEX idx__public__agreement__updated_ts ON public.agreement (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.agreement_required_id CASCADE;
|
|
CREATE TABLE public.agreement_required_id (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
agreement_id BIGINT NOT NULL REFERENCES public.agreement(id),
|
|
required_id TEXT NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__agreement_required_id UNIQUE (user_id, agreement_id, required_id)
|
|
);
|
|
CREATE INDEX idx__public__agreement_required_id__user_id ON public.agreement_required_id (user_id);
|
|
CREATE INDEX idx__public__agreement_required_id__agreement_id ON public.agreement_required_id (agreement_id);
|
|
CREATE INDEX idx__public__agreement_required_id__created_ts ON public.agreement_required_id (created_ts);
|
|
CREATE INDEX idx__public__agreement_required_id__updated_ts ON public.agreement_required_id (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.purpose CASCADE;
|
|
CREATE TABLE public.purpose (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
value TEXT NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__purpose UNIQUE (user_id, value)
|
|
);
|
|
CREATE INDEX idx__public__purpose__user_id ON public.purpose (user_id);
|
|
CREATE INDEX idx__public__purpose__value ON public.purpose (value);
|
|
CREATE INDEX idx__public__purpose__created_ts ON public.purpose (created_ts);
|
|
CREATE INDEX idx__public__purpose__updated_ts ON public.purpose (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.agreement_purpose CASCADE;
|
|
CREATE TABLE public.agreement_purpose (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
agreement_id BIGINT NOT NULL REFERENCES public.agreement(id),
|
|
purpose_id BIGINT NOT NULL REFERENCES public.purpose(id),
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__agreement_purpose UNIQUE (user_id, agreement_id, purpose_id)
|
|
);
|
|
CREATE INDEX idx__public__agreement_purpose__user_id ON public.agreement_purpose (user_id);
|
|
CREATE INDEX idx__public__agreement_purpose__agreement_id ON public.agreement_purpose (agreement_id);
|
|
CREATE INDEX idx__public__agreement_purpose__purpose_id ON public.agreement_purpose (purpose_id);
|
|
CREATE INDEX idx__public__agreement_purpose__created_ts ON public.agreement_purpose (created_ts);
|
|
CREATE INDEX idx__public__agreement_purpose__updated_ts ON public.agreement_purpose (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.caveat CASCADE;
|
|
CREATE TABLE public.caveat (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
value TEXT NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__caveat UNIQUE (user_id, value)
|
|
);
|
|
CREATE INDEX idx__public__caveat__user_id ON public.caveat (user_id);
|
|
CREATE INDEX idx__public__caveat__value ON public.caveat (value);
|
|
CREATE INDEX idx__public__caveat__created_ts ON public.caveat (created_ts);
|
|
CREATE INDEX idx__public__caveat__updated_ts ON public.caveat (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.agreement_caveat CASCADE;
|
|
CREATE TABLE public.agreement_caveat (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
agreement_id BIGINT NOT NULL REFERENCES public.agreement(id),
|
|
caveat_id BIGINT NOT NULL REFERENCES public.caveat(id),
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__agreement_caveat UNIQUE (user_id, agreement_id, caveat_id)
|
|
);
|
|
CREATE INDEX idx__public__agreement_caveat__user_id ON public.agreement_caveat (user_id);
|
|
CREATE INDEX idx__public__agreement_caveat__agreement_id ON public.agreement_caveat (agreement_id);
|
|
CREATE INDEX idx__public__agreement_caveat__caveat_id ON public.agreement_caveat (caveat_id);
|
|
CREATE INDEX idx__public__agreement_caveat__created_ts ON public.agreement_caveat (created_ts);
|
|
CREATE INDEX idx__public__agreement_caveat__updated_ts ON public.agreement_caveat (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.role CASCADE;
|
|
CREATE TABLE public.role (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
value TEXT NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__role UNIQUE (user_id, value)
|
|
);
|
|
CREATE INDEX idx__public__role__user_id ON public.role (user_id);
|
|
CREATE INDEX idx__public__role__value ON public.role (value);
|
|
CREATE INDEX idx__public__role__created_ts ON public.role (created_ts);
|
|
CREATE INDEX idx__public__role__updated_ts ON public.role (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.agreement_role CASCADE;
|
|
CREATE TABLE public.agreement_role (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
agreement_id BIGINT NOT NULL REFERENCES public.agreement(id),
|
|
role_id BIGINT NOT NULL REFERENCES public.role(id),
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__agreement_role UNIQUE (user_id, agreement_id, role_id)
|
|
);
|
|
CREATE INDEX idx__public__agreement_role__user_id ON public.agreement_role (user_id);
|
|
CREATE INDEX idx__public__agreement_role__agreement_id ON public.agreement_role (agreement_id);
|
|
CREATE INDEX idx__public__agreement_role__role_id ON public.agreement_role (role_id);
|
|
CREATE INDEX idx__public__agreement_role__created_ts ON public.agreement_role (created_ts);
|
|
CREATE INDEX idx__public__agreement_role__updated_ts ON public.agreement_role (updated_ts);
|
|
|
|
|
|
-- Events
|
|
-- DROP TABLE IF EXISTS public.event_type CASCADE;
|
|
CREATE TABLE public.event_type (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
value TEXT NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
CREATE INDEX idx__public__event_type__value ON public.event_type (value);
|
|
CREATE INDEX idx__public__event_type__created_ts ON public.event_type (created_ts);
|
|
CREATE INDEX idx__public__event_type__updated_ts ON public.event_type (updated_ts);
|
|
|
|
INSERT INTO public.event_type (value) VALUES ('data');
|
|
|
|
-- DROP TABLE IF EXISTS public.event CASCADE;
|
|
CREATE TABLE public.event (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
version SMALLINT NOT NULL,
|
|
event_id_uuid UUID UNIQUE NOT NULL,
|
|
event_type_id BIGINT NOT NULL REFERENCES public.event_type(id),
|
|
agreement_id BIGINT NOT NULL REFERENCES public.agreement(id),
|
|
sender_id TEXT NOT NULL,
|
|
recipient_id TEXT NOT NULL,
|
|
created BIGINT NOT NULL,
|
|
created_as_ts TIMESTAMPTZ NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
CREATE INDEX idx__public__event__user_id ON public.event (user_id);
|
|
CREATE INDEX idx__public__event__version ON public.event (version);
|
|
CREATE INDEX idx__public__event__event_id_uuid ON public.event (event_id_uuid);
|
|
CREATE INDEX idx__public__event__event_type_id ON public.event (event_type_id);
|
|
CREATE INDEX idx__public__event__agreement_id ON public.event (agreement_id);
|
|
CREATE INDEX idx__public__event__sender_id ON public.event (sender_id);
|
|
CREATE INDEX idx__public__event__recipient_id ON public.event (recipient_id);
|
|
CREATE INDEX idx__public__event__created_ts ON public.event (created_ts);
|
|
CREATE INDEX idx__public__event__updated_ts ON public.event (updated_ts);
|
|
|
|
-- DROP TABLE IF EXISTS public.event_data CASCADE;
|
|
-- DROP SEQUENCE IF EXISTS seq__event_data__id;
|
|
-- CREATE SEQUENCE seq__event_data__id;
|
|
-- CREATE TABLE public.event_data (
|
|
-- id BIGINT NOT NULL DEFAULT nextval('seq__event_data__id'),
|
|
-- user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
-- event_id BIGINT NOT NULL REFERENCES public.event(id),
|
|
-- data TEXT NOT NULL,
|
|
-- created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
-- updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
-- PRIMARY KEY (user_id, id)
|
|
-- ) PARTITION BY LIST (user_id);
|
|
CREATE TABLE public.event_data (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
event_id BIGINT NOT NULL REFERENCES public.event(id),
|
|
data TEXT NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
CREATE INDEX idx__public__event_data__event_id ON public.event_data (event_id);
|
|
CREATE INDEX idx__public__event_data__user_id ON public.event_data (user_id);
|
|
CREATE INDEX idx__public__event_data__created_ts ON public.event_data (created_ts);
|
|
CREATE INDEX idx__public__event_data__updated_ts ON public.event_data (updated_ts);
|
|
|
|
-- Signatures
|
|
-- DROP TABLE IF EXISTS public.signature CASCADE;
|
|
CREATE TABLE public.signature (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
user_id BIGINT NOT NULL REFERENCES public.user(id),
|
|
version SMALLINT NOT NULL,
|
|
signer_id TEXT NOT NULL,
|
|
signed_on BIGINT NOT NULL,
|
|
type TEXT NOT NULL,
|
|
jws TEXT NOT NULL,
|
|
role_id BIGINT REFERENCES public.role(id),
|
|
agreement_id BIGINT REFERENCES public.agreement(id),
|
|
event_id BIGINT REFERENCES public.event(id),
|
|
signed_on_as_ts TIMESTAMPTZ NOT NULL,
|
|
created_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
CONSTRAINT uniq__signature__agreement UNIQUE (user_id, signer_id, agreement_id),
|
|
CONSTRAINT uniq__signature__event UNIQUE (user_id, signer_id, event_id)
|
|
);
|
|
CREATE INDEX idx__public__signature__user_id ON public.signature (user_id);
|
|
CREATE INDEX idx__public__signature__version ON public.signature (version);
|
|
CREATE INDEX idx__public__signature__signed_on ON public.signature (signed_on);
|
|
CREATE INDEX idx__public__signature__role_id ON public.signature (role_id);
|
|
CREATE INDEX idx__public__signature__agreement_id ON public.signature (agreement_id);
|
|
CREATE INDEX idx__public__signature__event_id ON public.signature (event_id);
|
|
CREATE INDEX idx__public__signature__signed_on_as_ts ON public.signature (signed_on_as_ts);
|
|
CREATE INDEX idx__public__signature__created_ts ON public.signature (created_ts);
|
|
CREATE INDEX idx__public__signature__updated_ts ON public.signature (updated_ts);
|