create type privacy as enum ('private', 'unlisted', 'public'); create type file_type as enum ('image', 'video', 'audio', 'text', 'document', 'site', 'other'); create extension if not exists "uuid-ossp"; create table users ( id uuid primary key default gen_random_uuid(), username varchar(32) not null, unique(username), password varchar(128) not null, email varchar(128), bio text, site varchar(128), privacy privacy not null default 'public', admin boolean not null default true ); -- create table sessions ( -- id varchar(128) primary key, -- expires timestamp with time zone, -- user_id integer not null, -- foreign key (user_id) references users(id) -- ); create table boards ( id uuid primary key default gen_random_uuid(), idname varchar(256), name varchar(256), description text, privacy privacy ); create table board_ownership ( board_id uuid not null, user_id uuid not null, foreign key (board_id) references boards(id), foreign key (user_id) references users(id), primary key (board_id, user_id) ); create table pins ( id uuid primary key default gen_random_uuid(), subject varchar(256), notes text, privacy privacy ); create table pin_ownership ( pin_id uuid not null, user_id uuid not null, foreign key (pin_id) references pins(id), foreign key (user_id) references users(id), primary key (pin_id, user_id) ); create table pins_boards ( pin_id uuid not null, board_id uuid not null, foreign key (pin_id) references pins(id), foreign key (board_id) references boards(id), primary key (pin_id, board_id) ); create table sources ( id uuid primary key default gen_random_uuid(), idname varchar(256), title varchar(256), author varchar(256), url varchar(256), iban varchar(13), page varchar(256), location varchar(256) ); create table pin_sources ( source_id uuid not null, pin_id uuid not null, foreign key (source_id) references sources(id), foreign key (pin_id) references pins(id), primary key (source_id, pin_id) ); create table files ( id uuid primary key default gen_random_uuid(), idname varchar(256), thumbnail varchar(256), path varchar(256) not null, title varchar(256), type file_type, alt_text text, pin_id uuid not null, foreign key (pin_id) references pins(id) ); create table tags ( tag varchar(128) not null primary key ); create table tags_pins ( tag varchar(128) not null, pin_id uuid not null, foreign key (tag) references tags(tag), foreign key (pin_id) references pins(id), primary key (tag, pin_id) );