CREATE TABLE "alerts" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "product_id" uuid NOT NULL, "type" text NOT NULL, "config" jsonb NOT NULL, "enabled" boolean DEFAULT true NOT NULL, "last_triggered_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "alert_type_check" CHECK ("alerts"."type" in ('target_price','all_time_low','percent_drop')) ); --> statement-breakpoint CREATE TABLE "price_snapshots" ( "id" bigserial PRIMARY KEY NOT NULL, "product_id" uuid NOT NULL, "price" numeric(10, 2), "currency" text DEFAULT 'EUR' NOT NULL, "availability" text, "error" text, "scraped_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "products" ( "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, "url" text NOT NULL, "shop" text NOT NULL, "name" text NOT NULL, "image_url" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "enabled" boolean DEFAULT true NOT NULL, "last_scraped_at" timestamp with time zone, "consecutive_failures" integer DEFAULT 0 NOT NULL, CONSTRAINT "products_url_unique" UNIQUE("url"), CONSTRAINT "shop_check" CHECK ("products"."shop" in ('amazon','idealo','geizhals')) ); --> statement-breakpoint ALTER TABLE "alerts" ADD CONSTRAINT "alerts_product_id_products_id_fk" FOREIGN KEY ("product_id") REFERENCES "public"."products"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "price_snapshots" ADD CONSTRAINT "price_snapshots_product_id_products_id_fk" FOREIGN KEY ("product_id") REFERENCES "public"."products"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint CREATE INDEX "snapshots_product_scraped_idx" ON "price_snapshots" USING btree ("product_id","scraped_at" DESC NULLS LAST);