- Rewrite tests/helpers/db.ts to use drizzle-orm/pglite with async createTestDb() - Generate initial migration with 13 CREATE TABLE statements in drizzle-pg/ - Add drizzle-pg to biome ignore list (generated files) - PGlite smoke test confirms migrations apply and seed works
133 lines
5.1 KiB
SQL
133 lines
5.1 KiB
SQL
CREATE TABLE "api_keys" (
|
|
"id" serial PRIMARY KEY NOT NULL,
|
|
"name" text NOT NULL,
|
|
"key_hash" text NOT NULL,
|
|
"key_prefix" text 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,
|
|
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
CONSTRAINT "categories_name_unique" UNIQUE("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,
|
|
"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" boolean DEFAULT false 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,
|
|
"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 "sessions" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"user_id" integer NOT NULL,
|
|
"expires_at" timestamp NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "settings" (
|
|
"key" text PRIMARY KEY NOT NULL,
|
|
"value" text NOT NULL
|
|
);
|
|
--> 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,
|
|
"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,
|
|
"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,
|
|
"username" text NOT NULL,
|
|
"password_hash" text NOT NULL,
|
|
"created_at" timestamp DEFAULT now() NOT NULL,
|
|
CONSTRAINT "users_username_unique" UNIQUE("username")
|
|
);
|
|
--> 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 "sessions" ADD CONSTRAINT "sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade 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 "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; |