CREATE TABLE IF NOT EXISTS users ( id VARCHAR(255) PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, username VARCHAR(255), display_name VARCHAR(255) NOT NULL, password_hash VARCHAR(255) NOT NULL, email_verified BOOLEAN DEFAULT FALSE, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS workspaces ( id VARCHAR(255) PRIMARY KEY, name VARCHAR(255) NOT NULL, owner_user_id VARCHAR(255) NOT NULL REFERENCES users(id), subscription_plan VARCHAR(50) DEFAULT 'free', subscription_status VARCHAR(50) DEFAULT 'active', created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS projects ( id VARCHAR(255) PRIMARY KEY, workspace_id VARCHAR(255) NOT NULL REFERENCES workspaces(id), name VARCHAR(255) NOT NULL, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS assets ( id VARCHAR(255) PRIMARY KEY, workspace_id VARCHAR(255) NOT NULL, project_id VARCHAR(255) NOT NULL, library_id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, storage_key VARCHAR(500) NOT NULL, mime_type VARCHAR(100) NOT NULL, file_size BIGINT, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS generation_tasks ( id VARCHAR(255) PRIMARY KEY, workspace_id VARCHAR(255) NOT NULL, project_id VARCHAR(255) NOT NULL, asset_library_id VARCHAR(255) NOT NULL, status VARCHAR(50) NOT NULL DEFAULT 'pending', progress FLOAT DEFAULT 0, result_count INTEGER DEFAULT 0, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS generated_videos ( id VARCHAR(255) PRIMARY KEY, workspace_id VARCHAR(255) NOT NULL, project_id VARCHAR(255) NOT NULL, generation_task_id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, file_url VARCHAR(500) NOT NULL, file_size BIGINT, duration FLOAT, width INTEGER, height INTEGER, fps FLOAT, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP );