CI / quality (push) Waiting to run
- Add lib/db (schema, postgres.js client, enums, seed, migrations) on Drizzle - Rewrite all lib and admin action queries from Prisma to Drizzle - Keep existing table/column names so no data migration is needed - Preserve signed-cookie admin auth unchanged - Map unique-violation handling from Prisma P2002 to SQLSTATE 23505 - Swap deps, scripts, Makefile, and Dockerfile from Prisma to Drizzle
125 lines
5.8 KiB
SQL
125 lines
5.8 KiB
SQL
CREATE TYPE "public"."MediaKind" AS ENUM('IMAGE', 'DOCUMENT');--> statement-breakpoint
|
|
CREATE TYPE "public"."MediaSource" AS ENUM('UPLOAD', 'EXTERNAL');--> statement-breakpoint
|
|
CREATE TYPE "public"."MediaUsageType" AS ENUM('PORTFOLIO_COVER', 'PORTFOLIO_SECTION', 'PORTFOLIO_ASSET', 'GENERIC');--> statement-breakpoint
|
|
CREATE TYPE "public"."PortfolioAssetKind" AS ENUM('IMAGE', 'DOCUMENT');--> statement-breakpoint
|
|
CREATE TYPE "public"."PortfolioProjectViewMode" AS ENUM('GRID', 'STORY', 'CASE_STUDY');--> statement-breakpoint
|
|
CREATE TYPE "public"."PortfolioSectionType" AS ENUM('RICH_TEXT', 'GALLERY', 'STATS', 'DELIVERABLES', 'LINK');--> statement-breakpoint
|
|
CREATE TABLE "AppConfig" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"key" text NOT NULL,
|
|
"value" text NOT NULL,
|
|
"createdAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
CONSTRAINT "AppConfig_key_unique" UNIQUE("key")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "Category" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"slug" text NOT NULL,
|
|
"nameAr" text NOT NULL,
|
|
"nameEn" text NOT NULL,
|
|
"nameDe" text NOT NULL,
|
|
"descriptionAr" text NOT NULL,
|
|
"descriptionEn" text NOT NULL,
|
|
"descriptionDe" text NOT NULL,
|
|
"sortOrder" integer DEFAULT 0 NOT NULL,
|
|
"isActive" boolean DEFAULT true NOT NULL,
|
|
"createdAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
CONSTRAINT "Category_slug_unique" UNIQUE("slug")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "MediaAsset" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"source" "MediaSource" NOT NULL,
|
|
"kind" "MediaKind" NOT NULL,
|
|
"url" text NOT NULL,
|
|
"fileName" text NOT NULL,
|
|
"label" text NOT NULL,
|
|
"altText" text,
|
|
"mimeType" text,
|
|
"size" integer,
|
|
"createdAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp (3) DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "MediaUsage" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"assetId" text NOT NULL,
|
|
"usageType" "MediaUsageType" NOT NULL,
|
|
"entityType" text NOT NULL,
|
|
"entityId" text NOT NULL,
|
|
"fieldKey" text NOT NULL,
|
|
"createdAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp (3) DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "PortfolioAsset" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"projectId" text NOT NULL,
|
|
"kind" "PortfolioAssetKind" NOT NULL,
|
|
"filePath" text NOT NULL,
|
|
"altAr" text NOT NULL,
|
|
"altEn" text NOT NULL,
|
|
"altDe" text NOT NULL,
|
|
"sortOrder" integer DEFAULT 0 NOT NULL,
|
|
"createdAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp (3) DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "PortfolioProject" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"categoryId" text NOT NULL,
|
|
"slug" text NOT NULL,
|
|
"viewMode" "PortfolioProjectViewMode" DEFAULT 'GRID' NOT NULL,
|
|
"titleAr" text NOT NULL,
|
|
"titleEn" text NOT NULL,
|
|
"titleDe" text NOT NULL,
|
|
"summaryAr" text NOT NULL,
|
|
"summaryEn" text NOT NULL,
|
|
"summaryDe" text NOT NULL,
|
|
"clientName" text NOT NULL,
|
|
"projectYear" integer NOT NULL,
|
|
"serviceLabelAr" text NOT NULL,
|
|
"serviceLabelEn" text NOT NULL,
|
|
"serviceLabelDe" text NOT NULL,
|
|
"previewUrl" text,
|
|
"coverImagePath" text,
|
|
"isFeatured" boolean DEFAULT false NOT NULL,
|
|
"isPublished" boolean DEFAULT false NOT NULL,
|
|
"publishedAt" timestamp (3),
|
|
"sortOrder" integer DEFAULT 0 NOT NULL,
|
|
"createdAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
CONSTRAINT "PortfolioProject_slug_unique" UNIQUE("slug")
|
|
);
|
|
--> statement-breakpoint
|
|
CREATE TABLE "PortfolioSection" (
|
|
"id" text PRIMARY KEY NOT NULL,
|
|
"projectId" text NOT NULL,
|
|
"type" "PortfolioSectionType" NOT NULL,
|
|
"titleAr" text NOT NULL,
|
|
"titleEn" text NOT NULL,
|
|
"titleDe" text NOT NULL,
|
|
"bodyAr" text NOT NULL,
|
|
"bodyEn" text NOT NULL,
|
|
"bodyDe" text NOT NULL,
|
|
"imagePath" text,
|
|
"linkUrl" text,
|
|
"sortOrder" integer DEFAULT 0 NOT NULL,
|
|
"createdAt" timestamp (3) DEFAULT now() NOT NULL,
|
|
"updatedAt" timestamp (3) DEFAULT now() NOT NULL
|
|
);
|
|
--> statement-breakpoint
|
|
ALTER TABLE "MediaUsage" ADD CONSTRAINT "MediaUsage_assetId_MediaAsset_id_fk" FOREIGN KEY ("assetId") REFERENCES "public"."MediaAsset"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "PortfolioAsset" ADD CONSTRAINT "PortfolioAsset_projectId_PortfolioProject_id_fk" FOREIGN KEY ("projectId") REFERENCES "public"."PortfolioProject"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "PortfolioProject" ADD CONSTRAINT "PortfolioProject_categoryId_Category_id_fk" FOREIGN KEY ("categoryId") REFERENCES "public"."Category"("id") ON DELETE restrict ON UPDATE no action;--> statement-breakpoint
|
|
ALTER TABLE "PortfolioSection" ADD CONSTRAINT "PortfolioSection_projectId_PortfolioProject_id_fk" FOREIGN KEY ("projectId") REFERENCES "public"."PortfolioProject"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
CREATE INDEX "MediaAsset_kind_createdAt_idx" ON "MediaAsset" USING btree ("kind","createdAt");--> statement-breakpoint
|
|
CREATE UNIQUE INDEX "MediaUsage_usageType_entityType_entityId_fieldKey_key" ON "MediaUsage" USING btree ("usageType","entityType","entityId","fieldKey");--> statement-breakpoint
|
|
CREATE INDEX "MediaUsage_assetId_idx" ON "MediaUsage" USING btree ("assetId");--> statement-breakpoint
|
|
CREATE INDEX "MediaUsage_entityType_entityId_idx" ON "MediaUsage" USING btree ("entityType","entityId");--> statement-breakpoint
|
|
CREATE INDEX "PortfolioAsset_projectId_sortOrder_idx" ON "PortfolioAsset" USING btree ("projectId","sortOrder");--> statement-breakpoint
|
|
CREATE INDEX "PortfolioProject_categoryId_isPublished_sortOrder_idx" ON "PortfolioProject" USING btree ("categoryId","isPublished","sortOrder");--> statement-breakpoint
|
|
CREATE INDEX "PortfolioProject_isPublished_sortOrder_idx" ON "PortfolioProject" USING btree ("isPublished","sortOrder");--> statement-breakpoint
|
|
CREATE INDEX "PortfolioSection_projectId_sortOrder_idx" ON "PortfolioSection" USING btree ("projectId","sortOrder"); |