CREATE TABLE IF NOT EXISTS "two_factor" ( "id" text PRIMARY KEY NOT NULL, "secret" text NOT NULL, "backup_codes" json, "user_id" text NOT NULL, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "twofa_sessions" ( "id" text PRIMARY KEY NOT NULL, "user_id" text NOT NULL, "session_id" text NOT NULL, "verification_token" text NOT NULL, "code_used" text, "status" varchar(16) NOT NULL, "attempts" integer DEFAULT 0 NOT NULL, "max_attempts" integer DEFAULT 5 NOT NULL, "verified_at" timestamp, "expires_at" timestamp NOT NULL, "created_at" timestamp NOT NULL, "ip_address" text DEFAULT '', "user_agent" text DEFAULT '', CONSTRAINT "twofa_sessions_verification_token_unique" UNIQUE("verification_token") ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "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, "refresh_token_expires_at" timestamp, "scope" text, "password" text, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp NOT NULL ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "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 DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL, "username" text, "display_username" text, "role" text, "banned" boolean DEFAULT false, "ban_reason" text, "ban_expires" timestamp, "onboarding_done" boolean DEFAULT false, "last2_fa_verified_at" timestamp, "parent_id" text, CONSTRAINT "user_email_unique" UNIQUE("email"), CONSTRAINT "user_username_unique" UNIQUE("username") ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "verification" ( "id" text PRIMARY KEY NOT NULL, "identifier" text NOT NULL, "value" text NOT NULL, "expires_at" timestamp NOT NULL, "created_at" timestamp DEFAULT now() NOT NULL, "updated_at" timestamp DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE IF NOT EXISTS "notifications" ( "id" serial PRIMARY KEY NOT NULL, "title" text NOT NULL, "body" text NOT NULL, "priority" varchar(12) DEFAULT 'normal' NOT NULL, "type" varchar(12) NOT NULL, "category" varchar(64), "is_read" boolean DEFAULT false NOT NULL, "is_archived" boolean DEFAULT false NOT NULL, "action_url" text, "action_type" varchar(16), "action_data" json, "icon" varchar(64), "user_id" text NOT NULL, "sent_at" timestamp NOT NULL, "read_at" timestamp, "expires_at" timestamp, "created_at" timestamp NOT NULL, "updated_at" timestamp NOT NULL ); --> statement-breakpoint DO $$ BEGIN ALTER TABLE "two_factor" ADD CONSTRAINT "two_factor_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN ALTER TABLE "twofa_sessions" ADD CONSTRAINT "twofa_sessions_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN 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; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint DO $$ BEGIN ALTER TABLE "notifications" ADD CONSTRAINT "notifications_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action; EXCEPTION WHEN duplicate_object THEN null; END $$; --> statement-breakpoint CREATE INDEX IF NOT EXISTS "account_userId_idx" ON "account" USING btree ("user_id");--> statement-breakpoint CREATE INDEX IF NOT EXISTS "verification_identifier_idx" ON "verification" USING btree ("identifier");