feat(migrations): extended data structures
This commit is contained in:
@@ -4,13 +4,24 @@ CREATE TABLE IF NOT EXISTS public.users (
|
|||||||
email VARCHAR(320) NOT NULL UNIQUE,
|
email VARCHAR(320) NOT NULL UNIQUE,
|
||||||
provider VARCHAR(64),
|
provider VARCHAR(64),
|
||||||
provider_id VARCHAR(255),
|
provider_id VARCHAR(255),
|
||||||
|
jellyfin_user_id VARCHAR(255),
|
||||||
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS public.films (
|
CREATE TABLE IF NOT EXISTS public.films (
|
||||||
id UUID PRIMARY KEY,
|
id UUID PRIMARY KEY,
|
||||||
title VARCHAR(255) NOT NULL,
|
title VARCHAR(255) NOT NULL,
|
||||||
description TEXT NOT NULL
|
description TEXT NOT NULL,
|
||||||
|
content_type VARCHAR(32) NOT NULL DEFAULT 'FILM',
|
||||||
|
release_year INT,
|
||||||
|
genres TEXT NOT NULL DEFAULT '',
|
||||||
|
cast_members TEXT NOT NULL DEFAULT '',
|
||||||
|
directors TEXT NOT NULL DEFAULT '',
|
||||||
|
imdb_rating DOUBLE PRECISION,
|
||||||
|
platform_rating DOUBLE PRECISION,
|
||||||
|
external_url TEXT,
|
||||||
|
jellyfin_item_id VARCHAR(255),
|
||||||
|
jellyfin_library_id VARCHAR(255)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS public.favorites (
|
CREATE TABLE IF NOT EXISTS public.favorites (
|
||||||
@@ -19,6 +30,42 @@ CREATE TABLE IF NOT EXISTS public.favorites (
|
|||||||
film_id UUID NOT NULL,
|
film_id UUID NOT NULL,
|
||||||
comment VARCHAR(1024),
|
comment VARCHAR(1024),
|
||||||
is_viewed BOOLEAN NOT NULL DEFAULT FALSE,
|
is_viewed BOOLEAN NOT NULL DEFAULT FALSE,
|
||||||
|
watched_at TIMESTAMP,
|
||||||
CONSTRAINT favorites_user_fk FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE,
|
CONSTRAINT favorites_user_fk FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE,
|
||||||
CONSTRAINT favorites_film_fk FOREIGN KEY (film_id) REFERENCES public.films(id) ON DELETE CASCADE
|
CONSTRAINT favorites_film_fk FOREIGN KEY (film_id) REFERENCES public.films(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS public.user_preferences (
|
||||||
|
user_id UUID PRIMARY KEY,
|
||||||
|
weighted_genres TEXT NOT NULL DEFAULT '',
|
||||||
|
plot_types TEXT NOT NULL DEFAULT '',
|
||||||
|
eras TEXT NOT NULL DEFAULT '',
|
||||||
|
cast_and_directors TEXT NOT NULL DEFAULT '',
|
||||||
|
moods TEXT NOT NULL DEFAULT '',
|
||||||
|
content_types TEXT NOT NULL DEFAULT '',
|
||||||
|
CONSTRAINT user_preferences_user_fk FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS public.film_ratings (
|
||||||
|
id UUID PRIMARY KEY,
|
||||||
|
user_id UUID NOT NULL,
|
||||||
|
film_id UUID NOT NULL,
|
||||||
|
score INT NOT NULL,
|
||||||
|
note VARCHAR(2048),
|
||||||
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT film_ratings_user_fk FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT film_ratings_film_fk FOREIGN KEY (film_id) REFERENCES public.films(id) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT film_ratings_score_range CHECK (score >= 1 AND score <= 10),
|
||||||
|
CONSTRAINT film_ratings_user_film_unique UNIQUE (user_id, film_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS public.jellyfin_sync_state (
|
||||||
|
user_id UUID PRIMARY KEY,
|
||||||
|
last_synced_at TIMESTAMP,
|
||||||
|
last_successful_sync_at TIMESTAMP,
|
||||||
|
last_error TEXT,
|
||||||
|
synced_item_count INT NOT NULL DEFAULT 0,
|
||||||
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
CONSTRAINT jellyfin_sync_state_user_fk FOREIGN KEY (user_id) REFERENCES public.users(id) ON DELETE CASCADE
|
||||||
|
);
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
-- Create table to store Jellyfin events for idempotency and auditing
|
||||||
|
CREATE TABLE IF NOT EXISTS jellyfin_events (
|
||||||
|
event_id VARCHAR(255) PRIMARY KEY,
|
||||||
|
server_id VARCHAR(255),
|
||||||
|
event_type VARCHAR(255) NOT NULL,
|
||||||
|
occurred_at TIMESTAMP WITH TIME ZONE,
|
||||||
|
jellyfin_user_id VARCHAR(255),
|
||||||
|
jellyfin_item_id VARCHAR(255),
|
||||||
|
payload JSONB,
|
||||||
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT now()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_jellyfin_events_user ON jellyfin_events(jellyfin_user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_jellyfin_events_item ON jellyfin_events(jellyfin_item_id);
|
||||||
Reference in New Issue
Block a user