CREATE TYPE "public"."media_type" AS ENUM('MOVIE', 'TV_SERIES', 'ANIME', 'VIDEO_GAME');--> statement-breakpoint CREATE TYPE "public"."metadata_provider" AS ENUM('TMDB', 'ANILIST', 'IGDB', 'MANUAL');--> statement-breakpoint CREATE TYPE "public"."reaction_type" AS ENUM('INTERESTED', 'ENDORSE');--> statement-breakpoint CREATE TYPE "public"."personal_recommendation_status" AS ENUM('PENDING', 'INTERESTED', 'IN_PROGRESS', 'COMPLETED', 'DROPPED', 'NOT_INTERESTED');--> statement-breakpoint CREATE TYPE "public"."recommendation_strength" AS ENUM('NORMAL', 'HIGH', 'MUST_EXPERIENCE');--> statement-breakpoint CREATE TYPE "public"."workspace_role" AS ENUM('ADMIN', 'MEMBER');--> statement-breakpoint 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 "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, CONSTRAINT "session_token_unique" UNIQUE("token") ); --> 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, "disabled_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "user_email_unique" UNIQUE("email") ); --> 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 CREATE TABLE "audit_log" ( "id" text PRIMARY KEY NOT NULL, "workspace_id" text, "actor_user_id" text, "action" text NOT NULL, "entity_type" text NOT NULL, "entity_id" text NOT NULL, "metadata" jsonb DEFAULT '{}'::jsonb NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "comment" ( "id" text PRIMARY KEY NOT NULL, "recommendation_id" text NOT NULL, "author_user_id" text NOT NULL, "body" text NOT NULL, "contains_spoilers" boolean DEFAULT false NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "media_item" ( "id" text PRIMARY KEY NOT NULL, "provider" "metadata_provider" NOT NULL, "external_id" text NOT NULL, "type" "media_type" NOT NULL, "title" text NOT NULL, "original_title" text, "description" text, "release_date" text, "release_year" integer, "poster_url" text, "backdrop_url" text, "runtime_minutes" integer, "genres" text[] DEFAULT '{}' NOT NULL, "metadata" jsonb DEFAULT '{}'::jsonb NOT NULL, "metadata_updated_at" timestamp with time zone, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "metadata_search_cache" ( "id" text PRIMARY KEY NOT NULL, "provider" "metadata_provider" NOT NULL, "media_type" "media_type" NOT NULL, "normalized_query" text NOT NULL, "response" jsonb 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 CREATE TABLE "recommendation_reaction" ( "recommendation_id" text NOT NULL, "user_id" text NOT NULL, "type" "reaction_type" NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "recommendation_reaction_recommendation_id_user_id_type_pk" PRIMARY KEY("recommendation_id","user_id","type") ); --> statement-breakpoint CREATE TABLE "recommendation_status" ( "recommendation_id" text NOT NULL, "user_id" text NOT NULL, "status" "personal_recommendation_status" DEFAULT 'PENDING' NOT NULL, "rating" integer, "review" text, "started_at" timestamp with time zone, "completed_at" timestamp with time zone, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "recommendation_status_recommendation_id_user_id_pk" PRIMARY KEY("recommendation_id","user_id") ); --> statement-breakpoint CREATE TABLE "recommendation" ( "id" text PRIMARY KEY NOT NULL, "workspace_id" text NOT NULL, "media_item_id" text NOT NULL, "recommended_by_user_id" text NOT NULL, "reason" text NOT NULL, "audience_note" text, "strength" "recommendation_strength" DEFAULT 'NORMAL' NOT NULL, "contains_spoilers" boolean DEFAULT false NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, "deleted_at" timestamp with time zone ); --> statement-breakpoint CREATE TABLE "workspace_invitation" ( "id" text PRIMARY KEY NOT NULL, "workspace_id" text NOT NULL, "email" text NOT NULL, "role" "workspace_role" DEFAULT 'MEMBER' NOT NULL, "token_hash" text NOT NULL, "expires_at" timestamp with time zone NOT NULL, "accepted_at" timestamp with time zone, "created_by_user_id" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "workspace_invitation_token_hash_unique" UNIQUE("token_hash") ); --> statement-breakpoint CREATE TABLE "workspace_member" ( "workspace_id" text NOT NULL, "user_id" text NOT NULL, "role" "workspace_role" DEFAULT 'MEMBER' NOT NULL, "joined_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, CONSTRAINT "workspace_member_workspace_id_user_id_pk" PRIMARY KEY("workspace_id","user_id") ); --> statement-breakpoint CREATE TABLE "workspace" ( "id" text PRIMARY KEY NOT NULL, "name" text NOT NULL, "slug" text NOT NULL, "description" text, "image_url" text, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "workspace_slug_unique" UNIQUE("slug") ); --> 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 "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 "audit_log" ADD CONSTRAINT "audit_log_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint ALTER TABLE "audit_log" ADD CONSTRAINT "audit_log_actor_user_id_user_id_fk" FOREIGN KEY ("actor_user_id") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action;--> statement-breakpoint ALTER TABLE "comment" ADD CONSTRAINT "comment_recommendation_id_recommendation_id_fk" FOREIGN KEY ("recommendation_id") REFERENCES "public"."recommendation"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "comment" ADD CONSTRAINT "comment_author_user_id_user_id_fk" FOREIGN KEY ("author_user_id") REFERENCES "public"."user"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint ALTER TABLE "recommendation_reaction" ADD CONSTRAINT "recommendation_reaction_recommendation_id_recommendation_id_fk" FOREIGN KEY ("recommendation_id") REFERENCES "public"."recommendation"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "recommendation_reaction" ADD CONSTRAINT "recommendation_reaction_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "recommendation_status" ADD CONSTRAINT "recommendation_status_recommendation_id_recommendation_id_fk" FOREIGN KEY ("recommendation_id") REFERENCES "public"."recommendation"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "recommendation_status" ADD CONSTRAINT "recommendation_status_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "recommendation" ADD CONSTRAINT "recommendation_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "recommendation" ADD CONSTRAINT "recommendation_media_item_id_media_item_id_fk" FOREIGN KEY ("media_item_id") REFERENCES "public"."media_item"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint ALTER TABLE "recommendation" ADD CONSTRAINT "recommendation_recommended_by_user_id_user_id_fk" FOREIGN KEY ("recommended_by_user_id") REFERENCES "public"."user"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint ALTER TABLE "workspace_invitation" ADD CONSTRAINT "workspace_invitation_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "workspace_invitation" ADD CONSTRAINT "workspace_invitation_created_by_user_id_user_id_fk" FOREIGN KEY ("created_by_user_id") REFERENCES "public"."user"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint ALTER TABLE "workspace_member" ADD CONSTRAINT "workspace_member_workspace_id_workspace_id_fk" FOREIGN KEY ("workspace_id") REFERENCES "public"."workspace"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "workspace_member" ADD CONSTRAINT "workspace_member_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_id_idx" ON "account" USING btree ("user_id");--> statement-breakpoint CREATE INDEX "session_user_id_idx" ON "session" USING btree ("user_id");--> statement-breakpoint CREATE INDEX "comment_recommendation_created_idx" ON "comment" USING btree ("recommendation_id","created_at");--> statement-breakpoint CREATE UNIQUE INDEX "media_item_provider_external_id_unique" ON "media_item" USING btree ("provider","external_id");--> statement-breakpoint CREATE INDEX "media_item_type_idx" ON "media_item" USING btree ("type");--> statement-breakpoint CREATE UNIQUE INDEX "metadata_search_cache_unique" ON "metadata_search_cache" USING btree ("provider","media_type","normalized_query");--> statement-breakpoint CREATE INDEX "recommendation_status_user_idx" ON "recommendation_status" USING btree ("user_id");--> statement-breakpoint CREATE UNIQUE INDEX "recommendation_workspace_media_unique" ON "recommendation" USING btree ("workspace_id","media_item_id");--> statement-breakpoint CREATE INDEX "recommendation_workspace_created_idx" ON "recommendation" USING btree ("workspace_id","created_at");--> statement-breakpoint CREATE UNIQUE INDEX "workspace_invitation_email_active_idx" ON "workspace_invitation" USING btree ("workspace_id","email");--> statement-breakpoint CREATE INDEX "workspace_invitation_workspace_idx" ON "workspace_invitation" USING btree ("workspace_id");--> statement-breakpoint CREATE INDEX "workspace_member_user_idx" ON "workspace_member" USING btree ("user_id");