changemaker.lite/api/drizzle/0000_classy_hedge_knight.sql

1451 lines
72 KiB
SQL

CREATE TABLE "ad_clicks" (
"id" serial PRIMARY KEY NOT NULL,
"ad_id" integer NOT NULL,
"session_id" text,
"user_id" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "ad_impressions" (
"id" serial PRIMARY KEY NOT NULL,
"ad_id" integer NOT NULL,
"session_id" text,
"user_id" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "ads" (
"id" serial PRIMARY KEY NOT NULL,
"type" text NOT NULL,
"variant" text,
"image_path" text,
"link_url" text,
"title" text,
"visibility" text DEFAULT 'everyone' NOT NULL,
"is_active" boolean DEFAULT true,
"position" integer DEFAULT 0,
"impression_count" integer DEFAULT 0,
"click_count" integer DEFAULT 0,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "app_settings" (
"key" text PRIMARY KEY NOT NULL,
"value" text NOT NULL,
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "auth_tokens" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"token" text NOT NULL,
"type" text NOT NULL,
"expires_at" timestamp with time zone NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "auth_tokens_token_unique" UNIQUE("token")
);
--> statement-breakpoint
CREATE TABLE "chat_thread_read_status" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"media_id" integer NOT NULL,
"last_seen_at" timestamp with time zone NOT NULL
);
--> statement-breakpoint
CREATE TABLE "close_friends" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"close_friend_id" integer NOT NULL,
"added_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "comment_moderation" (
"id" serial PRIMARY KEY NOT NULL,
"comment_id" integer NOT NULL,
"status" text DEFAULT 'pending' NOT NULL,
"moderated_by" integer,
"moderated_at" timestamp with time zone,
"reason" text
);
--> statement-breakpoint
CREATE TABLE "comments" (
"id" serial PRIMARY KEY NOT NULL,
"media_id" integer NOT NULL,
"session_id" text NOT NULL,
"user_id" integer,
"content" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
"safety_status" text DEFAULT 'pending',
"safety_checked_at" timestamp with time zone,
"safety_categories" jsonb,
"safety_reasoning" text,
"is_hidden" boolean DEFAULT false,
"hidden_at" timestamp with time zone,
"hidden_reason" text,
"moderation_notes" text
);
--> statement-breakpoint
CREATE TABLE "compilations" (
"id" serial PRIMARY KEY NOT NULL,
"filename" text NOT NULL,
"path" text,
"duration_seconds" integer,
"video_ids" jsonb,
"settings" jsonb,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "content_reports" (
"id" serial PRIMARY KEY NOT NULL,
"media_id" integer NOT NULL,
"session_id" text,
"user_id" integer,
"report_type" text NOT NULL,
"description" text,
"status" text DEFAULT 'pending' NOT NULL,
"resolved_by" integer,
"resolved_at" timestamp with time zone,
"resolution_notes" text,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "creators" (
"id" serial PRIMARY KEY NOT NULL,
"name" text NOT NULL,
"slug" text NOT NULL,
"gender" integer,
"primary_face_id" integer,
"face_count" integer DEFAULT 0,
"video_count" integer DEFAULT 0,
"tag_id" integer,
"is_public" boolean DEFAULT false,
"centroid_embedding" jsonb,
"centroid_updated_at" timestamp with time zone,
"centroid_face_count" integer DEFAULT 0,
"embedding_variance" real,
"avg_intra_cluster_similarity" real,
"avg_age" real,
"age_std_dev" real,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "creators_name_unique" UNIQUE("name"),
CONSTRAINT "creators_slug_unique" UNIQUE("slug")
);
--> statement-breakpoint
CREATE TABLE "digest_clip_tags" (
"id" serial PRIMARY KEY NOT NULL,
"clip_id" integer NOT NULL,
"tag_id" integer NOT NULL,
"source" text DEFAULT 'auto' NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "digest_compilations" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"folder_id" integer,
"filename" text NOT NULL,
"name" text,
"path" text NOT NULL,
"duration_seconds" integer,
"orientation" text,
"status" text DEFAULT 'pending' NOT NULL,
"error" text,
"has_captions" integer DEFAULT 0 NOT NULL,
"caption_style" jsonb,
"closing_ad_path" text,
"closing_ad_duration" integer,
"tags" jsonb,
"created_at" timestamp with time zone DEFAULT now(),
"completed_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "digest_generated_clips" (
"id" serial PRIMARY KEY NOT NULL,
"selected_clip_id" integer NOT NULL,
"digest_id" integer NOT NULL,
"folder_id" integer,
"clip_path" text,
"gif_path" text,
"status" text DEFAULT 'pending' NOT NULL,
"error" text,
"created_at" timestamp with time zone DEFAULT now(),
"completed_at" timestamp with time zone,
"published_to_public_media_id" integer,
"published_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "digest_generated_scenes" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"folder_id" integer,
"scene_number" integer NOT NULL,
"scene_path" text,
"start_time" real NOT NULL,
"end_time" real NOT NULL,
"duration" real NOT NULL,
"tags" jsonb,
"dominant_position" text,
"created_at" timestamp with time zone DEFAULT now(),
"published_to_public_media_id" integer,
"published_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "digest_output_folders" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"folder_path" text NOT NULL,
"folder_name" text NOT NULL,
"folder_type" text DEFAULT 'clips' NOT NULL,
"clip_count" integer DEFAULT 0,
"compilation_count" integer DEFAULT 0,
"total_size" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "digest_selected_clips" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"clip_type" text NOT NULL,
"start_time" integer NOT NULL,
"end_time" integer NOT NULL,
"duration" integer NOT NULL,
"reason" text,
"interest_score" integer,
"position" text,
"transcript_hint" text,
"tags" jsonb,
"source" text DEFAULT 'machine' NOT NULL,
"is_included" integer DEFAULT 1 NOT NULL,
"is_hook" integer DEFAULT 0 NOT NULL,
"sequence_order" integer DEFAULT 0 NOT NULL,
"hook_source_clip_id" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "digest_suggested_tags" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"suggested_category" text NOT NULL,
"suggested_value" text NOT NULL,
"confidence" integer,
"status" text DEFAULT 'pending' NOT NULL,
"mapped_tag_id" integer,
"reviewed_by" integer,
"reviewed_at" timestamp with time zone,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "digest_video_tags" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"category" text NOT NULL,
"value" text NOT NULL,
"confidence" integer,
"source" text DEFAULT 'digest',
"evidence" jsonb,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "email_change_tokens" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"new_email" text NOT NULL,
"token" text NOT NULL,
"expires_at" timestamp with time zone NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "email_change_tokens_token_unique" UNIQUE("token")
);
--> statement-breakpoint
CREATE TABLE "email_verification_tokens" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"token" text NOT NULL,
"expires_at" timestamp with time zone NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "email_verification_tokens_token_unique" UNIQUE("token")
);
--> statement-breakpoint
CREATE TABLE "featured_playlists" (
"id" serial PRIMARY KEY NOT NULL,
"playlist_id" integer NOT NULL,
"position" integer DEFAULT 0 NOT NULL,
"featured_by" integer,
"featured_at" timestamp with time zone,
CONSTRAINT "featured_playlists_playlist_id_unique" UNIQUE("playlist_id")
);
--> statement-breakpoint
CREATE TABLE "friendships" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"friend_id" integer NOT NULL,
"status" text DEFAULT 'pending' NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
"accepted_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "geo_blocking_rules" (
"id" serial PRIMARY KEY NOT NULL,
"country" text NOT NULL,
"country_name" text,
"region" text,
"city" text,
"created_at" timestamp with time zone DEFAULT now(),
"created_by" integer,
"note" text
);
--> statement-breakpoint
CREATE TABLE "highlight_cooldowns" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"last_generated_at" timestamp with time zone NOT NULL
);
--> statement-breakpoint
CREATE TABLE "invoices" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"plan_id" integer,
"invoice_number" text NOT NULL,
"amount_cad" integer NOT NULL,
"status" text DEFAULT 'pending' NOT NULL,
"due_date" timestamp with time zone NOT NULL,
"paid_at" timestamp with time zone,
"payment_id" integer,
"description" text,
"notes" text,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone,
CONSTRAINT "invoices_invoice_number_unique" UNIQUE("invoice_number")
);
--> statement-breakpoint
CREATE TABLE "jobs" (
"id" serial PRIMARY KEY NOT NULL,
"type" text NOT NULL,
"status" text DEFAULT 'pending',
"progress" integer DEFAULT 0,
"log" text,
"params" jsonb,
"started_at" timestamp with time zone,
"completed_at" timestamp with time zone,
"created_at" timestamp with time zone DEFAULT now(),
"resource_category" text DEFAULT 'cpu',
"vram_required" integer DEFAULT 0,
"queue_position" integer,
"waiting_reason" text,
"priority" integer DEFAULT 5,
"pipeline_id" integer,
"pipeline_step_id" integer
);
--> statement-breakpoint
CREATE TABLE "moderation_word_lists" (
"id" serial PRIMARY KEY NOT NULL,
"level" text NOT NULL,
"word" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
"created_by" integer
);
--> statement-breakpoint
CREATE TABLE "notification_preferences" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"email_friend_request" boolean DEFAULT true,
"email_friend_request_accepted" boolean DEFAULT true,
"email_poke" boolean DEFAULT true,
"email_video_recommendation" boolean DEFAULT true,
"email_watch_party_invite" boolean DEFAULT true,
"email_achievement" boolean DEFAULT false,
"email_digest_complete" boolean DEFAULT true,
"email_digest_failed" boolean DEFAULT true,
"email_upload_approved" boolean DEFAULT true,
"email_upload_rejected" boolean DEFAULT true,
"inapp_friend_request" boolean DEFAULT true,
"inapp_friend_request_accepted" boolean DEFAULT true,
"inapp_poke" boolean DEFAULT true,
"inapp_video_recommendation" boolean DEFAULT true,
"inapp_watch_party_invite" boolean DEFAULT true,
"inapp_achievement" boolean DEFAULT true,
"inapp_digest_complete" boolean DEFAULT true,
"inapp_digest_failed" boolean DEFAULT true,
"inapp_upload_approved" boolean DEFAULT true,
"inapp_upload_rejected" boolean DEFAULT true,
"inapp_comment_reply" boolean DEFAULT true,
"inapp_system" boolean DEFAULT true,
"quiet_hours_enabled" boolean DEFAULT false,
"quiet_hours_start" text,
"quiet_hours_end" text,
"updated_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "notification_preferences_user_id_unique" UNIQUE("user_id")
);
--> statement-breakpoint
CREATE TABLE "notifications" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"type" text NOT NULL,
"title" text NOT NULL,
"message" text,
"reference_type" text,
"reference_id" integer,
"actor_id" integer,
"metadata" jsonb,
"is_read" boolean DEFAULT false,
"action_url" text,
"group_key" text,
"created_at" timestamp with time zone DEFAULT now(),
"read_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "password_reset_tokens" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"token" text NOT NULL,
"expires_at" timestamp with time zone NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
"used_at" timestamp with time zone,
CONSTRAINT "password_reset_tokens_token_unique" UNIQUE("token")
);
--> statement-breakpoint
CREATE TABLE "payment_audit_log" (
"id" serial PRIMARY KEY NOT NULL,
"payment_id" integer,
"invoice_id" integer,
"user_id" integer,
"action" text NOT NULL,
"previous_state" jsonb,
"new_state" jsonb,
"performed_by" integer,
"notes" text,
"ip_address" text,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "payments" (
"id" serial PRIMARY KEY NOT NULL,
"invoice_id" integer,
"user_id" integer,
"sender_email" text NOT NULL,
"sender_name" text,
"amount_cad" integer NOT NULL,
"reference_number" text,
"custom_message" text,
"status" text DEFAULT 'unmatched' NOT NULL,
"match_confidence" real,
"match_method" text,
"raw_email_json" jsonb,
"received_at" timestamp with time zone NOT NULL,
"processed_at" timestamp with time zone,
"processed_by" integer,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone,
CONSTRAINT "payments_reference_number_unique" UNIQUE("reference_number")
);
--> statement-breakpoint
CREATE TABLE "performer_discrepancies" (
"id" serial PRIMARY KEY NOT NULL,
"video_id" integer,
"digest_id" integer,
"parsed_performer_name" text NOT NULL,
"parsed_method" text,
"parsed_confidence" real,
"detected_performer_id" integer,
"detected_performer_name" text,
"face_match_confidence" real,
"face_similarity" real,
"discrepancy_type" text NOT NULL,
"status" text DEFAULT 'pending' NOT NULL,
"resolved_by" integer,
"resolved_at" timestamp with time zone,
"resolution" text,
"admin_notes" text,
"created_at" timestamp with time zone DEFAULT now() NOT NULL
);
--> statement-breakpoint
CREATE TABLE "performer_faces" (
"id" serial PRIMARY KEY NOT NULL,
"performer_id" integer,
"performer_name" text,
"face_embedding" jsonb NOT NULL,
"gender" integer,
"age" integer,
"detection_score" real,
"bbox" jsonb,
"face_crop_path" text,
"source_frame" text,
"source_video" text,
"source_digest_id" integer,
"frame_timestamp" real,
"frame_index" integer,
"faces_in_frame" integer DEFAULT 1,
"status" text DEFAULT 'pending',
"match_confidence" real,
"is_verified" boolean DEFAULT false,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "pipeline_step_events" (
"id" serial PRIMARY KEY NOT NULL,
"step_id" integer NOT NULL,
"event_type" text NOT NULL,
"event_data" jsonb,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "pipeline_steps" (
"id" serial PRIMARY KEY NOT NULL,
"pipeline_id" integer NOT NULL,
"name" text NOT NULL,
"step_type" text NOT NULL,
"sequence_order" integer NOT NULL,
"depends_on" jsonb DEFAULT '[]'::jsonb,
"resource_category" text DEFAULT 'cpu',
"vram_required" integer DEFAULT 0,
"required_containers" jsonb DEFAULT '[]'::jsonb,
"config" jsonb,
"status" text DEFAULT 'pending' NOT NULL,
"progress" integer DEFAULT 0,
"result" jsonb,
"error" text,
"estimated_duration_ms" integer,
"started_at" timestamp with time zone,
"completed_at" timestamp with time zone,
"duration_ms" integer
);
--> statement-breakpoint
CREATE TABLE "pipeline_templates" (
"id" serial PRIMARY KEY NOT NULL,
"name" text NOT NULL,
"display_name" text NOT NULL,
"description" text,
"steps" jsonb NOT NULL,
"context_schema" jsonb,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone,
CONSTRAINT "pipeline_templates_name_unique" UNIQUE("name")
);
--> statement-breakpoint
CREATE TABLE "pipelines" (
"id" serial PRIMARY KEY NOT NULL,
"name" text NOT NULL,
"description" text,
"status" text DEFAULT 'pending' NOT NULL,
"priority" integer DEFAULT 5,
"context" jsonb,
"total_vram_required" integer DEFAULT 0,
"estimated_duration_ms" integer,
"progress" integer DEFAULT 0,
"current_step_id" integer,
"completed_steps" integer DEFAULT 0,
"total_steps" integer DEFAULT 0,
"error" text,
"retry_count" integer DEFAULT 0,
"max_retries" integer DEFAULT 3,
"created_at" timestamp with time zone DEFAULT now(),
"queued_at" timestamp with time zone,
"started_at" timestamp with time zone,
"completed_at" timestamp with time zone,
"last_heartbeat" timestamp with time zone,
"running_on_node" text
);
--> statement-breakpoint
CREATE TABLE "playlist_videos" (
"id" serial PRIMARY KEY NOT NULL,
"playlist_id" integer NOT NULL,
"media_id" integer NOT NULL,
"position" integer DEFAULT 0 NOT NULL,
"added_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "playlist_views" (
"id" serial PRIMARY KEY NOT NULL,
"playlist_id" integer NOT NULL,
"session_id" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "playlists" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"name" text NOT NULL,
"description" text,
"is_public" boolean DEFAULT false,
"share_token" text,
"thumbnail_media_id" integer,
"video_count" integer DEFAULT 0,
"total_duration_seconds" integer DEFAULT 0,
"view_count" integer DEFAULT 0,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone,
CONSTRAINT "playlists_share_token_unique" UNIQUE("share_token")
);
--> statement-breakpoint
CREATE TABLE "pokes" (
"id" serial PRIMARY KEY NOT NULL,
"from_user_id" integer NOT NULL,
"to_user_id" integer NOT NULL,
"is_read" boolean DEFAULT false,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "privacy_settings" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"show_online_status" boolean DEFAULT true,
"show_currently_watching" boolean DEFAULT true,
"show_in_friend_activity" boolean DEFAULT true,
"anonymize_public_comments" boolean DEFAULT false,
"hide_public_reactions" boolean DEFAULT false,
"hide_public_finishes" boolean DEFAULT false,
"allow_friend_requests" boolean DEFAULT true,
"close_friends_only_watching" boolean DEFAULT false,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone,
CONSTRAINT "privacy_settings_user_id_unique" UNIQUE("user_id")
);
--> statement-breakpoint
CREATE TABLE "public_media" (
"id" serial PRIMARY KEY NOT NULL,
"path" text NOT NULL,
"filename" text NOT NULL,
"category" text NOT NULL,
"duration_seconds" integer,
"quality" text,
"orientation" text,
"thumbnail_path" text,
"file_size" bigint,
"view_count" integer DEFAULT 0,
"upvote_count" integer DEFAULT 0,
"comment_count" integer DEFAULT 0,
"finish_count" integer DEFAULT 0,
"total_watch_time" integer DEFAULT 0,
"created_at" timestamp with time zone DEFAULT now(),
"is_locked" boolean DEFAULT false,
"locked_at" timestamp with time zone,
"locked_by" integer,
"position" integer DEFAULT 0,
"uploader_id" integer,
CONSTRAINT "public_media_path_unique" UNIQUE("path")
);
--> statement-breakpoint
CREATE TABLE "public_media_performers" (
"id" serial PRIMARY KEY NOT NULL,
"media_id" integer NOT NULL,
"performer_id" integer NOT NULL,
"added_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "public_media_tags" (
"id" serial PRIMARY KEY NOT NULL,
"media_id" integer NOT NULL,
"tag_id" integer NOT NULL,
"added_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "published_inbox_files" (
"id" serial PRIMARY KEY NOT NULL,
"source_inbox_path" text NOT NULL,
"filename" text NOT NULL,
"published_at" timestamp with time zone DEFAULT now(),
"published_to_path" text,
"public_media_id" integer,
"file_type" text NOT NULL
);
--> statement-breakpoint
CREATE TABLE "rate_limits" (
"id" serial PRIMARY KEY NOT NULL,
"key" text NOT NULL,
"count" integer DEFAULT 1 NOT NULL,
"reset_at" timestamp with time zone NOT NULL,
CONSTRAINT "rate_limits_key_unique" UNIQUE("key")
);
--> statement-breakpoint
CREATE TABLE "resource_snapshots" (
"id" serial PRIMARY KEY NOT NULL,
"gpu_index" integer DEFAULT 0,
"gpu_name" text,
"vram_used_mb" integer,
"vram_total_mb" integer,
"gpu_utilization" integer,
"gpu_temperature" integer,
"active_processes" jsonb,
"pipeline_id" integer,
"step_id" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "session_bans" (
"id" serial PRIMARY KEY NOT NULL,
"session_id" text NOT NULL,
"reason" text,
"banned_by" integer,
"created_at" timestamp with time zone DEFAULT now(),
"expires_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "sessions" (
"id" text PRIMARY KEY NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
"last_seen_at" timestamp with time zone,
"ip_address" text,
"user_agent" text,
"device_type" text,
"browser" text,
"os" text,
"country" text,
"country_name" text,
"region" text,
"city" text,
"timezone" text,
"latitude" real,
"longitude" real,
"user_id" integer,
"first_seen_at" timestamp with time zone,
"visit_count" integer DEFAULT 1
);
--> statement-breakpoint
CREATE TABLE "subscription_plans" (
"id" serial PRIMARY KEY NOT NULL,
"name" text NOT NULL,
"display_name" text NOT NULL,
"description" text,
"price_cad" integer NOT NULL,
"duration_days" integer,
"is_active" boolean DEFAULT true,
"sort_order" integer DEFAULT 0,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone,
CONSTRAINT "subscription_plans_name_unique" UNIQUE("name")
);
--> statement-breakpoint
CREATE TABLE "tag_categories" (
"id" serial PRIMARY KEY NOT NULL,
"name" text NOT NULL,
"display_order" integer DEFAULT 0 NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "tag_categories_name_unique" UNIQUE("name")
);
--> statement-breakpoint
CREATE TABLE "tag_generation_jobs" (
"id" serial PRIMARY KEY NOT NULL,
"status" text DEFAULT 'pending' NOT NULL,
"content_type" text NOT NULL,
"content_ids" jsonb NOT NULL,
"options" jsonb,
"results" jsonb,
"progress" integer DEFAULT 0,
"current_item" integer DEFAULT 0,
"total_items" integer DEFAULT 0,
"error" text,
"created_at" timestamp with time zone DEFAULT now(),
"completed_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "tags" (
"id" serial PRIMARY KEY NOT NULL,
"category_id" integer NOT NULL,
"name" text NOT NULL,
"display_order" integer DEFAULT 0 NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "upload_invites" (
"id" serial PRIMARY KEY NOT NULL,
"code" text NOT NULL,
"label" text,
"created_by" integer NOT NULL,
"status" text DEFAULT 'active' NOT NULL,
"max_uploads" integer,
"upload_count" integer DEFAULT 0 NOT NULL,
"expires_at" timestamp with time zone,
"created_at" timestamp with time zone DEFAULT now(),
CONSTRAINT "upload_invites_code_unique" UNIQUE("code")
);
--> statement-breakpoint
CREATE TABLE "upvotes" (
"id" serial PRIMARY KEY NOT NULL,
"media_id" integer NOT NULL,
"session_id" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "user_achievements" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"achievement_id" text NOT NULL,
"unlocked_at" timestamp with time zone NOT NULL,
"progress" integer DEFAULT 0,
"notified" boolean DEFAULT false
);
--> statement-breakpoint
CREATE TABLE "user_blocks" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"blocked_user_id" integer NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "user_daily_activity" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"activity_date" text NOT NULL,
"watch_time_seconds" integer DEFAULT 0,
"videos_watched" integer DEFAULT 0,
"first_activity_hour" integer,
"created_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "user_finishes" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"media_id" integer,
"session_id" text,
"created_at" timestamp with time zone NOT NULL
);
--> statement-breakpoint
CREATE TABLE "user_gallery_images" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"filename" text NOT NULL,
"original_filename" text,
"position" integer DEFAULT 0 NOT NULL,
"uploaded_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "user_presence" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"is_online" boolean DEFAULT false,
"current_media_id" integer,
"last_activity_at" timestamp with time zone,
"last_video_change_at" timestamp with time zone,
CONSTRAINT "user_presence_user_id_unique" UNIQUE("user_id")
);
--> statement-breakpoint
CREATE TABLE "user_social_links" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"platform" text NOT NULL,
"url" text NOT NULL,
"display_name" text,
"position" integer DEFAULT 0 NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "user_stats" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"total_watch_time_seconds" integer DEFAULT 0,
"total_videos_watched" integer DEFAULT 0,
"total_upvotes_given" integer DEFAULT 0,
"total_comments_made" integer DEFAULT 0,
"total_finishes" integer DEFAULT 0,
"current_day_streak" integer DEFAULT 0,
"longest_day_streak" integer DEFAULT 0,
"last_active_date" text,
"longest_single_session" integer DEFAULT 0,
"categories_completed" jsonb,
"night_owl_count" integer DEFAULT 0,
"early_bird_count" integer DEFAULT 0,
"updated_at" timestamp with time zone,
CONSTRAINT "user_stats_user_id_unique" UNIQUE("user_id")
);
--> statement-breakpoint
CREATE TABLE "user_subscriptions" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"plan_id" integer,
"status" text DEFAULT 'inactive' NOT NULL,
"start_date" timestamp with time zone,
"end_date" timestamp with time zone,
"grace_period_end_date" timestamp with time zone,
"last_payment_id" integer,
"auto_renew" boolean DEFAULT true,
"notes" text,
"created_at" timestamp with time zone DEFAULT now(),
"updated_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "user_tag_preferences" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"tag_id" integer NOT NULL,
"saved_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "user_upload_suggested_tags" (
"id" serial PRIMARY KEY NOT NULL,
"upload_id" integer NOT NULL,
"tag_id" integer NOT NULL,
"suggested_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "user_uploads" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"filename" text NOT NULL,
"original_filename" text,
"path" text NOT NULL,
"duration_seconds" integer,
"quality" text,
"orientation" text,
"file_size" bigint,
"thumbnail_path" text,
"status" text DEFAULT 'pending' NOT NULL,
"reviewed_by" integer,
"reviewed_at" timestamp with time zone,
"review_notes" text,
"public_media_id" integer,
"upload_invite_id" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "users" (
"id" serial PRIMARY KEY NOT NULL,
"username" text NOT NULL,
"email" text NOT NULL,
"password_hash" text NOT NULL,
"role" text DEFAULT 'user' NOT NULL,
"status" text DEFAULT 'pending' NOT NULL,
"email_verified" boolean DEFAULT false,
"linked_session_id" text,
"created_at" timestamp with time zone DEFAULT now(),
"approved_at" timestamp with time zone,
"approved_by" integer,
"last_login_at" timestamp with time zone,
"is_trusted" boolean DEFAULT false,
"max_upload_duration_seconds" integer DEFAULT 60,
"auto_accept_uploads" boolean DEFAULT false,
"trusted_at" timestamp with time zone,
"trusted_by" integer,
"default_playlist_id" integer,
"social_links_public" boolean DEFAULT false,
"subscription_status" text DEFAULT 'none',
"subscription_plan_id" integer,
"subscription_end_date" timestamp with time zone,
"lifetime_member" boolean DEFAULT false,
"total_paid_cad" integer DEFAULT 0,
"last_moderation_action" timestamp with time zone,
CONSTRAINT "users_username_unique" UNIQUE("username"),
CONSTRAINT "users_email_unique" UNIQUE("email")
);
--> statement-breakpoint
CREATE TABLE "video_digests" (
"id" serial PRIMARY KEY NOT NULL,
"video_id" integer NOT NULL,
"job_id" integer,
"status" text DEFAULT 'pending' NOT NULL,
"progress" integer DEFAULT 0,
"frame_count" integer,
"config" jsonb,
"frame_analyses" jsonb,
"transcript" jsonb,
"tags" jsonb,
"suggested_clips" jsonb,
"ad_cut_spec" jsonb,
"stage_results" jsonb,
"created_at" timestamp with time zone DEFAULT now(),
"started_at" timestamp with time zone,
"completed_at" timestamp with time zone,
"error" text
);
--> statement-breakpoint
CREATE TABLE "video_ocr_results" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"frame_index" integer NOT NULL,
"timestamp" real NOT NULL,
"extracted_text" text NOT NULL,
"confidence" real,
"text_type" text,
"source_frame" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "video_reactions" (
"id" serial PRIMARY KEY NOT NULL,
"user_id" integer NOT NULL,
"media_id" integer NOT NULL,
"reaction_type" text NOT NULL,
"video_timestamp" integer NOT NULL,
"created_at" timestamp with time zone NOT NULL
);
--> statement-breakpoint
CREATE TABLE "video_recommendations" (
"id" serial PRIMARY KEY NOT NULL,
"from_user_id" integer NOT NULL,
"to_user_id" integer NOT NULL,
"media_id" integer NOT NULL,
"message" text,
"is_read" boolean DEFAULT false,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "video_scene_cuts" (
"id" serial PRIMARY KEY NOT NULL,
"video_id" integer NOT NULL,
"cuts" jsonb NOT NULL,
"scene_count" integer NOT NULL,
"duration" real NOT NULL,
"detector" text DEFAULT 'content' NOT NULL,
"threshold" real DEFAULT 27 NOT NULL,
"transnet_cuts" jsonb,
"pyscenedetect_cuts" jsonb,
"clip_cuts" jsonb,
"merged_cuts_detailed" jsonb,
"merge_strategy" text DEFAULT 'weighted',
"tolerance_seconds" real DEFAULT 0.75,
"detectors_used" jsonb,
"processing_time_ms" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "video_segments" (
"id" serial PRIMARY KEY NOT NULL,
"digest_id" integer NOT NULL,
"video_id" integer NOT NULL,
"segment_type" text NOT NULL,
"start_time" real NOT NULL,
"end_time" real NOT NULL,
"duration" real NOT NULL,
"tags" jsonb,
"transcript_snippet" text,
"vocal_category" text,
"position_change" text,
"dominant_position" text,
"interest_score" real DEFAULT 0,
"has_eye_contact" boolean DEFAULT false,
"has_full_sentence" boolean DEFAULT false,
"is_climax_moment" boolean DEFAULT false,
"captioned" boolean DEFAULT false,
"caption_text" text,
"title" text,
"keyframe_path" text,
"keyframe_timestamp" real,
"is_included" boolean DEFAULT true,
"sequence_order" integer,
"is_hook" boolean DEFAULT false,
"include_in_clips" boolean DEFAULT true,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "video_tag_timeline" (
"id" serial PRIMARY KEY NOT NULL,
"video_id" integer NOT NULL,
"digest_id" integer NOT NULL,
"timestamp" real NOT NULL,
"tags" jsonb NOT NULL,
"dominant_position" text,
"performer_count" integer,
"intensity" integer,
"has_dialogue" boolean DEFAULT false,
"has_eye_contact" boolean DEFAULT false,
"frame_path" text,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "video_tags" (
"id" serial PRIMARY KEY NOT NULL,
"video_id" integer NOT NULL,
"tag_id" integer NOT NULL,
"confidence" integer,
"source" text DEFAULT 'manual' NOT NULL,
"digest_id" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "videos" (
"id" serial PRIMARY KEY NOT NULL,
"path" text NOT NULL,
"filename" text NOT NULL,
"producer" text,
"creator" text,
"title" text,
"duration_seconds" integer,
"quality" text,
"orientation" text,
"has_audio" boolean DEFAULT true,
"file_size" bigint,
"file_hash" text,
"width" integer,
"height" integer,
"last_validated" timestamp with time zone,
"is_valid" boolean DEFAULT true,
"thumbnail_path" text,
"created_at" timestamp with time zone DEFAULT now(),
"tags" jsonb,
"directory_type" text,
"public_view_count" integer,
"public_upvote_count" integer,
"public_comment_count" integer,
"public_completion_count" integer,
"public_total_watch_time" integer,
"moved_from_public_at" timestamp with time zone,
"original_filename" text,
"original_path" text,
"standardized_at" timestamp with time zone,
CONSTRAINT "videos_path_unique" UNIQUE("path")
);
--> statement-breakpoint
CREATE TABLE "views" (
"id" serial PRIMARY KEY NOT NULL,
"media_id" integer NOT NULL,
"session_id" text NOT NULL,
"watch_time_seconds" integer DEFAULT 0,
"last_updated" timestamp with time zone DEFAULT now(),
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "watch_party_chat_messages" (
"id" serial PRIMARY KEY NOT NULL,
"party_id" integer NOT NULL,
"user_id" integer NOT NULL,
"content" text NOT NULL,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "watch_party_invites" (
"id" serial PRIMARY KEY NOT NULL,
"party_id" integer NOT NULL,
"from_user_id" integer NOT NULL,
"to_user_id" integer NOT NULL,
"status" text DEFAULT 'pending' NOT NULL,
"created_at" timestamp with time zone DEFAULT now(),
"responded_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "watch_party_participants" (
"id" serial PRIMARY KEY NOT NULL,
"party_id" integer NOT NULL,
"user_id" integer NOT NULL,
"is_connected" boolean DEFAULT false,
"is_kicked" boolean DEFAULT false,
"joined_at" timestamp with time zone DEFAULT now(),
"left_at" timestamp with time zone
);
--> statement-breakpoint
CREATE TABLE "watch_party_reactions" (
"id" serial PRIMARY KEY NOT NULL,
"party_id" integer NOT NULL,
"user_id" integer NOT NULL,
"reaction_type" text NOT NULL,
"video_timestamp" integer,
"created_at" timestamp with time zone DEFAULT now()
);
--> statement-breakpoint
CREATE TABLE "watch_party_sessions" (
"id" serial PRIMARY KEY NOT NULL,
"host_id" integer NOT NULL,
"media_id" integer NOT NULL,
"invite_code" text NOT NULL,
"status" text DEFAULT 'waiting' NOT NULL,
"current_time" integer DEFAULT 0,
"is_playing" boolean DEFAULT false,
"max_participants" integer DEFAULT 20,
"allow_chat" boolean DEFAULT true,
"created_at" timestamp with time zone DEFAULT now(),
"started_at" timestamp with time zone,
"ended_at" timestamp with time zone,
"summary_stats" jsonb,
CONSTRAINT "watch_party_sessions_invite_code_unique" UNIQUE("invite_code")
);
--> statement-breakpoint
ALTER TABLE "ad_clicks" ADD CONSTRAINT "ad_clicks_ad_id_ads_id_fk" FOREIGN KEY ("ad_id") REFERENCES "public"."ads"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "ad_impressions" ADD CONSTRAINT "ad_impressions_ad_id_ads_id_fk" FOREIGN KEY ("ad_id") REFERENCES "public"."ads"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "close_friends" ADD CONSTRAINT "close_friends_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "close_friends" ADD CONSTRAINT "close_friends_close_friend_id_users_id_fk" FOREIGN KEY ("close_friend_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "geo_blocking_rules" ADD CONSTRAINT "geo_blocking_rules_created_by_users_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "invoices" ADD CONSTRAINT "invoices_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "invoices" ADD CONSTRAINT "invoices_plan_id_subscription_plans_id_fk" FOREIGN KEY ("plan_id") REFERENCES "public"."subscription_plans"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "notification_preferences" ADD CONSTRAINT "notification_preferences_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "notifications" ADD CONSTRAINT "notifications_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "notifications" ADD CONSTRAINT "notifications_actor_id_users_id_fk" FOREIGN KEY ("actor_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_payment_id_payments_id_fk" FOREIGN KEY ("payment_id") REFERENCES "public"."payments"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_invoice_id_invoices_id_fk" FOREIGN KEY ("invoice_id") REFERENCES "public"."invoices"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "payment_audit_log" ADD CONSTRAINT "payment_audit_log_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "payments" ADD CONSTRAINT "payments_invoice_id_invoices_id_fk" FOREIGN KEY ("invoice_id") REFERENCES "public"."invoices"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "payments" ADD CONSTRAINT "payments_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "performer_discrepancies" ADD CONSTRAINT "performer_discrepancies_video_id_videos_id_fk" FOREIGN KEY ("video_id") REFERENCES "public"."videos"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "performer_discrepancies" ADD CONSTRAINT "performer_discrepancies_digest_id_video_digests_id_fk" FOREIGN KEY ("digest_id") REFERENCES "public"."video_digests"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "performer_discrepancies" ADD CONSTRAINT "performer_discrepancies_detected_performer_id_creators_id_fk" FOREIGN KEY ("detected_performer_id") REFERENCES "public"."creators"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "performer_discrepancies" ADD CONSTRAINT "performer_discrepancies_resolved_by_users_id_fk" FOREIGN KEY ("resolved_by") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "pipeline_step_events" ADD CONSTRAINT "pipeline_step_events_step_id_pipeline_steps_id_fk" FOREIGN KEY ("step_id") REFERENCES "public"."pipeline_steps"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "pipeline_steps" ADD CONSTRAINT "pipeline_steps_pipeline_id_pipelines_id_fk" FOREIGN KEY ("pipeline_id") REFERENCES "public"."pipelines"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "privacy_settings" ADD CONSTRAINT "privacy_settings_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "published_inbox_files" ADD CONSTRAINT "published_inbox_files_public_media_id_public_media_id_fk" FOREIGN KEY ("public_media_id") REFERENCES "public"."public_media"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "user_subscriptions" ADD CONSTRAINT "user_subscriptions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "user_subscriptions" ADD CONSTRAINT "user_subscriptions_plan_id_subscription_plans_id_fk" FOREIGN KEY ("plan_id") REFERENCES "public"."subscription_plans"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_chat_messages" ADD CONSTRAINT "watch_party_chat_messages_party_id_watch_party_sessions_id_fk" FOREIGN KEY ("party_id") REFERENCES "public"."watch_party_sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_chat_messages" ADD CONSTRAINT "watch_party_chat_messages_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_invites" ADD CONSTRAINT "watch_party_invites_party_id_watch_party_sessions_id_fk" FOREIGN KEY ("party_id") REFERENCES "public"."watch_party_sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_invites" ADD CONSTRAINT "watch_party_invites_from_user_id_users_id_fk" FOREIGN KEY ("from_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_invites" ADD CONSTRAINT "watch_party_invites_to_user_id_users_id_fk" FOREIGN KEY ("to_user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_participants" ADD CONSTRAINT "watch_party_participants_party_id_watch_party_sessions_id_fk" FOREIGN KEY ("party_id") REFERENCES "public"."watch_party_sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_participants" ADD CONSTRAINT "watch_party_participants_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_reactions" ADD CONSTRAINT "watch_party_reactions_party_id_watch_party_sessions_id_fk" FOREIGN KEY ("party_id") REFERENCES "public"."watch_party_sessions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_reactions" ADD CONSTRAINT "watch_party_reactions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_sessions" ADD CONSTRAINT "watch_party_sessions_host_id_users_id_fk" FOREIGN KEY ("host_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
ALTER TABLE "watch_party_sessions" ADD CONSTRAINT "watch_party_sessions_media_id_public_media_id_fk" FOREIGN KEY ("media_id") REFERENCES "public"."public_media"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
CREATE INDEX "idx_ad_clicks_ad" ON "ad_clicks" USING btree ("ad_id");--> statement-breakpoint
CREATE INDEX "idx_ad_clicks_session" ON "ad_clicks" USING btree ("session_id");--> statement-breakpoint
CREATE INDEX "idx_ad_clicks_date" ON "ad_clicks" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_ad_impressions_ad" ON "ad_impressions" USING btree ("ad_id");--> statement-breakpoint
CREATE INDEX "idx_ad_impressions_session" ON "ad_impressions" USING btree ("session_id");--> statement-breakpoint
CREATE INDEX "idx_ad_impressions_date" ON "ad_impressions" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_ads_type" ON "ads" USING btree ("type");--> statement-breakpoint
CREATE INDEX "idx_ads_is_active" ON "ads" USING btree ("is_active");--> statement-breakpoint
CREATE INDEX "idx_ads_visibility" ON "ads" USING btree ("visibility");--> statement-breakpoint
CREATE INDEX "idx_auth_tokens_token" ON "auth_tokens" USING btree ("token");--> statement-breakpoint
CREATE INDEX "idx_auth_tokens_user" ON "auth_tokens" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_chat_thread_read_unique" ON "chat_thread_read_status" USING btree ("user_id","media_id");--> statement-breakpoint
CREATE INDEX "idx_chat_thread_read_user" ON "chat_thread_read_status" USING btree ("user_id");--> statement-breakpoint
CREATE UNIQUE INDEX "idx_close_friends_unique" ON "close_friends" USING btree ("user_id","close_friend_id");--> statement-breakpoint
CREATE INDEX "idx_close_friends_user" ON "close_friends" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_comment_moderation_comment" ON "comment_moderation" USING btree ("comment_id");--> statement-breakpoint
CREATE INDEX "idx_comment_moderation_status" ON "comment_moderation" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_comments_media" ON "comments" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_comments_session" ON "comments" USING btree ("session_id");--> statement-breakpoint
CREATE INDEX "idx_comments_user" ON "comments" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_comments_safety_status" ON "comments" USING btree ("safety_status");--> statement-breakpoint
CREATE INDEX "idx_comments_is_hidden" ON "comments" USING btree ("is_hidden");--> statement-breakpoint
CREATE INDEX "idx_content_reports_media" ON "content_reports" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_content_reports_status" ON "content_reports" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_content_reports_session" ON "content_reports" USING btree ("session_id");--> statement-breakpoint
CREATE INDEX "idx_content_reports_created" ON "content_reports" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_creators_name" ON "creators" USING btree ("name");--> statement-breakpoint
CREATE INDEX "idx_creators_slug" ON "creators" USING btree ("slug");--> statement-breakpoint
CREATE INDEX "idx_creators_gender" ON "creators" USING btree ("gender");--> statement-breakpoint
CREATE INDEX "idx_creators_tag" ON "creators" USING btree ("tag_id");--> statement-breakpoint
CREATE INDEX "idx_creators_public" ON "creators" USING btree ("is_public");--> statement-breakpoint
CREATE INDEX "idx_digest_clip_tags_clip" ON "digest_clip_tags" USING btree ("clip_id");--> statement-breakpoint
CREATE INDEX "idx_digest_clip_tags_tag" ON "digest_clip_tags" USING btree ("tag_id");--> statement-breakpoint
CREATE INDEX "idx_digest_clip_tags_unique" ON "digest_clip_tags" USING btree ("clip_id","tag_id");--> statement-breakpoint
CREATE INDEX "idx_digest_compilations_digest" ON "digest_compilations" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_digest_compilations_video" ON "digest_compilations" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_digest_compilations_status" ON "digest_compilations" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_digest_compilations_folder" ON "digest_compilations" USING btree ("folder_id");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_clips_selected" ON "digest_generated_clips" USING btree ("selected_clip_id");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_clips_digest" ON "digest_generated_clips" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_clips_status" ON "digest_generated_clips" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_clips_folder" ON "digest_generated_clips" USING btree ("folder_id");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_scenes_digest" ON "digest_generated_scenes" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_scenes_video" ON "digest_generated_scenes" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_scenes_folder" ON "digest_generated_scenes" USING btree ("folder_id");--> statement-breakpoint
CREATE INDEX "idx_digest_generated_scenes_path" ON "digest_generated_scenes" USING btree ("scene_path");--> statement-breakpoint
CREATE INDEX "idx_digest_output_folders_digest" ON "digest_output_folders" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_digest_output_folders_video" ON "digest_output_folders" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_digest_output_folders_path" ON "digest_output_folders" USING btree ("folder_path");--> statement-breakpoint
CREATE INDEX "idx_digest_selected_clips_digest" ON "digest_selected_clips" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_digest_selected_clips_video" ON "digest_selected_clips" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_digest_selected_clips_type" ON "digest_selected_clips" USING btree ("clip_type");--> statement-breakpoint
CREATE INDEX "idx_digest_selected_clips_source" ON "digest_selected_clips" USING btree ("source");--> statement-breakpoint
CREATE INDEX "idx_digest_selected_clips_sequence" ON "digest_selected_clips" USING btree ("sequence_order");--> statement-breakpoint
CREATE INDEX "idx_digest_selected_clips_is_hook" ON "digest_selected_clips" USING btree ("is_hook");--> statement-breakpoint
CREATE INDEX "idx_digest_selected_clips_hook_source" ON "digest_selected_clips" USING btree ("hook_source_clip_id");--> statement-breakpoint
CREATE INDEX "idx_digest_suggested_tags_digest" ON "digest_suggested_tags" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_digest_suggested_tags_video" ON "digest_suggested_tags" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_digest_suggested_tags_status" ON "digest_suggested_tags" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_digest_suggested_tags_cat_val" ON "digest_suggested_tags" USING btree ("suggested_category","suggested_value");--> statement-breakpoint
CREATE INDEX "idx_digest_video_tags_digest" ON "digest_video_tags" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_digest_video_tags_video" ON "digest_video_tags" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_digest_video_tags_category" ON "digest_video_tags" USING btree ("category");--> statement-breakpoint
CREATE INDEX "idx_digest_video_tags_value" ON "digest_video_tags" USING btree ("value");--> statement-breakpoint
CREATE INDEX "idx_digest_video_tags_cat_val" ON "digest_video_tags" USING btree ("category","value");--> statement-breakpoint
CREATE INDEX "idx_email_change_tokens_token" ON "email_change_tokens" USING btree ("token");--> statement-breakpoint
CREATE INDEX "idx_email_change_tokens_user" ON "email_change_tokens" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_email_verification_tokens_token" ON "email_verification_tokens" USING btree ("token");--> statement-breakpoint
CREATE INDEX "idx_email_verification_tokens_user" ON "email_verification_tokens" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_featured_playlists_position" ON "featured_playlists" USING btree ("position");--> statement-breakpoint
CREATE INDEX "idx_friendships_user_friend" ON "friendships" USING btree ("user_id","friend_id");--> statement-breakpoint
CREATE INDEX "idx_friendships_user" ON "friendships" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_friendships_friend" ON "friendships" USING btree ("friend_id");--> statement-breakpoint
CREATE INDEX "idx_friendships_status" ON "friendships" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_geo_blocking_country" ON "geo_blocking_rules" USING btree ("country");--> statement-breakpoint
CREATE UNIQUE INDEX "idx_geo_blocking_unique" ON "geo_blocking_rules" USING btree ("country","region","city");--> statement-breakpoint
CREATE INDEX "idx_highlight_cooldowns_user" ON "highlight_cooldowns" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_invoices_user" ON "invoices" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_invoices_status" ON "invoices" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_invoices_due_date" ON "invoices" USING btree ("due_date");--> statement-breakpoint
CREATE INDEX "idx_invoices_number" ON "invoices" USING btree ("invoice_number");--> statement-breakpoint
CREATE INDEX "idx_jobs_queue" ON "jobs" USING btree ("status","priority","created_at");--> statement-breakpoint
CREATE INDEX "idx_jobs_resource" ON "jobs" USING btree ("resource_category","status");--> statement-breakpoint
CREATE INDEX "idx_jobs_pipeline" ON "jobs" USING btree ("pipeline_id");--> statement-breakpoint
CREATE INDEX "idx_moderation_word_lists_level" ON "moderation_word_lists" USING btree ("level");--> statement-breakpoint
CREATE INDEX "idx_moderation_word_lists_word" ON "moderation_word_lists" USING btree ("word");--> statement-breakpoint
CREATE INDEX "idx_notification_preferences_user" ON "notification_preferences" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_notifications_user_unread" ON "notifications" USING btree ("user_id","is_read");--> statement-breakpoint
CREATE INDEX "idx_notifications_user_created" ON "notifications" USING btree ("user_id","created_at");--> statement-breakpoint
CREATE INDEX "idx_notifications_type" ON "notifications" USING btree ("type");--> statement-breakpoint
CREATE INDEX "idx_notifications_created" ON "notifications" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_notifications_actor" ON "notifications" USING btree ("actor_id");--> statement-breakpoint
CREATE INDEX "idx_password_reset_tokens_token" ON "password_reset_tokens" USING btree ("token");--> statement-breakpoint
CREATE INDEX "idx_password_reset_tokens_user" ON "password_reset_tokens" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_payment_audit_payment" ON "payment_audit_log" USING btree ("payment_id");--> statement-breakpoint
CREATE INDEX "idx_payment_audit_invoice" ON "payment_audit_log" USING btree ("invoice_id");--> statement-breakpoint
CREATE INDEX "idx_payment_audit_user" ON "payment_audit_log" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_payment_audit_action" ON "payment_audit_log" USING btree ("action");--> statement-breakpoint
CREATE INDEX "idx_payment_audit_created" ON "payment_audit_log" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_payments_user" ON "payments" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_payments_invoice" ON "payments" USING btree ("invoice_id");--> statement-breakpoint
CREATE INDEX "idx_payments_status" ON "payments" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_payments_sender_email" ON "payments" USING btree ("sender_email");--> statement-breakpoint
CREATE INDEX "idx_payments_reference" ON "payments" USING btree ("reference_number");--> statement-breakpoint
CREATE INDEX "idx_payments_received_at" ON "payments" USING btree ("received_at");--> statement-breakpoint
CREATE INDEX "idx_discrepancies_video" ON "performer_discrepancies" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_discrepancies_digest" ON "performer_discrepancies" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_discrepancies_status" ON "performer_discrepancies" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_discrepancies_type" ON "performer_discrepancies" USING btree ("discrepancy_type");--> statement-breakpoint
CREATE INDEX "idx_discrepancies_detected_performer" ON "performer_discrepancies" USING btree ("detected_performer_id");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_performer" ON "performer_faces" USING btree ("performer_id");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_name" ON "performer_faces" USING btree ("performer_name");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_video" ON "performer_faces" USING btree ("source_video");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_gender" ON "performer_faces" USING btree ("gender");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_digest" ON "performer_faces" USING btree ("source_digest_id");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_crop" ON "performer_faces" USING btree ("face_crop_path");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_status" ON "performer_faces" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_faces_in_frame" ON "performer_faces" USING btree ("faces_in_frame");--> statement-breakpoint
CREATE INDEX "idx_performer_faces_det_score" ON "performer_faces" USING btree ("detection_score");--> statement-breakpoint
CREATE INDEX "idx_pipeline_step_events_step" ON "pipeline_step_events" USING btree ("step_id");--> statement-breakpoint
CREATE INDEX "idx_pipeline_step_events_created" ON "pipeline_step_events" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_pipeline_steps_pipeline" ON "pipeline_steps" USING btree ("pipeline_id");--> statement-breakpoint
CREATE INDEX "idx_pipeline_steps_sequence" ON "pipeline_steps" USING btree ("pipeline_id","sequence_order");--> statement-breakpoint
CREATE INDEX "idx_pipeline_steps_status" ON "pipeline_steps" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_pipeline_templates_name" ON "pipeline_templates" USING btree ("name");--> statement-breakpoint
CREATE INDEX "idx_pipelines_status" ON "pipelines" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_pipelines_priority" ON "pipelines" USING btree ("priority","created_at");--> statement-breakpoint
CREATE INDEX "idx_pipelines_heartbeat" ON "pipelines" USING btree ("last_heartbeat");--> statement-breakpoint
CREATE INDEX "idx_playlist_videos_playlist" ON "playlist_videos" USING btree ("playlist_id");--> statement-breakpoint
CREATE INDEX "idx_playlist_videos_media" ON "playlist_videos" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_playlist_videos_unique" ON "playlist_videos" USING btree ("playlist_id","media_id");--> statement-breakpoint
CREATE INDEX "idx_playlist_views_playlist" ON "playlist_views" USING btree ("playlist_id");--> statement-breakpoint
CREATE INDEX "idx_playlist_views_unique" ON "playlist_views" USING btree ("playlist_id","session_id");--> statement-breakpoint
CREATE INDEX "idx_playlists_user" ON "playlists" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_playlists_public" ON "playlists" USING btree ("is_public");--> statement-breakpoint
CREATE INDEX "idx_playlists_share_token" ON "playlists" USING btree ("share_token");--> statement-breakpoint
CREATE UNIQUE INDEX "idx_playlists_user_name" ON "playlists" USING btree ("user_id","name");--> statement-breakpoint
CREATE INDEX "idx_pokes_to_user" ON "pokes" USING btree ("to_user_id");--> statement-breakpoint
CREATE INDEX "idx_pokes_from_user" ON "pokes" USING btree ("from_user_id");--> statement-breakpoint
CREATE INDEX "idx_privacy_settings_user" ON "privacy_settings" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_public_media_category" ON "public_media" USING btree ("category");--> statement-breakpoint
CREATE INDEX "idx_public_media_path" ON "public_media" USING btree ("path");--> statement-breakpoint
CREATE INDEX "idx_public_media_is_locked" ON "public_media" USING btree ("is_locked");--> statement-breakpoint
CREATE INDEX "idx_public_media_position" ON "public_media" USING btree ("position");--> statement-breakpoint
CREATE INDEX "idx_public_media_uploader" ON "public_media" USING btree ("uploader_id");--> statement-breakpoint
CREATE INDEX "idx_public_media_category_date" ON "public_media" USING btree ("category","created_at");--> statement-breakpoint
CREATE INDEX "idx_public_media_orientation" ON "public_media" USING btree ("orientation");--> statement-breakpoint
CREATE INDEX "idx_public_media_category_locked_date" ON "public_media" USING btree ("category","is_locked","created_at");--> statement-breakpoint
CREATE INDEX "idx_public_media_performers_media" ON "public_media_performers" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_public_media_performers_performer" ON "public_media_performers" USING btree ("performer_id");--> statement-breakpoint
CREATE UNIQUE INDEX "idx_public_media_performers_unique" ON "public_media_performers" USING btree ("media_id","performer_id");--> statement-breakpoint
CREATE INDEX "idx_public_media_tags_media" ON "public_media_tags" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_public_media_tags_tag" ON "public_media_tags" USING btree ("tag_id");--> statement-breakpoint
CREATE INDEX "idx_public_media_tags_unique" ON "public_media_tags" USING btree ("media_id","tag_id");--> statement-breakpoint
CREATE INDEX "idx_published_inbox_source" ON "published_inbox_files" USING btree ("source_inbox_path");--> statement-breakpoint
CREATE INDEX "idx_published_inbox_file_type" ON "published_inbox_files" USING btree ("file_type");--> statement-breakpoint
CREATE UNIQUE INDEX "idx_rate_limits_key" ON "rate_limits" USING btree ("key");--> statement-breakpoint
CREATE INDEX "idx_rate_limits_reset_at" ON "rate_limits" USING btree ("reset_at");--> statement-breakpoint
CREATE INDEX "idx_resource_snapshots_created" ON "resource_snapshots" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_resource_snapshots_pipeline" ON "resource_snapshots" USING btree ("pipeline_id");--> statement-breakpoint
CREATE INDEX "idx_session_bans_session" ON "session_bans" USING btree ("session_id");--> statement-breakpoint
CREATE INDEX "idx_sessions_user_id" ON "sessions" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_sessions_country" ON "sessions" USING btree ("country");--> statement-breakpoint
CREATE INDEX "idx_tag_categories_display_order" ON "tag_categories" USING btree ("display_order");--> statement-breakpoint
CREATE INDEX "idx_tag_gen_status" ON "tag_generation_jobs" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_tag_gen_content_type" ON "tag_generation_jobs" USING btree ("content_type");--> statement-breakpoint
CREATE INDEX "idx_tag_gen_created_at" ON "tag_generation_jobs" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_tags_category" ON "tags" USING btree ("category_id");--> statement-breakpoint
CREATE INDEX "idx_tags_display_order" ON "tags" USING btree ("display_order");--> statement-breakpoint
CREATE INDEX "idx_tags_unique_name" ON "tags" USING btree ("category_id","name");--> statement-breakpoint
CREATE INDEX "idx_upload_invites_code" ON "upload_invites" USING btree ("code");--> statement-breakpoint
CREATE INDEX "idx_upload_invites_status" ON "upload_invites" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_upload_invites_created_by" ON "upload_invites" USING btree ("created_by");--> statement-breakpoint
CREATE INDEX "idx_upvotes_unique" ON "upvotes" USING btree ("media_id","session_id");--> statement-breakpoint
CREATE INDEX "idx_upvotes_media" ON "upvotes" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_user_achievements_user" ON "user_achievements" USING btree ("user_id");--> statement-breakpoint
CREATE UNIQUE INDEX "idx_user_achievements_unique" ON "user_achievements" USING btree ("user_id","achievement_id");--> statement-breakpoint
CREATE INDEX "idx_user_blocks_unique" ON "user_blocks" USING btree ("user_id","blocked_user_id");--> statement-breakpoint
CREATE INDEX "idx_user_blocks_user" ON "user_blocks" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_daily_activity_unique" ON "user_daily_activity" USING btree ("user_id","activity_date");--> statement-breakpoint
CREATE INDEX "idx_user_finishes_user" ON "user_finishes" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_finishes_date" ON "user_finishes" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_user_gallery_user" ON "user_gallery_images" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_gallery_position" ON "user_gallery_images" USING btree ("user_id","position");--> statement-breakpoint
CREATE INDEX "idx_user_presence_online" ON "user_presence" USING btree ("is_online");--> statement-breakpoint
CREATE INDEX "idx_user_presence_user" ON "user_presence" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_social_links_user" ON "user_social_links" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_social_links_position" ON "user_social_links" USING btree ("user_id","position");--> statement-breakpoint
CREATE UNIQUE INDEX "idx_user_subscriptions_user" ON "user_subscriptions" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_subscriptions_status" ON "user_subscriptions" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_user_subscriptions_end_date" ON "user_subscriptions" USING btree ("end_date");--> statement-breakpoint
CREATE INDEX "idx_user_tag_preferences_user" ON "user_tag_preferences" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_tag_preferences_tag" ON "user_tag_preferences" USING btree ("tag_id");--> statement-breakpoint
CREATE INDEX "idx_user_tag_preferences_unique" ON "user_tag_preferences" USING btree ("user_id","tag_id");--> statement-breakpoint
CREATE INDEX "idx_user_upload_suggested_tags_upload" ON "user_upload_suggested_tags" USING btree ("upload_id");--> statement-breakpoint
CREATE INDEX "idx_user_upload_suggested_tags_tag" ON "user_upload_suggested_tags" USING btree ("tag_id");--> statement-breakpoint
CREATE INDEX "idx_user_upload_suggested_tags_unique" ON "user_upload_suggested_tags" USING btree ("upload_id","tag_id");--> statement-breakpoint
CREATE INDEX "idx_user_uploads_user" ON "user_uploads" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_user_uploads_status" ON "user_uploads" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_user_uploads_created" ON "user_uploads" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_user_uploads_invite" ON "user_uploads" USING btree ("upload_invite_id");--> statement-breakpoint
CREATE INDEX "idx_users_email" ON "users" USING btree ("email");--> statement-breakpoint
CREATE INDEX "idx_users_username" ON "users" USING btree ("username");--> statement-breakpoint
CREATE INDEX "idx_users_status" ON "users" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_users_trusted" ON "users" USING btree ("is_trusted");--> statement-breakpoint
CREATE INDEX "idx_users_subscription_status" ON "users" USING btree ("subscription_status");--> statement-breakpoint
CREATE INDEX "idx_video_digests_video" ON "video_digests" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_video_digests_status" ON "video_digests" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_video_digests_created" ON "video_digests" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_video_ocr_results_digest" ON "video_ocr_results" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_video_ocr_results_video" ON "video_ocr_results" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_video_reactions_user_media_type" ON "video_reactions" USING btree ("user_id","media_id","reaction_type");--> statement-breakpoint
CREATE INDEX "idx_video_reactions_media_timestamp" ON "video_reactions" USING btree ("media_id","video_timestamp");--> statement-breakpoint
CREATE INDEX "idx_video_reactions_media" ON "video_reactions" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_video_reactions_created" ON "video_reactions" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_video_recommendations_to_user" ON "video_recommendations" USING btree ("to_user_id");--> statement-breakpoint
CREATE INDEX "idx_video_recommendations_from_user" ON "video_recommendations" USING btree ("from_user_id");--> statement-breakpoint
CREATE INDEX "idx_video_recommendations_media" ON "video_recommendations" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_video_scene_cuts_video" ON "video_scene_cuts" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_video_segments_digest" ON "video_segments" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_video_segments_video" ON "video_segments" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_video_segments_type" ON "video_segments" USING btree ("segment_type");--> statement-breakpoint
CREATE INDEX "idx_video_segments_time" ON "video_segments" USING btree ("video_id","start_time");--> statement-breakpoint
CREATE INDEX "idx_video_segments_included" ON "video_segments" USING btree ("digest_id","is_included");--> statement-breakpoint
CREATE INDEX "idx_video_segments_sequence" ON "video_segments" USING btree ("digest_id","sequence_order");--> statement-breakpoint
CREATE INDEX "idx_video_segments_clips" ON "video_segments" USING btree ("digest_id","include_in_clips");--> statement-breakpoint
CREATE INDEX "idx_video_tag_timeline_video" ON "video_tag_timeline" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_video_tag_timeline_digest" ON "video_tag_timeline" USING btree ("digest_id");--> statement-breakpoint
CREATE INDEX "idx_video_tag_timeline_timestamp" ON "video_tag_timeline" USING btree ("video_id","timestamp");--> statement-breakpoint
CREATE INDEX "idx_video_tag_timeline_position" ON "video_tag_timeline" USING btree ("dominant_position");--> statement-breakpoint
CREATE INDEX "idx_video_tags_video" ON "video_tags" USING btree ("video_id");--> statement-breakpoint
CREATE INDEX "idx_video_tags_tag" ON "video_tags" USING btree ("tag_id");--> statement-breakpoint
CREATE INDEX "idx_video_tags_source" ON "video_tags" USING btree ("source");--> statement-breakpoint
CREATE INDEX "idx_video_tags_unique" ON "video_tags" USING btree ("video_id","tag_id");--> statement-breakpoint
CREATE INDEX "idx_orientation" ON "videos" USING btree ("orientation");--> statement-breakpoint
CREATE INDEX "idx_producer" ON "videos" USING btree ("producer");--> statement-breakpoint
CREATE INDEX "idx_is_valid" ON "videos" USING btree ("is_valid");--> statement-breakpoint
CREATE INDEX "idx_directory_type" ON "videos" USING btree ("directory_type");--> statement-breakpoint
CREATE INDEX "idx_videos_fingerprint" ON "videos" USING btree ("duration_seconds","file_size","width","height");--> statement-breakpoint
CREATE INDEX "idx_videos_directory_valid_orientation" ON "videos" USING btree ("directory_type","is_valid","orientation");--> statement-breakpoint
CREATE INDEX "idx_views_unique" ON "views" USING btree ("media_id","session_id");--> statement-breakpoint
CREATE INDEX "idx_views_media" ON "views" USING btree ("media_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_chat_party" ON "watch_party_chat_messages" USING btree ("party_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_chat_created" ON "watch_party_chat_messages" USING btree ("created_at");--> statement-breakpoint
CREATE INDEX "idx_watch_party_invites_party" ON "watch_party_invites" USING btree ("party_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_invites_to_user" ON "watch_party_invites" USING btree ("to_user_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_invites_from_user" ON "watch_party_invites" USING btree ("from_user_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_invites_status" ON "watch_party_invites" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_watch_party_participants_party" ON "watch_party_participants" USING btree ("party_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_participants_user" ON "watch_party_participants" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_participants_unique" ON "watch_party_participants" USING btree ("party_id","user_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_reactions_party" ON "watch_party_reactions" USING btree ("party_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_reactions_user" ON "watch_party_reactions" USING btree ("user_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_sessions_host" ON "watch_party_sessions" USING btree ("host_id");--> statement-breakpoint
CREATE INDEX "idx_watch_party_sessions_invite" ON "watch_party_sessions" USING btree ("invite_code");--> statement-breakpoint
CREATE INDEX "idx_watch_party_sessions_status" ON "watch_party_sessions" USING btree ("status");--> statement-breakpoint
CREATE INDEX "idx_watch_party_sessions_created" ON "watch_party_sessions" USING btree ("created_at");