CREATE TABLE "account" ( "id" text PRIMARY KEY NOT NULL, "account_id" text NOT NULL, "provider_id" text NOT NULL, "user_id" text NOT NULL, "access_token" text, "refresh_token" text, "id_token" text, "access_token_expires_at" timestamp with time zone, "refresh_token_expires_at" timestamp with time zone, "scope" text, "password" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "comments" ( "id" text PRIMARY KEY NOT NULL, "feed_id" text NOT NULL, "author_id" text NOT NULL, "content" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "feed_states" ( "user_id" text NOT NULL, "feed_id" text NOT NULL, "saved" boolean DEFAULT false NOT NULL, "interested" boolean, "summary" text, "translation" text, "language" text, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "feed_states_user_id_feed_id_pk" PRIMARY KEY("user_id","feed_id") ); --> statement-breakpoint CREATE TABLE "feeds" ( "id" text PRIMARY KEY NOT NULL, "author_id" text NOT NULL, "title" text NOT NULL, "url" text, "content" text NOT NULL, "summary" text, "kind" text NOT NULL, "origin" text DEFAULT 'user' NOT NULL, "is_public" boolean DEFAULT false NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "forwards" ( "feed_id" text NOT NULL, "from_user_id" text NOT NULL, "to_user_id" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "forwards_feed_id_from_user_id_to_user_id_pk" PRIMARY KEY("feed_id","from_user_id","to_user_id") ); --> statement-breakpoint CREATE TABLE "profiles" ( "user_id" text PRIMARY KEY NOT NULL, "preferences" text DEFAULT '' NOT NULL, "learned_preferences" text DEFAULT '' NOT NULL, "version" integer DEFAULT 0 NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "rss_items" ( "subscription_id" text NOT NULL, "item_key" text NOT NULL, "matched" boolean NOT NULL, "feed_id" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "rss_items_subscription_id_item_key_pk" PRIMARY KEY("subscription_id","item_key") ); --> statement-breakpoint CREATE TABLE "session" ( "id" text PRIMARY KEY NOT NULL, "expires_at" timestamp with time zone NOT NULL, "token" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "ip_address" text, "user_agent" text, "user_id" text NOT NULL, "impersonated_by" text, CONSTRAINT "session_token_unique" UNIQUE("token") ); --> statement-breakpoint CREATE TABLE "subscriptions" ( "id" text PRIMARY KEY NOT NULL, "user_id" text NOT NULL, "url" text NOT NULL, "title" text NOT NULL, "enabled" boolean DEFAULT true NOT NULL, "last_checked_at" timestamp with time zone, "last_error" text, "lease_until" timestamp with time zone, "lease_token" text, "next_poll_at" timestamp with time zone DEFAULT now() NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "threads" ( "id" text PRIMARY KEY NOT NULL, "user_id" text NOT NULL, "title" text DEFAULT 'New conversation' NOT NULL, "messages" jsonb DEFAULT '[]'::jsonb NOT NULL, "lease_until" timestamp with time zone, "lease_token" text, "next_poll_at" timestamp with time zone DEFAULT now() NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "user" ( "id" text PRIMARY KEY NOT NULL, "name" text NOT NULL, "email" text NOT NULL, "email_verified" boolean DEFAULT false NOT NULL, "image" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "username" text, "display_username" text, "role" text DEFAULT 'user' NOT NULL, "banned" boolean DEFAULT false, "ban_reason" text, "ban_expires" timestamp with time zone, CONSTRAINT "user_email_unique" UNIQUE("email"), CONSTRAINT "user_username_unique" UNIQUE("username") ); --> statement-breakpoint CREATE TABLE "verification" ( "id" text PRIMARY KEY NOT NULL, "identifier" text NOT NULL, "value" text NOT NULL, "expires_at" timestamp with time zone NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "comments" ADD CONSTRAINT "comments_feed_id_feeds_id_fk" FOREIGN KEY ("feed_id") REFERENCES "public"."feeds"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "comments" ADD CONSTRAINT "comments_author_id_user_id_fk" FOREIGN KEY ("author_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "feed_states" ADD CONSTRAINT "feed_states_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "feed_states" ADD CONSTRAINT "feed_states_feed_id_feeds_id_fk" FOREIGN KEY ("feed_id") REFERENCES "public"."feeds"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "feeds" ADD CONSTRAINT "feeds_author_id_user_id_fk" FOREIGN KEY ("author_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "forwards" ADD CONSTRAINT "forwards_feed_id_feeds_id_fk" FOREIGN KEY ("feed_id") REFERENCES "public"."feeds"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "forwards" ADD CONSTRAINT "forwards_from_user_id_user_id_fk" FOREIGN KEY ("from_user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "forwards" ADD CONSTRAINT "forwards_to_user_id_user_id_fk" FOREIGN KEY ("to_user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "profiles" ADD CONSTRAINT "profiles_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "rss_items" ADD CONSTRAINT "rss_items_subscription_id_subscriptions_id_fk" FOREIGN KEY ("subscription_id") REFERENCES "public"."subscriptions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "rss_items" ADD CONSTRAINT "rss_items_feed_id_feeds_id_fk" FOREIGN KEY ("feed_id") REFERENCES "public"."feeds"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint ALTER TABLE "session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "threads" ADD CONSTRAINT "threads_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint CREATE INDEX "account_user_idx" ON "account" USING btree ("user_id");--> statement-breakpoint CREATE INDEX "comments_feed_idx" ON "comments" USING btree ("feed_id");--> statement-breakpoint CREATE UNIQUE INDEX "feeds_public_url_idx" ON "feeds" USING btree ("url") WHERE "feeds"."is_public" = true AND "feeds"."url" IS NOT NULL;--> statement-breakpoint CREATE UNIQUE INDEX "feeds_author_url_idx" ON "feeds" USING btree ("author_id","url") WHERE "feeds"."url" IS NOT NULL;--> statement-breakpoint CREATE INDEX "feeds_created_idx" ON "feeds" USING btree ("created_at");--> statement-breakpoint CREATE INDEX "forwards_recipient_idx" ON "forwards" USING btree ("to_user_id");--> statement-breakpoint CREATE INDEX "session_user_idx" ON "session" USING btree ("user_id");--> statement-breakpoint CREATE UNIQUE INDEX "subscriptions_user_url_idx" ON "subscriptions" USING btree ("user_id","url");--> statement-breakpoint CREATE INDEX "threads_user_idx" ON "threads" USING btree ("user_id");