diff --git a/database/create-schema.sql b/database/create-schema.sql new file mode 100644 index 0000000..6a2fd45 --- /dev/null +++ b/database/create-schema.sql @@ -0,0 +1,555 @@ +-- +-- PostgreSQL database dump +-- + +-- Dumped from database version 14.18 (Ubuntu 14.18-0ubuntu0.22.04.1) +-- Dumped by pg_dump version 17.4 + +SET statement_timeout = 0; +SET lock_timeout = 0; +SET idle_in_transaction_session_timeout = 0; +SET transaction_timeout = 0; +SET client_encoding = 'UTF8'; +SET standard_conforming_strings = on; +SELECT pg_catalog.set_config('search_path', '', false); +SET check_function_bodies = false; +SET xmloption = content; +SET client_min_messages = warning; +SET row_security = off; + +-- +-- Name: access; Type: SCHEMA; Schema: -; Owner: - +-- + +CREATE SCHEMA access; + + +-- +-- Name: activity; Type: SCHEMA; Schema: -; Owner: - +-- + +CREATE SCHEMA activity; + + +-- +-- Name: data; Type: SCHEMA; Schema: -; Owner: - +-- + +CREATE SCHEMA data; + + +-- +-- Name: public; Type: SCHEMA; Schema: -; Owner: - +-- + +-- *not* creating schema, since initdb creates it + + +-- +-- Name: system; Type: SCHEMA; Schema: -; Owner: - +-- + +CREATE SCHEMA system; + + +-- +-- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner: - +-- + +CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public; + + +-- +-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner: - +-- + +COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions'; + + +-- +-- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: - +-- + +CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public; + + +-- +-- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner: - +-- + +COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)'; + + +-- +-- Name: uuid_v7(timestamp with time zone); Type: FUNCTION; Schema: public; Owner: - +-- + +CREATE FUNCTION public.uuid_v7(cts timestamp with time zone DEFAULT clock_timestamp()) RETURNS uuid + LANGUAGE plpgsql + AS $$ +DECLARE + state text = current_setting('uuidv7.old_tp',true); + old_tp text = split_part(state, ':',1); + base int = coalesce(nullif(split_part(state,':',4),'')::int,(random()*16777215/2-1)::int); + tp text; + entropy text; + seq text=base; + seqn int=split_part(state,':',2); + ver text = coalesce(split_part(state,':',3),to_hex(8+(random()*3)::int)); +BEGIN + base = (random()*16777215/2-1)::int; + tp = lpad(to_hex(floor(extract(epoch from cts)*1000)::int8),12,'0')||'7'; + if tp is distinct from old_tp then + old_tp = tp; + ver = to_hex(8+(random()*3)::int); + base = (random()*16777215/2-1)::int; + seqn = base; + else + seqn = seqn+(random()*1000)::int; + end if; + perform set_config('uuidv7.old_tp',old_tp||':'||seqn||':'||ver||':'||base, false); + entropy = md5(gen_random_uuid()::text); + seq = lpad(to_hex(seqn),6,'0'); + return (tp || substring(seq from 1 for 3) || ver || substring(seq from 4 for 3) || + substring(entropy from 1 for 12))::uuid; +END +$$; + + +SET default_table_access_method = heap; + +-- +-- Name: categories; Type: TABLE; Schema: access; Owner: - +-- + +CREATE TABLE access.categories ( + user_id smallint NOT NULL, + category_id uuid NOT NULL, + view boolean NOT NULL, + edit boolean NOT NULL +); + + +-- +-- Name: files; Type: TABLE; Schema: access; Owner: - +-- + +CREATE TABLE access.files ( + user_id smallint NOT NULL, + file_id uuid NOT NULL, + view boolean NOT NULL, + edit boolean NOT NULL +); + + +-- +-- Name: pools; Type: TABLE; Schema: access; Owner: - +-- + +CREATE TABLE access.pools ( + user_id smallint NOT NULL, + pool_id uuid NOT NULL, + view boolean NOT NULL, + edit boolean NOT NULL +); + + +-- +-- Name: tags; Type: TABLE; Schema: access; Owner: - +-- + +CREATE TABLE access.tags ( + user_id smallint NOT NULL, + tag_id uuid NOT NULL, + view boolean NOT NULL, + edit boolean NOT NULL +); + + +-- +-- Name: file_views; Type: TABLE; Schema: activity; Owner: - +-- + +CREATE TABLE activity.file_views ( + file_id uuid NOT NULL, + "timestamp" timestamp with time zone NOT NULL, + user_id smallint NOT NULL +); + + +-- +-- Name: pool_views; Type: TABLE; Schema: activity; Owner: - +-- + +CREATE TABLE activity.pool_views ( + pool_id uuid NOT NULL, + "timestamp" timestamp with time zone NOT NULL, + user_id smallint NOT NULL +); + + +-- +-- Name: sessions; Type: TABLE; Schema: activity; Owner: - +-- + +CREATE TABLE activity.sessions ( + id integer NOT NULL, + token text NOT NULL, + user_id smallint NOT NULL, + user_agent character varying(256) NOT NULL, + started_at timestamp with time zone DEFAULT statement_timestamp() NOT NULL, + expires_at timestamp with time zone, + last_activity timestamp with time zone DEFAULT statement_timestamp() NOT NULL +); + + +-- +-- Name: sessions_id_seq; Type: SEQUENCE; Schema: activity; Owner: - +-- + +CREATE SEQUENCE activity.sessions_id_seq + AS integer + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: sessions_id_seq; Type: SEQUENCE OWNED BY; Schema: activity; Owner: - +-- + +ALTER SEQUENCE activity.sessions_id_seq OWNED BY activity.sessions.id; + + +-- +-- Name: tag_uses; Type: TABLE; Schema: activity; Owner: - +-- + +CREATE TABLE activity.tag_uses ( + tag_id uuid NOT NULL, + "timestamp" timestamp with time zone NOT NULL, + user_id smallint NOT NULL, + included boolean NOT NULL +); + + +-- +-- Name: autotags; Type: TABLE; Schema: data; Owner: - +-- + +CREATE TABLE data.autotags ( + trigger_tag_id uuid NOT NULL, + add_tag_id uuid NOT NULL, + is_active boolean DEFAULT true NOT NULL +); + + +-- +-- Name: categories; Type: TABLE; Schema: data; Owner: - +-- + +CREATE TABLE data.categories ( + id uuid DEFAULT public.uuid_v7() NOT NULL, + name character varying(256) NOT NULL, + notes text, + color character(6), + creator_id smallint NOT NULL +); + + +-- +-- Name: file_pool; Type: TABLE; Schema: data; Owner: - +-- + +CREATE TABLE data.file_pool ( + file_id uuid NOT NULL, + pool_id uuid NOT NULL, + number smallint NOT NULL +); + + +-- +-- Name: file_tag; Type: TABLE; Schema: data; Owner: - +-- + +CREATE TABLE data.file_tag ( + file_id uuid NOT NULL, + tag_id uuid NOT NULL +); + + +-- +-- Name: files; Type: TABLE; Schema: data; Owner: - +-- + +CREATE TABLE data.files ( + id uuid DEFAULT public.uuid_v7() NOT NULL, + name character varying(256), + mime_id smallint NOT NULL, + datetime timestamp with time zone DEFAULT clock_timestamp() NOT NULL, + notes text, + metadata jsonb NOT NULL, + creator_id smallint NOT NULL +); + + +-- +-- Name: pools; Type: TABLE; Schema: data; Owner: - +-- + +CREATE TABLE data.pools ( + id uuid DEFAULT public.uuid_v7() NOT NULL, + name character varying(256) NOT NULL, + notes text, + creator_id smallint NOT NULL +); + + +-- +-- Name: tags; Type: TABLE; Schema: data; Owner: - +-- + +CREATE TABLE data.tags ( + id uuid DEFAULT public.uuid_v7() NOT NULL, + name character varying(256) NOT NULL, + notes text, + color character(6), + category_id uuid, + creator_id smallint NOT NULL +); + + +-- +-- Name: mime; Type: TABLE; Schema: system; Owner: - +-- + +CREATE TABLE system.mime ( + id smallint NOT NULL, + name character varying(127) NOT NULL, + extension character varying(16) NOT NULL +); + + +-- +-- Name: mime_id_seq; Type: SEQUENCE; Schema: system; Owner: - +-- + +CREATE SEQUENCE system.mime_id_seq + AS smallint + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: mime_id_seq; Type: SEQUENCE OWNED BY; Schema: system; Owner: - +-- + +ALTER SEQUENCE system.mime_id_seq OWNED BY system.mime.id; + + +-- +-- Name: users; Type: TABLE; Schema: system; Owner: - +-- + +CREATE TABLE system.users ( + id smallint NOT NULL, + name character varying(32) NOT NULL, + password text NOT NULL, + is_admin boolean DEFAULT false NOT NULL +); + + +-- +-- Name: users_id_seq; Type: SEQUENCE; Schema: system; Owner: - +-- + +CREATE SEQUENCE system.users_id_seq + AS smallint + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + + +-- +-- Name: users_id_seq; Type: SEQUENCE OWNED BY; Schema: system; Owner: - +-- + +ALTER SEQUENCE system.users_id_seq OWNED BY system.users.id; + + +-- +-- Name: sessions id; Type: DEFAULT; Schema: activity; Owner: - +-- + +ALTER TABLE ONLY activity.sessions ALTER COLUMN id SET DEFAULT nextval('activity.sessions_id_seq'::regclass); + + +-- +-- Name: mime id; Type: DEFAULT; Schema: system; Owner: - +-- + +ALTER TABLE ONLY system.mime ALTER COLUMN id SET DEFAULT nextval('system.mime_id_seq'::regclass); + + +-- +-- Name: users id; Type: DEFAULT; Schema: system; Owner: - +-- + +ALTER TABLE ONLY system.users ALTER COLUMN id SET DEFAULT nextval('system.users_id_seq'::regclass); + + +-- +-- Name: categories categories_pkey; Type: CONSTRAINT; Schema: access; Owner: - +-- + +ALTER TABLE ONLY access.categories + ADD CONSTRAINT categories_pkey PRIMARY KEY (user_id, category_id); + + +-- +-- Name: files files_pkey; Type: CONSTRAINT; Schema: access; Owner: - +-- + +ALTER TABLE ONLY access.files + ADD CONSTRAINT files_pkey PRIMARY KEY (user_id, file_id); + + +-- +-- Name: pools pools_pkey; Type: CONSTRAINT; Schema: access; Owner: - +-- + +ALTER TABLE ONLY access.pools + ADD CONSTRAINT pools_pkey PRIMARY KEY (user_id, pool_id); + + +-- +-- Name: tags tags_pkey; Type: CONSTRAINT; Schema: access; Owner: - +-- + +ALTER TABLE ONLY access.tags + ADD CONSTRAINT tags_pkey PRIMARY KEY (user_id, tag_id); + + +-- +-- Name: file_views file_views_pkey; Type: CONSTRAINT; Schema: activity; Owner: - +-- + +ALTER TABLE ONLY activity.file_views + ADD CONSTRAINT file_views_pkey PRIMARY KEY (file_id, "timestamp", user_id); + + +-- +-- Name: pool_views pool_views_pkey; Type: CONSTRAINT; Schema: activity; Owner: - +-- + +ALTER TABLE ONLY activity.pool_views + ADD CONSTRAINT pool_views_pkey PRIMARY KEY (pool_id, "timestamp", user_id); + + +-- +-- Name: sessions sessions_pkey; Type: CONSTRAINT; Schema: activity; Owner: - +-- + +ALTER TABLE ONLY activity.sessions + ADD CONSTRAINT sessions_pkey PRIMARY KEY (id); + + +-- +-- Name: tag_uses tag_uses_pkey; Type: CONSTRAINT; Schema: activity; Owner: - +-- + +ALTER TABLE ONLY activity.tag_uses + ADD CONSTRAINT tag_uses_pkey PRIMARY KEY (tag_id, "timestamp", user_id); + + +-- +-- Name: autotags autotags_pkey; Type: CONSTRAINT; Schema: data; Owner: - +-- + +ALTER TABLE ONLY data.autotags + ADD CONSTRAINT autotags_pkey PRIMARY KEY (trigger_tag_id, add_tag_id); + + +-- +-- Name: categories categories_pkey; Type: CONSTRAINT; Schema: data; Owner: - +-- + +ALTER TABLE ONLY data.categories + ADD CONSTRAINT categories_pkey PRIMARY KEY (id); + + +-- +-- Name: file_pool file_pool_pkey; Type: CONSTRAINT; Schema: data; Owner: - +-- + +ALTER TABLE ONLY data.file_pool + ADD CONSTRAINT file_pool_pkey PRIMARY KEY (file_id, pool_id, number); + + +-- +-- Name: file_tag file_tag_pkey; Type: CONSTRAINT; Schema: data; Owner: - +-- + +ALTER TABLE ONLY data.file_tag + ADD CONSTRAINT file_tag_pkey PRIMARY KEY (file_id, tag_id); + + +-- +-- Name: files files_pkey; Type: CONSTRAINT; Schema: data; Owner: - +-- + +ALTER TABLE ONLY data.files + ADD CONSTRAINT files_pkey PRIMARY KEY (id); + + +-- +-- Name: pools pools_pkey; Type: CONSTRAINT; Schema: data; Owner: - +-- + +ALTER TABLE ONLY data.pools + ADD CONSTRAINT pools_pkey PRIMARY KEY (id); + + +-- +-- Name: tags tags_pkey; Type: CONSTRAINT; Schema: data; Owner: - +-- + +ALTER TABLE ONLY data.tags + ADD CONSTRAINT tags_pkey PRIMARY KEY (id); + + +-- +-- Name: mime mime_pkey; Type: CONSTRAINT; Schema: system; Owner: - +-- + +ALTER TABLE ONLY system.mime + ADD CONSTRAINT mime_pkey PRIMARY KEY (id); + + +-- +-- Name: users users_pkey; Type: CONSTRAINT; Schema: system; Owner: - +-- + +ALTER TABLE ONLY system.users + ADD CONSTRAINT users_pkey PRIMARY KEY (id); + + +-- +-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: - +-- + +REVOKE USAGE ON SCHEMA public FROM PUBLIC; +GRANT ALL ON SCHEMA public TO PUBLIC; + + +-- +-- PostgreSQL database dump complete +-- +