add services/mam-api/src/db/schema.sql

This commit is contained in:
Zac Gaetano 2026-04-07 21:58:25 -04:00
parent 9a9259628a
commit 44a5781f99

View file

@ -0,0 +1,135 @@
-- Wild Dragon MAM Platform - PostgreSQL Schema
-- Enable UUID extension
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- ENUM types
CREATE TYPE asset_status AS ENUM (
'ingesting',
'processing',
'ready',
'error',
'archived'
);
CREATE TYPE media_type AS ENUM (
'video',
'audio',
'image',
'document'
);
CREATE TYPE job_type AS ENUM (
'proxy_gen',
'thumbnail',
'conform',
'export'
);
CREATE TYPE job_status AS ENUM (
'queued',
'processing',
'complete',
'failed'
);
-- Projects table
CREATE TABLE projects (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL,
description TEXT,
s3_prefix TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Bins table
CREATE TABLE bins (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
project_id UUID NOT NULL REFERENCES projects ON DELETE CASCADE,
parent_id UUID REFERENCES bins ON DELETE SET NULL,
name TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Assets table
CREATE TABLE assets (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
project_id UUID NOT NULL REFERENCES projects ON DELETE CASCADE,
bin_id UUID REFERENCES bins ON DELETE SET NULL,
filename TEXT NOT NULL,
display_name TEXT,
status asset_status DEFAULT 'ingesting',
media_type media_type NOT NULL,
original_s3_key TEXT,
proxy_s3_key TEXT,
thumbnail_s3_key TEXT,
codec TEXT,
resolution TEXT,
fps NUMERIC(6,3),
duration_ms BIGINT,
start_tc TEXT,
file_size BIGINT,
tags TEXT[] DEFAULT '{}',
notes TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Jobs table
CREATE TABLE jobs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
type job_type NOT NULL,
asset_id UUID REFERENCES assets ON DELETE SET NULL,
status job_status DEFAULT 'queued',
payload JSONB DEFAULT '{}',
result JSONB DEFAULT '{}',
error TEXT,
progress INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Capture Sessions table
CREATE TABLE capture_sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
project_id UUID NOT NULL REFERENCES projects,
bin_id UUID REFERENCES bins,
clip_name TEXT NOT NULL,
device TEXT NOT NULL,
started_at TIMESTAMPTZ DEFAULT NOW(),
stopped_at TIMESTAMPTZ,
asset_id UUID REFERENCES assets
);
-- Users table
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
display_name TEXT,
role TEXT DEFAULT 'editor',
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Sessions table (for connect-pg-simple session store)
CREATE TABLE sessions (
sid TEXT PRIMARY KEY,
sess JSONB NOT NULL,
expire TIMESTAMPTZ NOT NULL
);
-- Indexes
CREATE INDEX idx_assets_project_id ON assets(project_id);
CREATE INDEX idx_assets_status ON assets(status);
CREATE INDEX idx_assets_created_at_desc ON assets(created_at DESC);
CREATE INDEX idx_assets_tags ON assets USING GIN(tags);
CREATE INDEX idx_assets_fulltext ON assets USING GIN(to_tsvector('english', COALESCE(display_name, '') || ' ' || COALESCE(filename, '') || ' ' || COALESCE(notes, '')));
CREATE INDEX idx_jobs_asset_id ON jobs(asset_id);
CREATE INDEX idx_jobs_status ON jobs(status);
CREATE INDEX idx_jobs_type ON jobs(type);
CREATE INDEX idx_bins_project_id ON bins(project_id);
CREATE INDEX idx_sessions_expire ON sessions(expire);