dragonflight/services/mam-api/src/db/schema.sql
Zac Gaetano af905cf936 fix: bin creation 500 error + add drag-and-drop + project rename
- Fix 500 error when creating bins: missing updated_at column on bins table
  (migration 013 adds the column, schema.sql updated)
- Add drag-and-drop support for moving asset cards/list rows onto bin rail items
  with visual droppable highlight
- Add right-click context menu on project rail items (Rename/Delete)
- Expose RenameProjectModal via window so Library screen can reuse it
- Bins context menu already existed — was hidden by the 500 error
2026-05-24 13:27:24 -04:00

164 lines
4.4 KiB
SQL

-- 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(),
updated_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,
-- AMPP sync fields (used by upload.js to mirror folder structure)
ampp_folder_id TEXT,
ampp_synced_at TIMESTAMPTZ,
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);
-- Recorder source types
CREATE TYPE source_type AS ENUM ('sdi', 'srt', 'rtmp');
-- Recorder instances table
-- NOTE: current_session_id is TEXT (stores a human-readable clip name, not a UUID)
CREATE TABLE recorders (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name TEXT NOT NULL,
source_type source_type NOT NULL,
source_config JSONB NOT NULL DEFAULT '{}',
recording_codec TEXT NOT NULL DEFAULT 'prores_hq',
recording_resolution TEXT DEFAULT 'native',
proxy_enabled BOOLEAN DEFAULT true,
proxy_codec TEXT DEFAULT 'libx264',
proxy_resolution TEXT DEFAULT '1920x1080',
project_id UUID REFERENCES projects,
container_id TEXT,
status TEXT DEFAULT 'stopped',
current_session_id TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_recorders_status ON recorders(status);