what2watch/migrations/20230426221940_init.up.sql

73 lines
2.5 KiB
SQL

-- note: sqlite-specific migration due to the types of the columns
-- When used for an ID, a blob is a UUID in byte form, or a vector of those like for friends list.
-- Otherwise, for content, a blob is just binary data, possibly representing UTF-8 text.
-- Dates are ints, unix epoch style
-- users
create table if not exists witches (
id blob not null primary key,
last_seen int,
name text,
email text,
secret blob not null, -- encrypted password? need to figure auth out
created_at int,
last_updated int
);
-- table of things to watch
create table if not exists watches (
id blob not null primary key,
typ int not null, -- enum for movie or tv show or whatev
title text not null,
imdb text, -- possible url for imdb or other metadata-esque site to show the user
runtime int,
release_date int,
created_at int,
last_updated int
);
-- table of what people want to watch
create table if not exists witch_watch (
id blob not null primary key,
witch blob not null,
watch blob not null,
party blob, -- list of witch IDs, but we can also scan for friends that want to watch the same thing
priority int, -- 1-5 how much do you want to watch it
public boolean not null,
watched boolean not null,
when_added int,
when_watched int,
created_at int,
last_updated int,
foreign key (witch) references witches (id) on delete cascade on update no action,
foreign key (watch) references watches (id) on delete cascade on update no action
);
-- friend lists; this should really be a graph db, maybe the whole thing should be
-- TODO: look into replacing sqlite with https://www.cozodb.org/
create table if not exists covens (
witch blob not null primary key,
coven blob, -- possibly empty friends list in some app-specific format
created_at int,
last_updated int,
foreign key (witch) references witches (id) on delete cascade on update no action
);
create table if not exists watch_notes (
id blob not null primary key,
witch blob not null,
watch blob not null,
note blob,
public boolean not null,
created_at int,
last_updated int,
foreign key (witch) references witches (id) on delete cascade on update no action,
foreign key (watch) references watches (id) on delete cascade on update no action
);
-- indices, not needed for covens
create index if not exists witch_dex on witches ( name, email );
create index if not exists watch_dex on watches ( title, runtime, release_date );
create index if not exists ww_dex on witch_watch ( witch, watch, public );
create index if not exists note_dex on watch_notes ( witch, watch, public );