-- Hand-added to the generated migration: drizzle-kit does not emit extension -- statements, but frame_embeddings.embedding is vector(512) and its index is -- ivfflat, so this migration cannot apply to a database without pgvector. A -- committed migration has to stand on its own - relying on whoever set the -- database up having run this first is how a deploy fails. -- -- Safe to keep across regeneration: drizzle only ever appends new files, and -- the diffing snapshot lives in meta/0000_snapshot.json, not here. CREATE EXTENSION IF NOT EXISTS vector; --> statement-breakpoint DO $$ BEGIN CREATE TYPE "public"."printer_status" AS ENUM('offline', 'idle', 'printing', 'paused', 'error', 'maintenance'); EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN CREATE TYPE "public"."printer_vendor" AS ENUM('bambu', 'prusa', 'klipper'); EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN CREATE TYPE "public"."print_job_status" AS ENUM('queued', 'uploading', 'printing', 'paused', 'completed', 'failed', 'cancelled'); EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint CREATE TABLE IF NOT EXISTS "farms" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "name" text NOT NULL, "owner_id" uuid NOT NULL, "edge_proxy_token" text NOT NULL, "location" text, "settings" jsonb DEFAULT '{}'::jsonb, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "printers" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "farm_id" uuid NOT NULL, "name" text NOT NULL, "vendor" "printer_vendor" NOT NULL, "status" "printer_status" DEFAULT 'offline' NOT NULL, "lan_address" text, "serial_number" text, "access_code" text, "gateway_printer_id" text, "nozzle_temp_c" real, "nozzle_target_temp_c" real, "bed_temp_c" real, "bed_target_temp_c" real, "progress_percent" integer, "current_layer" integer, "total_layers" integer, "remaining_minutes" integer, "current_job_name" text, "active_alerts" integer, "vendor_state" text, "vendor_error_code" integer, "metadata" jsonb DEFAULT '{}'::jsonb, "last_seen_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "print_jobs" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "farm_id" uuid NOT NULL, "printer_id" uuid, "file_name" text NOT NULL, "r2_object_key" text NOT NULL, "status" "print_job_status" DEFAULT 'queued' NOT NULL, "progress_pct" real DEFAULT 0 NOT NULL, "estimated_time_s" real, "elapsed_time_s" real, "submitted_by" uuid NOT NULL, "metadata" jsonb DEFAULT '{}'::jsonb, "started_at" timestamp with time zone, "completed_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "frame_embeddings" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "print_job_id" uuid NOT NULL, "printer_id" uuid NOT NULL, "r2_object_key" text NOT NULL, "embedding" vector(512) NOT NULL, "captured_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint DO $$ BEGIN ALTER TABLE "printers" ADD CONSTRAINT "printers_farm_id_farms_id_fk" FOREIGN KEY ("farm_id") REFERENCES "public"."farms"("id") ON DELETE cascade ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN ALTER TABLE "print_jobs" ADD CONSTRAINT "print_jobs_farm_id_farms_id_fk" FOREIGN KEY ("farm_id") REFERENCES "public"."farms"("id") ON DELETE cascade ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN ALTER TABLE "print_jobs" ADD CONSTRAINT "print_jobs_printer_id_printers_id_fk" FOREIGN KEY ("printer_id") REFERENCES "public"."printers"("id") ON DELETE set null ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN ALTER TABLE "frame_embeddings" ADD CONSTRAINT "frame_embeddings_print_job_id_print_jobs_id_fk" FOREIGN KEY ("print_job_id") REFERENCES "public"."print_jobs"("id") ON DELETE cascade ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN ALTER TABLE "frame_embeddings" ADD CONSTRAINT "frame_embeddings_printer_id_printers_id_fk" FOREIGN KEY ("printer_id") REFERENCES "public"."printers"("id") ON DELETE cascade ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint CREATE UNIQUE INDEX IF NOT EXISTS "printers_farm_gateway_printer_id_idx" ON "printers" USING btree ("farm_id","gateway_printer_id");--> statement-breakpoint CREATE INDEX IF NOT EXISTS "frame_embeddings_embedding_ivfflat_idx" ON "frame_embeddings" USING ivfflat ("embedding" vector_cosine_ops) WITH (lists=100);