CREATE TYPE "public"."media_kind" AS ENUM('IMAGE', 'DOCUMENT');--> statement-breakpoint CREATE TYPE "public"."media_source" AS ENUM('UPLOAD', 'EXTERNAL');--> statement-breakpoint CREATE TYPE "public"."media_usage_type" AS ENUM('PORTFOLIO_COVER', 'PORTFOLIO_SECTION', 'PORTFOLIO_ASSET', 'GENERIC');--> statement-breakpoint CREATE TYPE "public"."portfolio_asset_kind" AS ENUM('IMAGE', 'DOCUMENT');--> statement-breakpoint CREATE TYPE "public"."portfolio_project_view_mode" AS ENUM('GRID', 'STORY', 'CASE_STUDY');--> statement-breakpoint CREATE TYPE "public"."portfolio_section_type" AS ENUM('RICH_TEXT', 'GALLERY', 'STATS', 'DELIVERABLES', 'LINK');--> statement-breakpoint CREATE TABLE "app_config" ( "id" text PRIMARY KEY NOT NULL, "key" text NOT NULL, "value" text NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "app_config_key_unique" UNIQUE("key") ); --> statement-breakpoint CREATE TABLE "category" ( "id" text PRIMARY KEY NOT NULL, "slug" text NOT NULL, "name_ar" text NOT NULL, "name_en" text NOT NULL, "name_de" text NOT NULL, "description_ar" text NOT NULL, "description_en" text NOT NULL, "description_de" text NOT NULL, "sort_order" integer DEFAULT 0 NOT NULL, "is_active" boolean DEFAULT true NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "category_slug_unique" UNIQUE("slug") ); --> statement-breakpoint CREATE TABLE "media_asset" ( "id" text PRIMARY KEY NOT NULL, "source" "media_source" NOT NULL, "kind" "media_kind" NOT NULL, "url" text NOT NULL, "file_name" text NOT NULL, "label" text NOT NULL, "alt_text" text, "mime_type" text, "size" integer, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL ); --> statement-breakpoint CREATE TABLE "media_usage" ( "id" text PRIMARY KEY NOT NULL, "asset_id" text NOT NULL, "usage_type" "media_usage_type" NOT NULL, "entity_type" text NOT NULL, "entity_id" text NOT NULL, "field_key" text 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 "portfolio_asset" ( "id" text PRIMARY KEY NOT NULL, "project_id" text NOT NULL, "kind" "portfolio_asset_kind" NOT NULL, "file_path" text NOT NULL, "alt_ar" text NOT NULL, "alt_en" text NOT NULL, "alt_de" text NOT NULL, "sort_order" integer DEFAULT 0 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 "portfolio_project" ( "id" text PRIMARY KEY NOT NULL, "category_id" text NOT NULL, "slug" text NOT NULL, "view_mode" "portfolio_project_view_mode" DEFAULT 'GRID' NOT NULL, "title_ar" text NOT NULL, "title_en" text NOT NULL, "title_de" text NOT NULL, "summary_ar" text NOT NULL, "summary_en" text NOT NULL, "summary_de" text NOT NULL, "client_name" text NOT NULL, "project_year" integer NOT NULL, "service_label_ar" text NOT NULL, "service_label_en" text NOT NULL, "service_label_de" text NOT NULL, "preview_url" text, "cover_image_path" text, "is_featured" boolean DEFAULT false NOT NULL, "is_published" boolean DEFAULT false NOT NULL, "published_at" timestamp with time zone, "sort_order" integer DEFAULT 0 NOT NULL, "created_at" timestamp with time zone DEFAULT now() NOT NULL, "updated_at" timestamp with time zone DEFAULT now() NOT NULL, CONSTRAINT "portfolio_project_slug_unique" UNIQUE("slug") ); --> statement-breakpoint CREATE TABLE "portfolio_section" ( "id" text PRIMARY KEY NOT NULL, "project_id" text NOT NULL, "type" "portfolio_section_type" NOT NULL, "title_ar" text NOT NULL, "title_en" text NOT NULL, "title_de" text NOT NULL, "body_ar" text NOT NULL, "body_en" text NOT NULL, "body_de" text NOT NULL, "image_path" text, "link_url" text, "sort_order" integer DEFAULT 0 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 "media_usage" ADD CONSTRAINT "media_usage_asset_id_media_asset_id_fk" FOREIGN KEY ("asset_id") REFERENCES "public"."media_asset"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "portfolio_asset" ADD CONSTRAINT "portfolio_asset_project_id_portfolio_project_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."portfolio_project"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "portfolio_project" ADD CONSTRAINT "portfolio_project_category_id_category_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."category"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint ALTER TABLE "portfolio_section" ADD CONSTRAINT "portfolio_section_project_id_portfolio_project_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."portfolio_project"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint CREATE INDEX "media_asset_kind_created_idx" ON "media_asset" USING btree ("kind","created_at");--> statement-breakpoint CREATE UNIQUE INDEX "media_usage_unique_slot" ON "media_usage" USING btree ("usage_type","entity_type","entity_id","field_key");--> statement-breakpoint CREATE INDEX "media_usage_asset_idx" ON "media_usage" USING btree ("asset_id");--> statement-breakpoint CREATE INDEX "media_usage_entity_idx" ON "media_usage" USING btree ("entity_type","entity_id");--> statement-breakpoint CREATE INDEX "portfolio_asset_project_sort_idx" ON "portfolio_asset" USING btree ("project_id","sort_order");--> statement-breakpoint CREATE INDEX "portfolio_project_category_published_sort_idx" ON "portfolio_project" USING btree ("category_id","is_published","sort_order");--> statement-breakpoint CREATE INDEX "portfolio_project_published_sort_idx" ON "portfolio_project" USING btree ("is_published","sort_order");--> statement-breakpoint CREATE INDEX "portfolio_section_project_sort_idx" ON "portfolio_section" USING btree ("project_id","sort_order");