CREATE TABLE "api_keys" ( "id" serial PRIMARY KEY NOT NULL, "name" text NOT NULL, "key_hash" text NOT NULL, "key_prefix" text NOT NULL, "user_id" integer NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "categories" ( "id" serial PRIMARY KEY NOT NULL, "name" text NOT NULL, "icon" text DEFAULT 'package' NOT NULL, "user_id" integer NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, CONSTRAINT "categories_user_id_name_unique" UNIQUE("user_id","name") ); --> statement-breakpoint CREATE TABLE "items" ( "id" serial PRIMARY KEY NOT NULL, "name" text NOT NULL, "weight_grams" double precision, "price_cents" integer, "category_id" integer NOT NULL, "user_id" integer NOT NULL, "notes" text, "product_url" text, "image_filename" text, "image_source_url" text, "quantity" integer DEFAULT 1 NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "oauth_clients" ( "id" serial PRIMARY KEY NOT NULL, "client_id" text NOT NULL, "client_name" text, "redirect_uris" text NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, CONSTRAINT "oauth_clients_client_id_unique" UNIQUE("client_id") ); --> statement-breakpoint CREATE TABLE "oauth_codes" ( "id" serial PRIMARY KEY NOT NULL, "code" text NOT NULL, "client_id" text NOT NULL, "code_challenge" text NOT NULL, "code_challenge_method" text DEFAULT 'S256' NOT NULL, "redirect_uri" text NOT NULL, "expires_at" timestamp NOT NULL, "used" integer DEFAULT 0 NOT NULL, CONSTRAINT "oauth_codes_code_unique" UNIQUE("code") ); --> statement-breakpoint CREATE TABLE "oauth_tokens" ( "id" serial PRIMARY KEY NOT NULL, "access_token_hash" text NOT NULL, "refresh_token_hash" text NOT NULL, "client_id" text NOT NULL, "user_id" integer NOT NULL, "expires_at" timestamp NOT NULL, "refresh_expires_at" timestamp NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, CONSTRAINT "oauth_tokens_access_token_hash_unique" UNIQUE("access_token_hash"), CONSTRAINT "oauth_tokens_refresh_token_hash_unique" UNIQUE("refresh_token_hash") ); --> statement-breakpoint CREATE TABLE "settings" ( "user_id" integer NOT NULL, "key" text NOT NULL, "value" text NOT NULL, CONSTRAINT "settings_user_id_key_pk" PRIMARY KEY("user_id","key") ); --> statement-breakpoint CREATE TABLE "setup_items" ( "id" serial PRIMARY KEY NOT NULL, "setup_id" integer NOT NULL, "item_id" integer NOT NULL, "classification" text DEFAULT 'base' NOT NULL ); --> statement-breakpoint CREATE TABLE "setups" ( "id" serial PRIMARY KEY NOT NULL, "name" text NOT NULL, "user_id" integer NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "thread_candidates" ( "id" serial PRIMARY KEY NOT NULL, "thread_id" integer NOT NULL, "name" text NOT NULL, "weight_grams" double precision, "price_cents" integer, "category_id" integer NOT NULL, "notes" text, "product_url" text, "image_filename" text, "image_source_url" text, "status" text DEFAULT 'researching' NOT NULL, "pros" text, "cons" text, "sort_order" double precision DEFAULT 0 NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "threads" ( "id" serial PRIMARY KEY NOT NULL, "name" text NOT NULL, "status" text DEFAULT 'active' NOT NULL, "resolved_candidate_id" integer, "category_id" integer NOT NULL, "user_id" integer NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "users" ( "id" serial PRIMARY KEY NOT NULL, "logto_sub" text NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, CONSTRAINT "users_logto_sub_unique" UNIQUE("logto_sub") ); --> statement-breakpoint ALTER TABLE "api_keys" ADD CONSTRAINT "api_keys_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 "categories" ADD CONSTRAINT "categories_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 "items" ADD CONSTRAINT "items_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."categories"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "items" ADD CONSTRAINT "items_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 "oauth_tokens" ADD CONSTRAINT "oauth_tokens_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 "settings" ADD CONSTRAINT "settings_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 "setup_items" ADD CONSTRAINT "setup_items_setup_id_setups_id_fk" FOREIGN KEY ("setup_id") REFERENCES "public"."setups"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "setup_items" ADD CONSTRAINT "setup_items_item_id_items_id_fk" FOREIGN KEY ("item_id") REFERENCES "public"."items"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "setups" ADD CONSTRAINT "setups_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 "thread_candidates" ADD CONSTRAINT "thread_candidates_thread_id_threads_id_fk" FOREIGN KEY ("thread_id") REFERENCES "public"."threads"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "thread_candidates" ADD CONSTRAINT "thread_candidates_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."categories"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "threads" ADD CONSTRAINT "threads_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."categories"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE "threads" ADD CONSTRAINT "threads_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;