38 lines
1.8 KiB
SQL
38 lines
1.8 KiB
SQL
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); |