Files
tanabata/docs/reference/schema.sql
T
H1K0 76942721ad
deploy / deploy (push) Successful in 5s
chore(scripts): add legacy data migration
One-time migration from the old Python/Flask Tanabata DB into the new
core/data/acl/activity schema.

- transform.sql: reads a `legacy` schema and writes the new one in a single,
  idempotent transaction. Remaps user/mime ids (uuid -> smallint by name),
  inverts is_private -> is_public, lifts EXIF out of files.metadata into the
  exif column, preserves pool hierarchy/created under metadata, synthesises
  file_pool ordering, derives acl object types, sanitises colors/notes.
- migrate.sh: links the new DB to the old one via postgres_fdw, imports the
  old public schema as `legacy`, runs the transform, tears the link down.
- README.md: mapping table, decisions/lossy points, and the separate
  physical-blob copy step.
- docs/reference/schema.sql: the old DB schema the migration is built from
  (referenced by the README).

Verified end-to-end on PostgreSQL 16 (synthetic legacy data, all
transformations and idempotency checked).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 12:43:43 +03:00

2287 lines
68 KiB
PL/PgSQL

--
-- PostgreSQL database dump
--
-- Dumped from database version 14.20 (Ubuntu 14.20-1.pgdg22.04+1)
-- Dumped by pg_dump version 17.4
-- Started on 2026-03-31 00:31:48
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;
--
-- TOC entry 7 (class 2615 OID 2200)
-- Name: public; Type: SCHEMA; Schema: -; Owner: hiko
--
-- *not* creating schema, since initdb creates it
ALTER SCHEMA public OWNER TO hiko;
--
-- TOC entry 2 (class 3079 OID 16486)
-- Name: pgcrypto; Type: EXTENSION; Schema: -; Owner: -
--
CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public;
--
-- TOC entry 3596 (class 0 OID 0)
-- Dependencies: 2
-- Name: EXTENSION pgcrypto; Type: COMMENT; Schema: -; Owner:
--
COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions';
--
-- TOC entry 3 (class 3079 OID 16475)
-- Name: uuid-ossp; Type: EXTENSION; Schema: -; Owner: -
--
CREATE EXTENSION IF NOT EXISTS "uuid-ossp" WITH SCHEMA public;
--
-- TOC entry 3597 (class 0 OID 0)
-- Dependencies: 3
-- Name: EXTENSION "uuid-ossp"; Type: COMMENT; Schema: -; Owner:
--
COMMENT ON EXTENSION "uuid-ossp" IS 'generate universally unique identifiers (UUIDs)';
--
-- TOC entry 987 (class 1247 OID 28864)
-- Name: file; Type: TYPE; Schema: public; Owner: hiko
--
CREATE TYPE public.file AS (
id uuid,
mime_id uuid,
mime_name character varying(127),
extension character varying(16),
orig_name character varying(256),
datetime timestamp with time zone,
notes character varying(1024),
created timestamp with time zone,
creator_id uuid,
creator_name character varying(32),
is_private boolean
);
ALTER TYPE public.file OWNER TO hiko;
--
-- TOC entry 315 (class 1255 OID 17507)
-- Name: get_column_names(name, name); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.get_column_names(table_n name, schema_n name DEFAULT 'public'::name) RETURNS SETOF name
LANGUAGE sql SECURITY DEFINER
AS $$
SELECT column_name FROM information_schema.columns WHERE table_name = table_n AND table_schema = schema_n;
$$;
ALTER FUNCTION public.get_column_names(table_n name, schema_n name) OWNER TO hiko;
--
-- TOC entry 322 (class 1255 OID 17546)
-- Name: tfm__add_file_to_tag_recursive(uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm__add_file_to_tag_recursive(f_id uuid, t_id uuid) RETURNS SETOF uuid
LANGUAGE plpgsql
AS $$
DECLARE
tmp uuid;
pt_id uuid;
ppt_id uuid;
BEGIN
INSERT INTO file_tag VALUES (f_id, t_id) ON CONFLICT DO NOTHING RETURNING tag_id INTO tmp;
IF tmp IS NULL THEN
RETURN;
END IF;
RETURN NEXT t_id;
FOR pt_id IN
SELECT a.parent_id FROM autotags a WHERE a.child_id=t_id AND a.is_active
LOOP
FOR ppt_id IN SELECT tfm__add_file_to_tag_recursive(f_id, pt_id)
LOOP
RETURN NEXT ppt_id;
END LOOP;
END LOOP;
END;
$$;
ALTER FUNCTION public.tfm__add_file_to_tag_recursive(f_id uuid, t_id uuid) OWNER TO hiko;
--
-- TOC entry 323 (class 1255 OID 17539)
-- Name: tfm_add_autotag(uuid, uuid, uuid, boolean, boolean); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_add_autotag(s_id uuid, tc_id uuid, tp_id uuid, is_active boolean DEFAULT NULL::boolean, apply_to_existing boolean DEFAULT NULL::boolean) RETURNS boolean
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
ct_id uuid;
pt_id uuid;
f_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
PERFORM FROM tags t WHERE t.id=tc_id AND (NOT t.is_private OR t.creator_id=u_id);
IF NOT FOUND THEN RAISE 'Invalid child tag id'; END IF;
PERFORM FROM tags t WHERE t.id=tp_id AND (NOT t.is_private OR t.creator_id=u_id);
IF NOT FOUND THEN RAISE 'Invalid parent tag id'; END IF;
EXECUTE 'INSERT INTO autotags(child_id, parent_id, is_active) VALUES (' ||
quote_literal(tc_id) || ',' ||
quote_literal(tp_id) || ',' ||
CASE WHEN is_active IS NULL THEN 'DEFAULT' ELSE quote_literal(is_active) END ||
') ON CONFLICT DO NOTHING RETURNING child_id, parent_id' INTO ct_id, pt_id;
IF ct_id IS NOT NULL AND coalesce(apply_to_existing, true) THEN
FOR f_id IN
SELECT ft.file_id FROM file_tag ft WHERE ft.tag_id=tc_id
LOOP
PERFORM tfm__add_file_to_tag_recursive(f_id, tp_id);
END LOOP;
END IF;
RETURN (ct_id IS NOT NULL);
END;
$$;
ALTER FUNCTION public.tfm_add_autotag(s_id uuid, tc_id uuid, tp_id uuid, is_active boolean, apply_to_existing boolean) OWNER TO hiko;
--
-- TOC entry 298 (class 1255 OID 17380)
-- Name: tfm_add_category(uuid, character varying, character varying, character, boolean); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_add_category(s_id uuid, c_name character varying, c_notes character varying DEFAULT NULL::character varying, c_color character DEFAULT NULL::bpchar, c_is_private boolean DEFAULT NULL::boolean, OUT c_id uuid) RETURNS uuid
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
EXECUTE 'INSERT INTO categories(name, notes, color, creator_id, is_private) VALUES(' ||
quote_literal(c_name) || ',' ||
CASE WHEN c_notes IS NULL THEN 'DEFAULT' ELSE quote_literal(c_notes) END || ',' ||
CASE WHEN c_color IS NULL THEN 'DEFAULT' ELSE quote_literal(c_color) END || ',' ||
quote_literal(u_id) || ',' ||
CASE WHEN c_is_private IS NULL THEN 'DEFAULT' ELSE quote_literal(c_is_private) END ||
') RETURNING id' INTO c_id;
END;
$$;
ALTER FUNCTION public.tfm_add_category(s_id uuid, c_name character varying, c_notes character varying, c_color character, c_is_private boolean, OUT c_id uuid) OWNER TO hiko;
--
-- TOC entry 330 (class 1255 OID 120220)
-- Name: tfm_add_file(uuid, character varying, timestamp with time zone, character varying, boolean, character varying, jsonb); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_add_file(s_id uuid, f_mime character varying, f_datetime timestamp with time zone DEFAULT NULL::timestamp with time zone, f_notes character varying DEFAULT NULL::character varying, f_is_private boolean DEFAULT NULL::boolean, f_orig_name character varying DEFAULT NULL::character varying, f_metadata jsonb DEFAULT NULL::jsonb, OUT f_id uuid, OUT ext character varying) RETURNS record
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
m_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
SELECT m.id, m.extension FROM mime m WHERE m.name=f_mime INTO m_id, ext;
IF m_id IS NULL THEN RAISE 'Unsupported MIME: %', f_mime; END IF;
EXECUTE 'INSERT INTO files(mime_id, datetime, notes, creator_id, is_private, orig_name, metadata) VALUES(' ||
quote_literal(m_id) || ',' ||
CASE WHEN f_datetime IS NULL THEN 'DEFAULT' ELSE quote_literal(f_datetime) END || ',' ||
CASE WHEN f_notes IS NULL THEN 'DEFAULT' ELSE quote_literal(f_notes) END || ',' ||
quote_literal(u_id) || ',' ||
CASE WHEN f_is_private IS NULL THEN 'DEFAULT' ELSE quote_literal(f_is_private) END || ',' ||
CASE WHEN f_orig_name IS NULL THEN 'DEFAULT' ELSE quote_literal(f_orig_name) END || ',' ||
CASE WHEN f_metadata IS NULL THEN 'DEFAULT' ELSE quote_literal(f_metadata) END ||
') RETURNING id' INTO f_id;
END;
$$;
ALTER FUNCTION public.tfm_add_file(s_id uuid, f_mime character varying, f_datetime timestamp with time zone, f_notes character varying, f_is_private boolean, f_orig_name character varying, f_metadata jsonb, OUT f_id uuid, OUT ext character varying) OWNER TO hiko;
--
-- TOC entry 318 (class 1255 OID 17527)
-- Name: tfm_add_file_to_pool(uuid, uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_add_file_to_pool(s_id uuid, f_id uuid, p_id uuid) RETURNS boolean
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
tmp uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
PERFORM FROM files f WHERE f.id=f_id AND (NOT f.is_private OR f.creator_id=u_id);
IF NOT FOUND THEN RAISE 'Invalid file id'; END IF;
PERFORM FROM pools p WHERE p.id=p_id AND (NOT p.is_private OR p.creator_id=u_id);
IF NOT FOUND THEN RAISE 'Invalid pool id'; END IF;
INSERT INTO file_pool VALUES (f_id, p_id) ON CONFLICT DO NOTHING RETURNING pool_id INTO tmp;
RETURN (tmp IS NOT NULL);
END;
$$;
ALTER FUNCTION public.tfm_add_file_to_pool(s_id uuid, f_id uuid, p_id uuid) OWNER TO hiko;
--
-- TOC entry 309 (class 1255 OID 17461)
-- Name: tfm_add_file_to_tag(uuid, uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_add_file_to_tag(s_id uuid, f_id uuid, t_id uuid) RETURNS SETOF uuid
LANGUAGE plpgsql SECURITY DEFINER
AS $$DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
PERFORM FROM files f WHERE f.id=f_id AND (NOT f.is_private OR f.creator_id=u_id);
IF NOT FOUND THEN RAISE 'Invalid file id'; END IF;
PERFORM FROM tags t WHERE t.id=t_id AND (NOT t.is_private OR t.creator_id=u_id);
IF NOT FOUND THEN RAISE 'Invalid tag id'; END IF;
RETURN QUERY SELECT tfm__add_file_to_tag_recursive(f_id, t_id);
END;
$$;
ALTER FUNCTION public.tfm_add_file_to_tag(s_id uuid, f_id uuid, t_id uuid) OWNER TO hiko;
--
-- TOC entry 301 (class 1255 OID 17397)
-- Name: tfm_add_pool(uuid, character varying, character varying, uuid, boolean); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_add_pool(s_id uuid, p_name character varying, p_notes character varying DEFAULT NULL::character varying, p_parent_id uuid DEFAULT NULL::uuid, p_is_private boolean DEFAULT NULL::boolean, OUT p_id uuid) RETURNS uuid
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
EXECUTE 'INSERT INTO pools(name, notes, parent_id, creator_id, is_private) VALUES(' ||
quote_literal(p_name) || ',' ||
CASE WHEN p_notes IS NULL THEN 'DEFAULT' ELSE quote_literal(p_notes) END || ',' ||
CASE WHEN p_parent_id IS NULL THEN 'DEFAULT' ELSE quote_literal(p_parent_id) END || ',' ||
quote_literal(u_id) || ',' ||
CASE WHEN p_is_private IS NULL THEN 'DEFAULT' ELSE quote_literal(p_is_private) END ||
') RETURNING id' INTO p_id;
END;
$$;
ALTER FUNCTION public.tfm_add_pool(s_id uuid, p_name character varying, p_notes character varying, p_parent_id uuid, p_is_private boolean, OUT p_id uuid) OWNER TO hiko;
--
-- TOC entry 305 (class 1255 OID 17381)
-- Name: tfm_add_tag(uuid, character varying, character varying, character, uuid, boolean); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_add_tag(s_id uuid, t_name character varying, t_notes character varying DEFAULT NULL::character varying, t_color character DEFAULT NULL::bpchar, t_category_id uuid DEFAULT NULL::uuid, t_is_private boolean DEFAULT NULL::boolean, OUT t_id uuid) RETURNS uuid
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
EXECUTE 'INSERT INTO tags(name, notes, color, category_id, creator_id, is_private) VALUES(' ||
quote_literal(t_name) || ',' ||
CASE WHEN t_notes IS NULL THEN 'DEFAULT' ELSE quote_literal(t_notes) END || ',' ||
CASE WHEN t_color IS NULL THEN 'DEFAULT' ELSE quote_literal(t_color) END || ',' ||
CASE WHEN t_category_id IS NULL THEN 'DEFAULT' ELSE quote_literal(t_category_id) END || ',' ||
quote_literal(u_id) || ',' ||
CASE WHEN t_is_private IS NULL THEN 'DEFAULT' ELSE quote_literal(t_is_private) END ||
') RETURNING id' INTO t_id;
END;
$$;
ALTER FUNCTION public.tfm_add_tag(s_id uuid, t_name character varying, t_notes character varying, t_color character, t_category_id uuid, t_is_private boolean, OUT t_id uuid) OWNER TO hiko;
--
-- TOC entry 312 (class 1255 OID 17497)
-- Name: tfm_edit_category(uuid, uuid, character varying, character varying, character, boolean); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_edit_category(IN s_id uuid, IN c_id uuid, IN c_name character varying DEFAULT NULL::character varying, IN c_notes character varying DEFAULT NULL::character varying, IN c_color character DEFAULT NULL::bpchar, IN c_is_private boolean DEFAULT NULL::boolean)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT c.is_private OR c.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM categories c WHERE c.id=c_id)
THEN RAISE 'Not allowed'; END IF;
UPDATE categories SET
name = coalesce(c_name, name),
notes = coalesce(c_notes, notes),
color = CASE WHEN c_color=''::character THEN NULL ELSE coalesce(c_color, color) END,
is_private = coalesce(c_is_private, is_private)
WHERE id=c_id;
END;
$$;
ALTER PROCEDURE public.tfm_edit_category(IN s_id uuid, IN c_id uuid, IN c_name character varying, IN c_notes character varying, IN c_color character, IN c_is_private boolean) OWNER TO hiko;
--
-- TOC entry 319 (class 1255 OID 17500)
-- Name: tfm_edit_file(uuid, uuid, character varying, timestamp with time zone, character varying, boolean); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_edit_file(IN s_id uuid, IN f_id uuid, IN f_mime_name character varying DEFAULT NULL::character varying, IN f_datetime timestamp with time zone DEFAULT NULL::timestamp with time zone, IN f_notes character varying DEFAULT NULL::character varying, IN f_is_private boolean DEFAULT NULL::boolean)
LANGUAGE plpgsql SECURITY DEFINER
AS $$DECLARE
u_id uuid;
m_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT f.is_private OR f.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM files f WHERE f.id=f_id)
THEN RAISE 'Not allowed'; END IF;
IF f_mime_name IS NOT NULL THEN
SELECT m.id FROM mime m WHERE m.name=f_mime_name INTO m_id;
IF m_id IS NULL THEN RAISE 'Unsupported MIME'; END IF;
END IF;
UPDATE files SET
mime_id = coalesce(m_id, mime_id),
datetime = coalesce(f_datetime, datetime),
notes = coalesce(f_notes, notes),
is_private = coalesce(f_is_private, is_private)
WHERE id=f_id;
END;
$$;
ALTER PROCEDURE public.tfm_edit_file(IN s_id uuid, IN f_id uuid, IN f_mime_name character varying, IN f_datetime timestamp with time zone, IN f_notes character varying, IN f_is_private boolean) OWNER TO hiko;
--
-- TOC entry 311 (class 1255 OID 17501)
-- Name: tfm_edit_pool(uuid, uuid, character varying, character varying, uuid, boolean); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_edit_pool(IN s_id uuid, IN p_id uuid, IN p_name character varying DEFAULT NULL::character varying, IN p_notes character varying DEFAULT NULL::character varying, IN p_parent_id uuid DEFAULT NULL::uuid, IN p_is_private boolean DEFAULT NULL::boolean)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT p.is_private OR p.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM pools p WHERE p.id=p_id)
THEN RAISE 'Not allowed'; END IF;
UPDATE pools p SET
p.name = coalesce(p_name, p.name),
p.notes = coalesce(p_notes, p.notes),
p.parent_id = CASE WHEN p_parent_id=uuid_nil() THEN NULL ELSE coalesce(p_parent_id, p.parent_id) END,
p.is_private = coalesce(p_is_private, p.is_private)
WHERE p.id=p_id;
END;
$$;
ALTER PROCEDURE public.tfm_edit_pool(IN s_id uuid, IN p_id uuid, IN p_name character varying, IN p_notes character varying, IN p_parent_id uuid, IN p_is_private boolean) OWNER TO hiko;
--
-- TOC entry 320 (class 1255 OID 17502)
-- Name: tfm_edit_tag(uuid, uuid, character varying, character varying, character, uuid, boolean); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_edit_tag(IN s_id uuid, IN t_id uuid, IN t_name character varying DEFAULT NULL::character varying, IN t_notes character varying DEFAULT NULL::character varying, IN t_color character DEFAULT NULL::bpchar, IN t_category_id uuid DEFAULT NULL::uuid, IN t_is_private boolean DEFAULT NULL::boolean)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT t.is_private OR t.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM tags t WHERE t.id=t_id)
THEN RAISE 'Not allowed'; END IF;
UPDATE tags SET
name = coalesce(t_name, name),
notes = coalesce(t_notes, notes),
color = CASE WHEN t_color=''::character THEN NULL ELSE coalesce(t_color, color) END,
category_id = CASE WHEN t_category_id=uuid_nil() THEN NULL ELSE coalesce(t_category_id, category_id) END,
is_private = coalesce(t_is_private, is_private)
WHERE id=t_id;
END;
$$;
ALTER PROCEDURE public.tfm_edit_tag(IN s_id uuid, IN t_id uuid, IN t_name character varying, IN t_notes character varying, IN t_color character, IN t_category_id uuid, IN t_is_private boolean) OWNER TO hiko;
SET default_tablespace = '';
SET default_table_access_method = heap;
--
-- TOC entry 220 (class 1259 OID 17064)
-- Name: autotags; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.autotags (
parent_id uuid NOT NULL,
child_id uuid NOT NULL,
is_active boolean DEFAULT true NOT NULL
);
ALTER TABLE public.autotags OWNER TO hiko;
--
-- TOC entry 228 (class 1259 OID 17474)
-- Name: v_autotags; Type: VIEW; Schema: public; Owner: hiko
--
CREATE VIEW public.v_autotags AS
SELECT a.child_id,
a.parent_id,
a.is_active
FROM public.autotags a;
ALTER VIEW public.v_autotags OWNER TO hiko;
--
-- TOC entry 307 (class 1255 OID 17478)
-- Name: tfm_get_autotags(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_autotags(s_id uuid) RETURNS SETOF public.v_autotags
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
u_is_admin boolean;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
SELECT u.is_admin FROM users u WHERE u.id=u_id INTO u_is_admin;
RETURN QUERY
SELECT a.* FROM v_autotags a
JOIN tags tc ON a.child_id=tc.id AND (NOT tc.is_private OR tc.creator_id=u_id OR u_is_admin)
JOIN tags tp ON a.parent_id=tp.id AND (NOT tp.is_private OR tp.creator_id=u_id OR u_is_admin);
END;
$$;
ALTER FUNCTION public.tfm_get_autotags(s_id uuid) OWNER TO hiko;
--
-- TOC entry 331 (class 1255 OID 139011)
-- Name: uuid_v7(timestamp with time zone); Type: FUNCTION; Schema: public; Owner: hiko
--
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
$$;
ALTER FUNCTION public.uuid_v7(cts timestamp with time zone) OWNER TO hiko;
--
-- TOC entry 222 (class 1259 OID 17164)
-- Name: categories; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.categories (
id uuid DEFAULT public.uuid_v7() NOT NULL,
name character varying(256) NOT NULL,
notes character varying(1024) DEFAULT ''::character varying NOT NULL,
color character(6),
created timestamp with time zone DEFAULT statement_timestamp() NOT NULL,
creator_id uuid NOT NULL,
is_private boolean DEFAULT true NOT NULL
);
ALTER TABLE public.categories OWNER TO hiko;
--
-- TOC entry 213 (class 1259 OID 16523)
-- Name: users; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.users (
id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
name character varying(32) NOT NULL,
password text NOT NULL,
is_admin boolean DEFAULT false NOT NULL,
can_edit boolean DEFAULT false NOT NULL
);
ALTER TABLE public.users OWNER TO hiko;
--
-- TOC entry 226 (class 1259 OID 17441)
-- Name: v_categories; Type: VIEW; Schema: public; Owner: hiko
--
CREATE VIEW public.v_categories AS
SELECT c.id,
c.name,
c.notes,
c.color,
c.created,
c.creator_id,
u.name AS creator_name,
c.is_private
FROM (public.categories c
JOIN public.users u ON ((c.creator_id = u.id)));
ALTER VIEW public.v_categories OWNER TO hiko;
--
-- TOC entry 299 (class 1255 OID 17456)
-- Name: tfm_get_categories(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_categories(s_id uuid) RETURNS SETOF public.v_categories
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RETURN QUERY
SELECT c.* FROM v_categories c
WHERE NOT c.is_private OR c.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_categories(s_id uuid) OWNER TO hiko;
--
-- TOC entry 328 (class 1255 OID 28865)
-- Name: tfm_get_files(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_files(s_id uuid) RETURNS SETOF public.file
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RETURN QUERY
SELECT
f.id,
f.mime_id,
m.name AS mime_name,
m.extension,
f.orig_name,
f.datetime,
f.notes,
f.created,
f.creator_id,
u.name AS creator_name,
f.is_private
FROM files f
JOIN mime m ON f.mime_id = m.id
JOIN users u ON f.creator_id = u.id
WHERE NOT f.is_private OR f.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_files(s_id uuid) OWNER TO hiko;
--
-- TOC entry 288 (class 1255 OID 17615)
-- Name: tfm_get_files_1(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_files_1(s_id uuid) RETURNS SETOF record
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RETURN QUERY
SELECT f.* FROM v_files f
WHERE NOT f.is_private OR f.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_files_1(s_id uuid) OWNER TO hiko;
--
-- TOC entry 329 (class 1255 OID 28866)
-- Name: tfm_get_files_by_filter(uuid, character varying[]); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_files_by_filter(s_id uuid, filters character varying[] DEFAULT NULL::character varying[]) RETURNS SETOF public.file
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
query_text text = 'SELECT * FROM (SELECT DISTINCT f.*, array_agg(ft.tag_id) OVER (PARTITION BY f.id) AS tags_list FROM tfm_get_files(' || quote_literal(s_id) || ') f ' ||
'LEFT JOIN file_tag ft ON ft.file_id=f.id) _f ' ||
'WHERE';
_filter character varying;
tmp text;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RAISE NOTICE '%', filters IS NULL;
IF filters IS NULL OR cardinality(filters) = 0 THEN
RETURN QUERY SELECT * FROM tfm_get_files(s_id);
RETURN;
END IF;
-- there was ',tags_list' in the end of columns to select
query_text := 'SELECT id,mime_id,mime_name,extension,orig_name,datetime,notes,created,creator_id,creator_name,is_private FROM (SELECT DISTINCT f.*, array_agg(ft.tag_id) OVER (PARTITION BY f.id) AS tags_list FROM tfm_get_files(' || quote_literal(s_id) || ') f ' ||
'LEFT JOIN file_tag ft ON ft.file_id=f.id) _f ' ||
'WHERE';
FOREACH _filter IN ARRAY filters LOOP
IF _filter IN ('(', ')') THEN
query_text := query_text || _filter;
ELSIF _filter='&' THEN
query_text := query_text || ' AND';
ELSIF _filter='|' THEN
query_text := query_text || ' OR';
ELSIF _filter='!' THEN
query_text := query_text || ' NOT';
ELSIF _filter='t=' || uuid_nil() THEN
query_text := query_text || ' (tags_list=array[NULL]::uuid[] OR ''d6d8129a-984d-4451-8c83-d04523ced8a8''=ANY(tags_list))';
ELSIF _filter LIKE 't=%' THEN
query_text := query_text || ' ' || quote_literal(substring(_filter, 3)) || '=ANY(tags_list)';
ELSIF _filter LIKE 'm=%' THEN
query_text := query_text || ' mime_id=' || quote_literal(substring(_filter, 3));
ELSIF _filter LIKE 'm~%' THEN
query_text := query_text || ' mime_name LIKE ' || quote_literal(substring(_filter, 3));
ELSE
RAISE 'Invalid condition';
END IF;
END LOOP;
RETURN QUERY EXECUTE query_text;
END;
$$;
ALTER FUNCTION public.tfm_get_files_by_filter(s_id uuid, filters character varying[]) OWNER TO hiko;
--
-- TOC entry 223 (class 1259 OID 17186)
-- Name: files; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.files (
id uuid DEFAULT public.uuid_v7() NOT NULL,
mime_id uuid NOT NULL,
datetime timestamp with time zone DEFAULT statement_timestamp() NOT NULL,
notes character varying(1024) DEFAULT ''::character varying NOT NULL,
created timestamp with time zone DEFAULT statement_timestamp() NOT NULL,
creator_id uuid NOT NULL,
is_private boolean DEFAULT true NOT NULL,
orig_name character varying(256),
metadata jsonb
);
ALTER TABLE public.files OWNER TO hiko;
--
-- TOC entry 3603 (class 0 OID 0)
-- Dependencies: 223
-- Name: COLUMN files.orig_name; Type: COMMENT; Schema: public; Owner: hiko
--
COMMENT ON COLUMN public.files.orig_name IS 'Original filename';
--
-- TOC entry 215 (class 1259 OID 16543)
-- Name: mime; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.mime (
id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
name character varying(127) NOT NULL,
extension character varying(16) NOT NULL
);
ALTER TABLE public.mime OWNER TO hiko;
--
-- TOC entry 230 (class 1259 OID 17670)
-- Name: v_files; Type: VIEW; Schema: public; Owner: hiko
--
CREATE VIEW public.v_files AS
SELECT f.id,
f.mime_id,
m.name AS mime_name,
m.extension,
f.datetime,
f.notes,
f.created,
f.creator_id,
u.name AS creator_name,
f.is_private
FROM ((public.files f
JOIN public.mime m ON ((f.mime_id = m.id)))
JOIN public.users u ON ((f.creator_id = u.id)));
ALTER VIEW public.v_files OWNER TO hiko;
--
-- TOC entry 324 (class 1255 OID 17676)
-- Name: tfm_get_files_by_pool(uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_files_by_pool(s_id uuid, p_id uuid) RETURNS SETOF public.v_files
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
u_is_admin boolean;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
SELECT u.is_admin FROM users u WHERE u.id=u_id INTO u_is_admin;
PERFORM FROM pools p WHERE p.id=p_id AND (NOT p.is_private OR p.creator_id=u_id OR u_is_admin);
IF NOT FOUND THEN RAISE 'Invalid pool id'; END IF;
RETURN QUERY
SELECT f.* FROM v_files f
JOIN file_pool fp ON f.id=fp.file_id AND fp.pool_id=p_id
WHERE NOT f.is_private OR f.creator_id=u_id OR u_is_admin;
END;
$$;
ALTER FUNCTION public.tfm_get_files_by_pool(s_id uuid, p_id uuid) OWNER TO hiko;
--
-- TOC entry 325 (class 1255 OID 17677)
-- Name: tfm_get_files_by_tag(uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_files_by_tag(s_id uuid, t_id uuid) RETURNS SETOF public.v_files
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
PERFORM FROM tags t WHERE t.id=t_id;
IF NOT FOUND THEN RAISE 'Invalid tag id'; END IF;
RETURN QUERY
SELECT f.* FROM v_files f
JOIN file_tag ft ON f.id=ft.file_id AND ft.tag_id=t_id
WHERE NOT f.is_private OR f.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_files_by_tag(s_id uuid, t_id uuid) OWNER TO hiko;
--
-- TOC entry 317 (class 1255 OID 17517)
-- Name: tfm_get_my_file_views(uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_my_file_views(s_id uuid, f_id uuid DEFAULT NULL::uuid) RETURNS TABLE(file_id uuid, datetime timestamp with time zone)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RETURN QUERY
SELECT fv.file_id, fv.datetime FROM file_views fv
WHERE fv.user_id=u_id AND (f_id IS NULL OR fv.file_id=f_id);
END;
$$;
ALTER FUNCTION public.tfm_get_my_file_views(s_id uuid, f_id uuid) OWNER TO hiko;
--
-- TOC entry 214 (class 1259 OID 16534)
-- Name: sessions; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.sessions (
id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
user_id uuid NOT NULL,
user_agent_id uuid NOT NULL,
started timestamp with time zone DEFAULT statement_timestamp() NOT NULL,
expires timestamp with time zone,
last_seen timestamp with time zone
);
ALTER TABLE public.sessions OWNER TO hiko;
--
-- TOC entry 218 (class 1259 OID 16820)
-- Name: user_agents; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.user_agents (
id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
name character varying(64) NOT NULL
);
ALTER TABLE public.user_agents OWNER TO hiko;
--
-- TOC entry 229 (class 1259 OID 17508)
-- Name: v_sessions; Type: VIEW; Schema: public; Owner: hiko
--
CREATE VIEW public.v_sessions AS
SELECT s.id,
s.user_id,
u.name AS user_name,
s.user_agent_id,
ua.name AS user_agent_name,
s.started,
s.expires,
s.last_seen
FROM ((public.sessions s
JOIN public.users u ON ((s.user_id = u.id)))
JOIN public.user_agents ua ON ((s.user_agent_id = ua.id)));
ALTER VIEW public.v_sessions OWNER TO hiko;
--
-- TOC entry 300 (class 1255 OID 17512)
-- Name: tfm_get_my_sessions(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_my_sessions(s_id uuid) RETURNS SETOF public.v_sessions
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RETURN QUERY
SELECT s.* FROM v_sessions s
WHERE s.user_id=u_id;
END;
$$;
ALTER FUNCTION public.tfm_get_my_sessions(s_id uuid) OWNER TO hiko;
--
-- TOC entry 221 (class 1259 OID 17125)
-- Name: tags; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.tags (
id uuid DEFAULT public.uuid_v7() NOT NULL,
name character varying(256) NOT NULL,
notes character varying(1024) DEFAULT ''::character varying NOT NULL,
color character(6),
category_id uuid,
created timestamp with time zone DEFAULT statement_timestamp() NOT NULL,
creator_id uuid NOT NULL,
is_private boolean DEFAULT true NOT NULL
);
ALTER TABLE public.tags OWNER TO hiko;
--
-- TOC entry 225 (class 1259 OID 17432)
-- Name: v_tags; Type: VIEW; Schema: public; Owner: hiko
--
CREATE VIEW public.v_tags AS
SELECT t.id,
t.name,
t.notes,
t.color,
t.category_id,
c.name AS category_name,
c.color AS category_color,
t.created,
t.creator_id,
u.name AS creator_name,
t.is_private
FROM ((public.tags t
LEFT JOIN public.categories c ON ((t.category_id = c.id)))
JOIN public.users u ON ((t.creator_id = u.id)));
ALTER VIEW public.v_tags OWNER TO hiko;
--
-- TOC entry 321 (class 1255 OID 17538)
-- Name: tfm_get_parent_tags(uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_parent_tags(s_id uuid, t_id uuid) RETURNS SETOF public.v_tags
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
PERFORM FROM tags t WHERE t.id=t_id;
IF NOT FOUND THEN RAISE 'Invalid tag id'; END IF;
RETURN QUERY
SELECT t.* FROM v_tags t
JOIN autotags a ON t.id=a.parent_id AND a.child_id=t_id
WHERE NOT t.is_private OR t.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_parent_tags(s_id uuid, t_id uuid) OWNER TO hiko;
--
-- TOC entry 224 (class 1259 OID 17314)
-- Name: pools; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.pools (
id uuid DEFAULT public.uuid_generate_v4() NOT NULL,
name character varying(256) NOT NULL,
notes character varying(1024) DEFAULT ''::character varying NOT NULL,
created timestamp with time zone DEFAULT statement_timestamp() NOT NULL,
parent_id uuid,
creator_id uuid NOT NULL,
is_private boolean DEFAULT true NOT NULL
);
ALTER TABLE public.pools OWNER TO hiko;
--
-- TOC entry 227 (class 1259 OID 17445)
-- Name: v_pools; Type: VIEW; Schema: public; Owner: hiko
--
CREATE VIEW public.v_pools AS
SELECT p.id,
p.name,
p.notes,
p.created,
p.parent_id,
pp.name AS parent_name,
p.creator_id,
u.name AS creator_name,
p.is_private
FROM ((public.pools p
LEFT JOIN public.pools pp ON ((p.parent_id = pp.id)))
JOIN public.users u ON ((p.creator_id = u.id)));
ALTER VIEW public.v_pools OWNER TO hiko;
--
-- TOC entry 303 (class 1255 OID 17514)
-- Name: tfm_get_pools(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_pools(s_id uuid) RETURNS SETOF public.v_pools
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RETURN QUERY
SELECT p.* FROM v_pools p
WHERE NOT p.is_private OR p.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_pools(s_id uuid) OWNER TO hiko;
--
-- TOC entry 304 (class 1255 OID 17515)
-- Name: tfm_get_tags(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_tags(s_id uuid) RETURNS SETOF public.v_tags
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
RETURN QUERY
SELECT t.* FROM v_tags t
WHERE NOT t.is_private OR t.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_tags(s_id uuid) OWNER TO hiko;
--
-- TOC entry 316 (class 1255 OID 17516)
-- Name: tfm_get_tags_by_file(uuid, uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_get_tags_by_file(s_id uuid, f_id uuid) RETURNS SETOF public.v_tags
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
PERFORM FROM files f WHERE f.id=f_id;
IF NOT FOUND THEN RAISE 'Invalid file id'; END IF;
RETURN QUERY
SELECT t.* FROM v_tags t
JOIN file_tag ft ON t.id=ft.tag_id AND ft.file_id=f_id
WHERE NOT t.is_private OR t.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id);
END;
$$;
ALTER FUNCTION public.tfm_get_tags_by_file(s_id uuid, f_id uuid) OWNER TO hiko;
--
-- TOC entry 294 (class 1255 OID 17484)
-- Name: tfm_remove_autotag(uuid, uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_remove_autotag(IN s_id uuid, IN tc_id uuid, IN tp_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
DELETE FROM autotags a WHERE a.child_id=tc_id AND a.parent_id=tp_id;
END;
$$;
ALTER PROCEDURE public.tfm_remove_autotag(IN s_id uuid, IN tc_id uuid, IN tp_id uuid) OWNER TO hiko;
--
-- TOC entry 296 (class 1255 OID 17481)
-- Name: tfm_remove_category(uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_remove_category(IN s_id uuid, IN c_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT c.is_private OR c.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM categories c WHERE c.id=c_id)
THEN RAISE 'Not allowed'; END IF;
DELETE FROM categories c WHERE c.id=c_id;
END;
$$;
ALTER PROCEDURE public.tfm_remove_category(IN s_id uuid, IN c_id uuid) OWNER TO hiko;
--
-- TOC entry 310 (class 1255 OID 17479)
-- Name: tfm_remove_file(uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_remove_file(IN s_id uuid, IN f_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT f.is_private OR f.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM files f WHERE f.id=f_id)
THEN RAISE 'Not allowed'; END IF;
DELETE FROM files f WHERE f.id=f_id;
END;
$$;
ALTER PROCEDURE public.tfm_remove_file(IN s_id uuid, IN f_id uuid) OWNER TO hiko;
--
-- TOC entry 308 (class 1255 OID 17485)
-- Name: tfm_remove_file_to_pool(uuid, uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_remove_file_to_pool(IN s_id uuid, IN f_id uuid, IN p_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT p.is_private OR p.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM pools p WHERE p.id=p_id)
THEN RAISE 'Not allowed'; END IF;
DELETE FROM file_pool fp WHERE fp.file_id=f_id AND fp.pool_id=p_id;
END;
$$;
ALTER PROCEDURE public.tfm_remove_file_to_pool(IN s_id uuid, IN f_id uuid, IN p_id uuid) OWNER TO hiko;
--
-- TOC entry 293 (class 1255 OID 17483)
-- Name: tfm_remove_file_to_tag(uuid, uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_remove_file_to_tag(IN s_id uuid, IN f_id uuid, IN t_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id) THEN RAISE 'Not allowed'; END IF;
DELETE FROM file_tag ft WHERE ft.file_id=f_id AND ft.tag_id=t_id;
END;
$$;
ALTER PROCEDURE public.tfm_remove_file_to_tag(IN s_id uuid, IN f_id uuid, IN t_id uuid) OWNER TO hiko;
--
-- TOC entry 297 (class 1255 OID 17482)
-- Name: tfm_remove_pool(uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_remove_pool(IN s_id uuid, IN p_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT p.is_private OR p.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM pools p WHERE p.id=p_id)
THEN RAISE 'Not allowed'; END IF;
DELETE FROM pools p WHERE p.id=p_id;
END;
$$;
ALTER PROCEDURE public.tfm_remove_pool(IN s_id uuid, IN p_id uuid) OWNER TO hiko;
--
-- TOC entry 295 (class 1255 OID 17480)
-- Name: tfm_remove_tag(uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_remove_tag(IN s_id uuid, IN t_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
IF
NOT (SELECT u.can_edit FROM users u WHERE u.id=u_id)
OR
NOT (SELECT (NOT t.is_private OR t.creator_id=u_id OR (SELECT u.is_admin FROM users u WHERE u.id=u_id)) FROM tags t WHERE t.id=t_id)
THEN RAISE 'Not allowed'; END IF;
DELETE FROM tags t WHERE t.id=t_id;
END;
$$;
ALTER PROCEDURE public.tfm_remove_tag(IN s_id uuid, IN t_id uuid) OWNER TO hiko;
--
-- TOC entry 291 (class 1255 OID 16848)
-- Name: tfm_session_request(uuid, text); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_session_request(u_id uuid, u_agent text, OUT s_id uuid) RETURNS uuid
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
ua_id UUID;
BEGIN
PERFORM FROM users WHERE id=u_id;
IF NOT FOUND THEN RAISE 'User not exists'; END IF;
SELECT id FROM user_agents WHERE name=u_agent INTO ua_id;
IF NOT FOUND THEN RAISE 'Unsupported user agent'; END IF;
INSERT INTO sessions(user_id, user_agent_id) VALUES(u_id, ua_id) RETURNING id INTO s_id;
END;
$$;
ALTER FUNCTION public.tfm_session_request(u_id uuid, u_agent text, OUT s_id uuid) OWNER TO hiko;
--
-- TOC entry 313 (class 1255 OID 17503)
-- Name: tfm_session_terminate(uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_session_terminate(IN s_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
DELETE FROM sessions s WHERE s.id=s_id;
END;
$$;
ALTER PROCEDURE public.tfm_session_terminate(IN s_id uuid) OWNER TO hiko;
--
-- TOC entry 314 (class 1255 OID 17504)
-- Name: tfm_session_username(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_session_username(s_id uuid) RETURNS character varying
LANGUAGE sql SECURITY DEFINER
AS $$
SELECT u.name FROM users u JOIN sessions s ON s.user_id=u.id;
$$;
ALTER FUNCTION public.tfm_session_username(s_id uuid) OWNER TO hiko;
--
-- TOC entry 326 (class 1255 OID 26730)
-- Name: tfm_session_validate(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_session_validate(s_id uuid) RETURNS uuid
LANGUAGE sql SECURITY DEFINER PARALLEL SAFE
AS $$
UPDATE sessions SET last_seen=statement_timestamp() WHERE id=s_id RETURNING user_id;
$$;
ALTER FUNCTION public.tfm_session_validate(s_id uuid) OWNER TO hiko;
--
-- TOC entry 292 (class 1255 OID 16801)
-- Name: tfm_user_auth(character varying, text); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_user_auth(u_name character varying, u_password text) RETURNS uuid
LANGUAGE plpgsql STABLE SECURITY DEFINER
AS $$
DECLARE
selected_user users%ROWTYPE;
BEGIN
SELECT * FROM users
WHERE users.name=u_name
INTO selected_user;
IF selected_user.password=crypt(u_password, selected_user.password) THEN
RETURN selected_user.id;
END IF;
RAISE 'Authorization failed';
END;
$$;
ALTER FUNCTION public.tfm_user_auth(u_name character varying, u_password text) OWNER TO hiko;
--
-- TOC entry 3615 (class 0 OID 0)
-- Dependencies: 292
-- Name: FUNCTION tfm_user_auth(u_name character varying, u_password text); Type: COMMENT; Schema: public; Owner: hiko
--
COMMENT ON FUNCTION public.tfm_user_auth(u_name character varying, u_password text) IS 'Returns user UUID if username and password are valid otherwise nil UUID.';
--
-- TOC entry 306 (class 1255 OID 17451)
-- Name: tfm_user_create(text, text, boolean, boolean); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_user_create(u_name text, u_password text, u_is_admin boolean DEFAULT false, u_can_edit boolean DEFAULT false, OUT u_id uuid) RETURNS uuid
LANGUAGE plpgsql SECURITY DEFINER
AS $$
BEGIN
INSERT INTO users(name, password, is_admin, can_edit) VALUES(u_name, crypt(u_password, gen_salt('bf')), u_is_admin, u_can_edit) RETURNING id INTO u_id;
END;
$$;
ALTER FUNCTION public.tfm_user_create(u_name text, u_password text, u_is_admin boolean, u_can_edit boolean, OUT u_id uuid) OWNER TO hiko;
--
-- TOC entry 327 (class 1255 OID 27477)
-- Name: tfm_user_get_info(uuid); Type: FUNCTION; Schema: public; Owner: hiko
--
CREATE FUNCTION public.tfm_user_get_info(s_id uuid, OUT user_info public.users) RETURNS public.users
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
SELECT * FROM users WHERE id=u_id INTO user_info;
END;
$$;
ALTER FUNCTION public.tfm_user_get_info(s_id uuid, OUT user_info public.users) OWNER TO hiko;
--
-- TOC entry 302 (class 1255 OID 17420)
-- Name: tfm_view_file(uuid, uuid); Type: PROCEDURE; Schema: public; Owner: hiko
--
CREATE PROCEDURE public.tfm_view_file(IN s_id uuid, IN f_id uuid)
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE u_id uuid;
BEGIN
SELECT tfm_session_validate(s_id) INTO u_id;
IF u_id IS NULL THEN RAISE 'Invalid session id'; END IF;
PERFORM FROM files f WHERE f.id=f_id AND (NOT f.is_private OR f.creator_id=u_id);
IF NOT FOUND THEN RAISE 'Invalid file id'; END IF;
INSERT INTO file_views(file_id, user_id) VALUES(f_id, u_id);
END;
$$;
ALTER PROCEDURE public.tfm_view_file(IN s_id uuid, IN f_id uuid) OWNER TO hiko;
--
-- TOC entry 232 (class 1259 OID 34878)
-- Name: acl; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.acl (
user_id uuid NOT NULL,
object_id uuid NOT NULL,
read boolean DEFAULT true NOT NULL,
write boolean DEFAULT false NOT NULL
);
ALTER TABLE public.acl OWNER TO hiko;
--
-- TOC entry 217 (class 1259 OID 16610)
-- Name: file_pool; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.file_pool (
file_id uuid NOT NULL,
pool_id uuid NOT NULL
);
ALTER TABLE public.file_pool OWNER TO hiko;
--
-- TOC entry 216 (class 1259 OID 16605)
-- Name: file_tag; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.file_tag (
file_id uuid NOT NULL,
tag_id uuid NOT NULL
);
ALTER TABLE public.file_tag OWNER TO hiko;
--
-- TOC entry 219 (class 1259 OID 17032)
-- Name: file_views; Type: TABLE; Schema: public; Owner: hiko
--
CREATE TABLE public.file_views (
file_id uuid NOT NULL,
datetime timestamp with time zone DEFAULT statement_timestamp() NOT NULL,
user_id uuid NOT NULL
);
ALTER TABLE public.file_views OWNER TO hiko;
--
-- TOC entry 3366 (class 2606 OID 17357)
-- Name: categories chk__categories__color__hex; Type: CHECK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE public.categories
ADD CONSTRAINT chk__categories__color__hex CHECK (((color IS NULL) OR (color ~* '^[A-Fa-f0-9]{6}$'::text))) NOT VALID;
--
-- TOC entry 3621 (class 0 OID 0)
-- Dependencies: 3366
-- Name: CONSTRAINT chk__categories__color__hex ON categories; Type: COMMENT; Schema: public; Owner: hiko
--
COMMENT ON CONSTRAINT chk__categories__color__hex ON public.categories IS 'Check if `color` is a valid HEX color';
--
-- TOC entry 3365 (class 2606 OID 17356)
-- Name: tags chk__tags___color__hex; Type: CHECK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE public.tags
ADD CONSTRAINT chk__tags___color__hex CHECK (((color IS NULL) OR (color ~* '^[A-Fa-f0-9]{6}$'::text))) NOT VALID;
--
-- TOC entry 3622 (class 0 OID 0)
-- Dependencies: 3365
-- Name: CONSTRAINT chk__tags___color__hex ON tags; Type: COMMENT; Schema: public; Owner: hiko
--
COMMENT ON CONSTRAINT chk__tags___color__hex ON public.tags IS 'Check if `color` is a valid HEX color';
--
-- TOC entry 3426 (class 2606 OID 34884)
-- Name: acl prm__acl; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.acl
ADD CONSTRAINT prm__acl PRIMARY KEY (user_id, object_id);
--
-- TOC entry 3399 (class 2606 OID 17070)
-- Name: autotags prm__autotags; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.autotags
ADD CONSTRAINT prm__autotags PRIMARY KEY (child_id, parent_id);
--
-- TOC entry 3410 (class 2606 OID 17173)
-- Name: categories prm__categories; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT prm__categories PRIMARY KEY (id);
--
-- TOC entry 3386 (class 2606 OID 16614)
-- Name: file_pool prm__file_pool; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_pool
ADD CONSTRAINT prm__file_pool PRIMARY KEY (file_id, pool_id);
--
-- TOC entry 3382 (class 2606 OID 16609)
-- Name: file_tag prm__file_tag; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_tag
ADD CONSTRAINT prm__file_tag PRIMARY KEY (file_id, tag_id);
--
-- TOC entry 3395 (class 2606 OID 17037)
-- Name: file_views prm__file_views; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_views
ADD CONSTRAINT prm__file_views PRIMARY KEY (file_id, datetime, user_id);
--
-- TOC entry 3418 (class 2606 OID 17196)
-- Name: files prm__files; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.files
ADD CONSTRAINT prm__files PRIMARY KEY (id);
--
-- TOC entry 3376 (class 2606 OID 16548)
-- Name: mime prm__mime; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.mime
ADD CONSTRAINT prm__mime PRIMARY KEY (id);
--
-- TOC entry 3422 (class 2606 OID 17323)
-- Name: pools prm__pools; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.pools
ADD CONSTRAINT prm__pools PRIMARY KEY (id);
--
-- TOC entry 3374 (class 2606 OID 16542)
-- Name: sessions prm__sessions; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.sessions
ADD CONSTRAINT prm__sessions PRIMARY KEY (id);
--
-- TOC entry 3404 (class 2606 OID 17135)
-- Name: tags prm__tags; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.tags
ADD CONSTRAINT prm__tags PRIMARY KEY (id);
--
-- TOC entry 3388 (class 2606 OID 16824)
-- Name: user_agents prm__user_agents; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.user_agents
ADD CONSTRAINT prm__user_agents PRIMARY KEY (id);
--
-- TOC entry 3368 (class 2606 OID 16531)
-- Name: users prm__users; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.users
ADD CONSTRAINT prm__users PRIMARY KEY (id);
--
-- TOC entry 3412 (class 2606 OID 17175)
-- Name: categories uni__categories__name; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT uni__categories__name UNIQUE (name);
--
-- TOC entry 3378 (class 2606 OID 16550)
-- Name: mime uni__mime__name; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.mime
ADD CONSTRAINT uni__mime__name UNIQUE (name);
--
-- TOC entry 3424 (class 2606 OID 17325)
-- Name: pools uni__pools__name; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.pools
ADD CONSTRAINT uni__pools__name UNIQUE (name);
--
-- TOC entry 3406 (class 2606 OID 17137)
-- Name: tags uni__tags__name; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.tags
ADD CONSTRAINT uni__tags__name UNIQUE (name);
--
-- TOC entry 3390 (class 2606 OID 16826)
-- Name: user_agents uni__user_agents__name; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.user_agents
ADD CONSTRAINT uni__user_agents__name UNIQUE (name);
--
-- TOC entry 3370 (class 2606 OID 16533)
-- Name: users uni__users__name; Type: CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.users
ADD CONSTRAINT uni__users__name UNIQUE (name);
--
-- TOC entry 3396 (class 1259 OID 27375)
-- Name: idx__autotags__child_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__autotags__child_id ON public.autotags USING hash (child_id);
--
-- TOC entry 3397 (class 1259 OID 27376)
-- Name: idx__autotags__parent_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__autotags__parent_id ON public.autotags USING hash (parent_id);
--
-- TOC entry 3407 (class 1259 OID 27389)
-- Name: idx__categories__created; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__categories__created ON public.categories USING btree (created DESC NULLS LAST);
--
-- TOC entry 3408 (class 1259 OID 27390)
-- Name: idx__categories__creator_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__categories__creator_id ON public.categories USING hash (creator_id);
--
-- TOC entry 3383 (class 1259 OID 27379)
-- Name: idx__file_pool__file_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__file_pool__file_id ON public.file_pool USING hash (file_id);
--
-- TOC entry 3384 (class 1259 OID 27380)
-- Name: idx__file_pool__pool_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__file_pool__pool_id ON public.file_pool USING hash (pool_id);
--
-- TOC entry 3379 (class 1259 OID 27377)
-- Name: idx__file_tag__file_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__file_tag__file_id ON public.file_tag USING hash (file_id);
--
-- TOC entry 3380 (class 1259 OID 27378)
-- Name: idx__file_tag__tag_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__file_tag__tag_id ON public.file_tag USING hash (tag_id);
--
-- TOC entry 3391 (class 1259 OID 27382)
-- Name: idx__file_views__datetime; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__file_views__datetime ON public.file_views USING btree (datetime DESC NULLS LAST);
--
-- TOC entry 3392 (class 1259 OID 27381)
-- Name: idx__file_views__file_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__file_views__file_id ON public.file_views USING hash (file_id);
--
-- TOC entry 3393 (class 1259 OID 27391)
-- Name: idx__file_views__user_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__file_views__user_id ON public.file_views USING hash (user_id);
--
-- TOC entry 3413 (class 1259 OID 27385)
-- Name: idx__files__created; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__files__created ON public.files USING btree (created DESC NULLS LAST);
--
-- TOC entry 3414 (class 1259 OID 27392)
-- Name: idx__files__creator_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__files__creator_id ON public.files USING hash (creator_id);
--
-- TOC entry 3415 (class 1259 OID 27384)
-- Name: idx__files__datetime; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__files__datetime ON public.files USING btree (datetime DESC NULLS LAST);
--
-- TOC entry 3416 (class 1259 OID 27383)
-- Name: idx__files__mime_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__files__mime_id ON public.files USING hash (mime_id);
--
-- TOC entry 3419 (class 1259 OID 27386)
-- Name: idx__pools__created; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__pools__created ON public.pools USING btree (created DESC NULLS LAST);
--
-- TOC entry 3420 (class 1259 OID 27393)
-- Name: idx__pools__creator_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__pools__creator_id ON public.pools USING hash (creator_id);
--
-- TOC entry 3371 (class 1259 OID 63917)
-- Name: idx__sessions__user_agent_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__sessions__user_agent_id ON public.sessions USING hash (user_agent_id);
--
-- TOC entry 3372 (class 1259 OID 63916)
-- Name: idx__sessions__user_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__sessions__user_id ON public.sessions USING hash (user_id);
--
-- TOC entry 3400 (class 1259 OID 27388)
-- Name: idx__tags__category_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__tags__category_id ON public.tags USING hash (category_id);
--
-- TOC entry 3401 (class 1259 OID 27387)
-- Name: idx__tags__created; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__tags__created ON public.tags USING btree (created DESC NULLS LAST);
--
-- TOC entry 3402 (class 1259 OID 63915)
-- Name: idx__tags__creator_id; Type: INDEX; Schema: public; Owner: hiko
--
CREATE INDEX idx__tags__creator_id ON public.tags USING hash (creator_id);
--
-- TOC entry 3444 (class 2606 OID 34885)
-- Name: acl frn__acl__user_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.acl
ADD CONSTRAINT frn__acl__user_id FOREIGN KEY (user_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3435 (class 2606 OID 17159)
-- Name: autotags frn__autotags__child_id_; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.autotags
ADD CONSTRAINT frn__autotags__child_id_ FOREIGN KEY (child_id) REFERENCES public.tags(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3436 (class 2606 OID 17154)
-- Name: autotags frn__autotags__parent_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.autotags
ADD CONSTRAINT frn__autotags__parent_id FOREIGN KEY (parent_id) REFERENCES public.tags(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3439 (class 2606 OID 17176)
-- Name: categories frn__categories__creator_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.categories
ADD CONSTRAINT frn__categories__creator_id FOREIGN KEY (creator_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE RESTRICT;
--
-- TOC entry 3431 (class 2606 OID 17222)
-- Name: file_pool frn__file_pool__file_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_pool
ADD CONSTRAINT frn__file_pool__file_id FOREIGN KEY (file_id) REFERENCES public.files(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3432 (class 2606 OID 17336)
-- Name: file_pool frn__file_pool__pool_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_pool
ADD CONSTRAINT frn__file_pool__pool_id FOREIGN KEY (pool_id) REFERENCES public.pools(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3429 (class 2606 OID 17212)
-- Name: file_tag frn__file_tag__file_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_tag
ADD CONSTRAINT frn__file_tag__file_id FOREIGN KEY (file_id) REFERENCES public.files(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3430 (class 2606 OID 17149)
-- Name: file_tag frn__file_tag__tag_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_tag
ADD CONSTRAINT frn__file_tag__tag_id FOREIGN KEY (tag_id) REFERENCES public.tags(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3433 (class 2606 OID 17217)
-- Name: file_views frn__file_views__file_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_views
ADD CONSTRAINT frn__file_views__file_id FOREIGN KEY (file_id) REFERENCES public.files(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3434 (class 2606 OID 17043)
-- Name: file_views frn__file_views__user_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.file_views
ADD CONSTRAINT frn__file_views__user_id FOREIGN KEY (user_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3440 (class 2606 OID 17389)
-- Name: files frn__files__creator_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.files
ADD CONSTRAINT frn__files__creator_id FOREIGN KEY (creator_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE RESTRICT;
--
-- TOC entry 3441 (class 2606 OID 17202)
-- Name: files frn__files__mime_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.files
ADD CONSTRAINT frn__files__mime_id FOREIGN KEY (mime_id) REFERENCES public.mime(id) ON UPDATE CASCADE ON DELETE RESTRICT;
--
-- TOC entry 3442 (class 2606 OID 17326)
-- Name: pools frn__pools__creator_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.pools
ADD CONSTRAINT frn__pools__creator_id FOREIGN KEY (creator_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE RESTRICT;
--
-- TOC entry 3443 (class 2606 OID 17331)
-- Name: pools frn__pools__parent_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.pools
ADD CONSTRAINT frn__pools__parent_id FOREIGN KEY (parent_id) REFERENCES public.pools(id) ON UPDATE CASCADE ON DELETE SET NULL;
--
-- TOC entry 3427 (class 2606 OID 17001)
-- Name: sessions frn__sessions__user_agent_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.sessions
ADD CONSTRAINT frn__sessions__user_agent_id FOREIGN KEY (user_agent_id) REFERENCES public.user_agents(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3428 (class 2606 OID 17006)
-- Name: sessions frn__sessions__user_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.sessions
ADD CONSTRAINT frn__sessions__user_id FOREIGN KEY (user_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE CASCADE;
--
-- TOC entry 3437 (class 2606 OID 17181)
-- Name: tags frn__tags__category_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.tags
ADD CONSTRAINT frn__tags__category_id FOREIGN KEY (category_id) REFERENCES public.categories(id) ON UPDATE CASCADE ON DELETE SET NULL;
--
-- TOC entry 3438 (class 2606 OID 17143)
-- Name: tags frn__tags__creator_id; Type: FK CONSTRAINT; Schema: public; Owner: hiko
--
ALTER TABLE ONLY public.tags
ADD CONSTRAINT frn__tags__creator_id FOREIGN KEY (creator_id) REFERENCES public.users(id) ON UPDATE CASCADE ON DELETE RESTRICT;
--
-- TOC entry 3595 (class 0 OID 0)
-- Dependencies: 7
-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: hiko
--
REVOKE USAGE ON SCHEMA public FROM PUBLIC;
GRANT ALL ON SCHEMA public TO PUBLIC;
--
-- TOC entry 3598 (class 0 OID 0)
-- Dependencies: 220
-- Name: TABLE autotags; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.autotags FROM hiko;
GRANT SELECT ON TABLE public.autotags TO grafana;
--
-- TOC entry 3599 (class 0 OID 0)
-- Dependencies: 228
-- Name: TABLE v_autotags; Type: ACL; Schema: public; Owner: hiko
--
GRANT SELECT ON TABLE public.v_autotags TO grafana;
--
-- TOC entry 3600 (class 0 OID 0)
-- Dependencies: 222
-- Name: TABLE categories; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.categories FROM hiko;
GRANT SELECT ON TABLE public.categories TO grafana;
--
-- TOC entry 3601 (class 0 OID 0)
-- Dependencies: 213
-- Name: TABLE users; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.users FROM hiko;
GRANT SELECT ON TABLE public.users TO grafana;
--
-- TOC entry 3602 (class 0 OID 0)
-- Dependencies: 226
-- Name: TABLE v_categories; Type: ACL; Schema: public; Owner: hiko
--
GRANT SELECT ON TABLE public.v_categories TO grafana;
--
-- TOC entry 3604 (class 0 OID 0)
-- Dependencies: 223
-- Name: TABLE files; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.files FROM hiko;
GRANT SELECT ON TABLE public.files TO grafana;
--
-- TOC entry 3605 (class 0 OID 0)
-- Dependencies: 215
-- Name: TABLE mime; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.mime FROM hiko;
GRANT SELECT ON TABLE public.mime TO tanabata;
GRANT SELECT ON TABLE public.mime TO grafana;
--
-- TOC entry 3606 (class 0 OID 0)
-- Dependencies: 230
-- Name: TABLE v_files; Type: ACL; Schema: public; Owner: hiko
--
GRANT SELECT ON TABLE public.v_files TO grafana;
--
-- TOC entry 3607 (class 0 OID 0)
-- Dependencies: 214
-- Name: TABLE sessions; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.sessions FROM hiko;
GRANT SELECT ON TABLE public.sessions TO grafana;
--
-- TOC entry 3608 (class 0 OID 0)
-- Dependencies: 218
-- Name: TABLE user_agents; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.user_agents FROM hiko;
GRANT SELECT ON TABLE public.user_agents TO tanabata;
GRANT SELECT ON TABLE public.user_agents TO grafana;
--
-- TOC entry 3609 (class 0 OID 0)
-- Dependencies: 229
-- Name: TABLE v_sessions; Type: ACL; Schema: public; Owner: hiko
--
GRANT SELECT ON TABLE public.v_sessions TO grafana;
--
-- TOC entry 3610 (class 0 OID 0)
-- Dependencies: 221
-- Name: TABLE tags; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.tags FROM hiko;
GRANT SELECT ON TABLE public.tags TO grafana;
--
-- TOC entry 3611 (class 0 OID 0)
-- Dependencies: 225
-- Name: TABLE v_tags; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.v_tags FROM hiko;
GRANT SELECT ON TABLE public.v_tags TO grafana;
--
-- TOC entry 3612 (class 0 OID 0)
-- Dependencies: 224
-- Name: TABLE pools; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.pools FROM hiko;
GRANT SELECT ON TABLE public.pools TO grafana;
--
-- TOC entry 3613 (class 0 OID 0)
-- Dependencies: 227
-- Name: TABLE v_pools; Type: ACL; Schema: public; Owner: hiko
--
GRANT SELECT ON TABLE public.v_pools TO grafana;
--
-- TOC entry 3614 (class 0 OID 0)
-- Dependencies: 291
-- Name: FUNCTION tfm_session_request(u_id uuid, u_agent text, OUT s_id uuid); Type: ACL; Schema: public; Owner: hiko
--
GRANT ALL ON FUNCTION public.tfm_session_request(u_id uuid, u_agent text, OUT s_id uuid) TO tanabata;
--
-- TOC entry 3616 (class 0 OID 0)
-- Dependencies: 292
-- Name: FUNCTION tfm_user_auth(u_name character varying, u_password text); Type: ACL; Schema: public; Owner: hiko
--
GRANT ALL ON FUNCTION public.tfm_user_auth(u_name character varying, u_password text) TO tanabata;
--
-- TOC entry 3617 (class 0 OID 0)
-- Dependencies: 232
-- Name: TABLE acl; Type: ACL; Schema: public; Owner: hiko
--
GRANT SELECT ON TABLE public.acl TO grafana;
--
-- TOC entry 3618 (class 0 OID 0)
-- Dependencies: 217
-- Name: TABLE file_pool; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.file_pool FROM hiko;
GRANT SELECT ON TABLE public.file_pool TO grafana;
--
-- TOC entry 3619 (class 0 OID 0)
-- Dependencies: 216
-- Name: TABLE file_tag; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.file_tag FROM hiko;
GRANT SELECT ON TABLE public.file_tag TO grafana;
--
-- TOC entry 3620 (class 0 OID 0)
-- Dependencies: 219
-- Name: TABLE file_views; Type: ACL; Schema: public; Owner: hiko
--
REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLE public.file_views FROM hiko;
GRANT SELECT ON TABLE public.file_views TO tanabata;
GRANT SELECT ON TABLE public.file_views TO grafana;
--
-- TOC entry 2192 (class 826 OID 61487)
-- Name: DEFAULT PRIVILEGES FOR TABLES; Type: DEFAULT ACL; Schema: -; Owner: hiko
--
ALTER DEFAULT PRIVILEGES FOR ROLE hiko REVOKE SELECT,INSERT,REFERENCES,DELETE,TRIGGER,TRUNCATE,UPDATE ON TABLES FROM hiko;
-- Completed on 2026-03-31 00:31:49
--
-- PostgreSQL database dump complete
--