generated from fahricansecer/boilerplate-be
402 lines
14 KiB
SQL
402 lines
14 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "ProjectStatus" AS ENUM ('DRAFT', 'GENERATING_SCRIPT', 'PENDING', 'GENERATING_MEDIA', 'RENDERING', 'COMPLETED', 'FAILED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "AspectRatio" AS ENUM ('PORTRAIT_9_16', 'SQUARE_1_1', 'LANDSCAPE_16_9');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "VideoStyle" AS ENUM ('CINEMATIC', 'DOCUMENTARY', 'EDUCATIONAL', 'STORYTELLING', 'NEWS', 'PROMOTIONAL', 'ARTISTIC', 'MINIMALIST');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "MediaType" AS ENUM ('VIDEO_CLIP', 'AUDIO_NARRATION', 'AUDIO_MUSIC', 'SUBTITLE', 'THUMBNAIL', 'FINAL_VIDEO');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "TransitionType" AS ENUM ('CUT', 'FADE', 'DISSOLVE', 'SLIDE_LEFT', 'SLIDE_RIGHT', 'SLIDE_UP', 'ZOOM_IN', 'ZOOM_OUT', 'WIPE');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "RenderJobStatus" AS ENUM ('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED', 'CANCELLED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "RenderStage" AS ENUM ('VIDEO_GENERATION', 'TTS_GENERATION', 'MUSIC_GENERATION', 'MEDIA_MERGE', 'SUBTITLE_OVERLAY', 'FINALIZATION', 'UPLOAD');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Project" (
|
|
"id" TEXT NOT NULL,
|
|
"title" VARCHAR(200) NOT NULL,
|
|
"description" VARCHAR(1000),
|
|
"prompt" VARCHAR(2000) NOT NULL,
|
|
"scriptJson" JSONB,
|
|
"scriptVersion" INTEGER NOT NULL DEFAULT 0,
|
|
"language" VARCHAR(5) NOT NULL DEFAULT 'tr',
|
|
"aspectRatio" "AspectRatio" NOT NULL DEFAULT 'PORTRAIT_9_16',
|
|
"videoStyle" "VideoStyle" NOT NULL DEFAULT 'CINEMATIC',
|
|
"targetDuration" INTEGER NOT NULL DEFAULT 60,
|
|
"status" "ProjectStatus" NOT NULL DEFAULT 'DRAFT',
|
|
"progress" INTEGER NOT NULL DEFAULT 0,
|
|
"errorMessage" TEXT,
|
|
"finalVideoUrl" TEXT,
|
|
"thumbnailUrl" TEXT,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"viewCount" INTEGER NOT NULL DEFAULT 0,
|
|
"isTemplate" BOOLEAN NOT NULL DEFAULT false,
|
|
"templateId" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"completedAt" TIMESTAMP(3),
|
|
"deletedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Project_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Scene" (
|
|
"id" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL,
|
|
"title" VARCHAR(200),
|
|
"narrationText" TEXT NOT NULL,
|
|
"visualPrompt" TEXT NOT NULL,
|
|
"subtitleText" TEXT,
|
|
"duration" DOUBLE PRECISION NOT NULL DEFAULT 5.0,
|
|
"transitionType" "TransitionType" NOT NULL DEFAULT 'CUT',
|
|
"projectId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Scene_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "MediaAsset" (
|
|
"id" TEXT NOT NULL,
|
|
"type" "MediaType" NOT NULL,
|
|
"s3Key" TEXT,
|
|
"s3Bucket" VARCHAR(100),
|
|
"url" TEXT,
|
|
"fileName" VARCHAR(255),
|
|
"mimeType" VARCHAR(100),
|
|
"sizeBytes" BIGINT,
|
|
"durationMs" INTEGER,
|
|
"aiProvider" VARCHAR(50),
|
|
"aiJobId" TEXT,
|
|
"projectId" TEXT NOT NULL,
|
|
"sceneId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "MediaAsset_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "RenderJob" (
|
|
"id" TEXT NOT NULL,
|
|
"status" "RenderJobStatus" NOT NULL DEFAULT 'QUEUED',
|
|
"currentStage" "RenderStage",
|
|
"queueName" VARCHAR(100) NOT NULL DEFAULT 'video-generation',
|
|
"bullJobId" VARCHAR(100),
|
|
"attemptNumber" INTEGER NOT NULL DEFAULT 1,
|
|
"maxAttempts" INTEGER NOT NULL DEFAULT 3,
|
|
"workerHostname" VARCHAR(100),
|
|
"processingTimeMs" INTEGER,
|
|
"errorMessage" TEXT,
|
|
"finalVideoUrl" TEXT,
|
|
"finalVideoS3Key" TEXT,
|
|
"projectId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"startedAt" TIMESTAMP(3),
|
|
"completedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "RenderJob_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "RenderLog" (
|
|
"id" TEXT NOT NULL,
|
|
"stage" "RenderStage" NOT NULL,
|
|
"level" VARCHAR(10) NOT NULL DEFAULT 'info',
|
|
"message" TEXT NOT NULL,
|
|
"durationMs" INTEGER,
|
|
"metadata" JSONB,
|
|
"renderJobId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "RenderLog_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Template" (
|
|
"id" TEXT NOT NULL,
|
|
"title" VARCHAR(200) NOT NULL,
|
|
"description" VARCHAR(500),
|
|
"thumbnailUrl" TEXT,
|
|
"previewVideoUrl" TEXT,
|
|
"category" VARCHAR(50) NOT NULL DEFAULT 'general',
|
|
"tags" TEXT[],
|
|
"language" VARCHAR(5) NOT NULL DEFAULT 'tr',
|
|
"originalProjectId" TEXT NOT NULL,
|
|
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
"rating" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
"ratingCount" INTEGER NOT NULL DEFAULT 0,
|
|
"isFeatured" BOOLEAN NOT NULL DEFAULT false,
|
|
"isPublished" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Template_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "TemplateUsage" (
|
|
"id" TEXT NOT NULL,
|
|
"templateId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"clonedProjectId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "TemplateUsage_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Plan" (
|
|
"id" TEXT NOT NULL,
|
|
"name" VARCHAR(50) NOT NULL,
|
|
"displayName" VARCHAR(100) NOT NULL,
|
|
"description" VARCHAR(500),
|
|
"monthlyPrice" INTEGER NOT NULL DEFAULT 0,
|
|
"yearlyPrice" INTEGER,
|
|
"currency" VARCHAR(3) NOT NULL DEFAULT 'usd',
|
|
"monthlyCredits" INTEGER NOT NULL DEFAULT 3,
|
|
"maxDuration" INTEGER NOT NULL DEFAULT 30,
|
|
"maxResolution" VARCHAR(10) NOT NULL DEFAULT '720p',
|
|
"maxProjects" INTEGER NOT NULL DEFAULT 5,
|
|
"stripePriceId" VARCHAR(100),
|
|
"stripeYearlyPriceId" VARCHAR(100),
|
|
"features" JSONB,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"sortOrder" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Plan_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Subscription" (
|
|
"id" TEXT NOT NULL,
|
|
"status" VARCHAR(20) NOT NULL DEFAULT 'active',
|
|
"stripeSubscriptionId" VARCHAR(100),
|
|
"stripeCustomerId" VARCHAR(100),
|
|
"currentPeriodStart" TIMESTAMP(3),
|
|
"currentPeriodEnd" TIMESTAMP(3),
|
|
"cancelAtPeriodEnd" BOOLEAN NOT NULL DEFAULT false,
|
|
"userId" TEXT NOT NULL,
|
|
"planId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"canceledAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Subscription_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CreditTransaction" (
|
|
"id" TEXT NOT NULL,
|
|
"amount" INTEGER NOT NULL,
|
|
"type" VARCHAR(30) NOT NULL,
|
|
"description" VARCHAR(200),
|
|
"userId" TEXT NOT NULL,
|
|
"projectId" TEXT,
|
|
"balanceAfter" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "CreditTransaction_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "UserPreference" (
|
|
"id" TEXT NOT NULL,
|
|
"defaultLanguage" VARCHAR(5) NOT NULL DEFAULT 'tr',
|
|
"defaultVideoStyle" "VideoStyle" NOT NULL DEFAULT 'CINEMATIC',
|
|
"defaultDuration" INTEGER NOT NULL DEFAULT 60,
|
|
"theme" VARCHAR(10) NOT NULL DEFAULT 'dark',
|
|
"emailNotifications" BOOLEAN NOT NULL DEFAULT true,
|
|
"pushNotifications" BOOLEAN NOT NULL DEFAULT true,
|
|
"userId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "UserPreference_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Notification" (
|
|
"id" TEXT NOT NULL,
|
|
"type" VARCHAR(30) NOT NULL,
|
|
"title" VARCHAR(200) NOT NULL,
|
|
"message" TEXT,
|
|
"isRead" BOOLEAN NOT NULL DEFAULT false,
|
|
"metadata" JSONB,
|
|
"userId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"readAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Notification_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Project_userId_idx" ON "Project"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Project_status_idx" ON "Project"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Project_isTemplate_idx" ON "Project"("isTemplate");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Project_createdAt_idx" ON "Project"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Scene_projectId_idx" ON "Scene"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Scene_order_idx" ON "Scene"("order");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "MediaAsset_projectId_idx" ON "MediaAsset"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "MediaAsset_sceneId_idx" ON "MediaAsset"("sceneId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "MediaAsset_type_idx" ON "MediaAsset"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RenderJob_projectId_idx" ON "RenderJob"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RenderJob_status_idx" ON "RenderJob"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RenderJob_bullJobId_idx" ON "RenderJob"("bullJobId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RenderLog_renderJobId_idx" ON "RenderLog"("renderJobId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RenderLog_stage_idx" ON "RenderLog"("stage");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Template_originalProjectId_key" ON "Template"("originalProjectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_category_idx" ON "Template"("category");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_language_idx" ON "Template"("language");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_isFeatured_idx" ON "Template"("isFeatured");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_usageCount_idx" ON "Template"("usageCount");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TemplateUsage_templateId_idx" ON "TemplateUsage"("templateId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TemplateUsage_userId_idx" ON "TemplateUsage"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Plan_name_key" ON "Plan"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Plan_name_idx" ON "Plan"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Plan_isActive_idx" ON "Plan"("isActive");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Subscription_stripeSubscriptionId_key" ON "Subscription"("stripeSubscriptionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subscription_userId_idx" ON "Subscription"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subscription_planId_idx" ON "Subscription"("planId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subscription_stripeSubscriptionId_idx" ON "Subscription"("stripeSubscriptionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subscription_status_idx" ON "Subscription"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CreditTransaction_userId_idx" ON "CreditTransaction"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CreditTransaction_type_idx" ON "CreditTransaction"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CreditTransaction_createdAt_idx" ON "CreditTransaction"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "UserPreference_userId_key" ON "UserPreference"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "UserPreference_userId_idx" ON "UserPreference"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Notification_userId_idx" ON "Notification"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Notification_isRead_idx" ON "Notification"("isRead");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Notification_createdAt_idx" ON "Notification"("createdAt");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Project" ADD CONSTRAINT "Project_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Project" ADD CONSTRAINT "Project_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Scene" ADD CONSTRAINT "Scene_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MediaAsset" ADD CONSTRAINT "MediaAsset_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MediaAsset" ADD CONSTRAINT "MediaAsset_sceneId_fkey" FOREIGN KEY ("sceneId") REFERENCES "Scene"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "RenderJob" ADD CONSTRAINT "RenderJob_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "RenderLog" ADD CONSTRAINT "RenderLog_renderJobId_fkey" FOREIGN KEY ("renderJobId") REFERENCES "RenderJob"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Template" ADD CONSTRAINT "Template_originalProjectId_fkey" FOREIGN KEY ("originalProjectId") REFERENCES "Project"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "TemplateUsage" ADD CONSTRAINT "TemplateUsage_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "TemplateUsage" ADD CONSTRAINT "TemplateUsage_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_planId_fkey" FOREIGN KEY ("planId") REFERENCES "Plan"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CreditTransaction" ADD CONSTRAINT "CreditTransaction_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "UserPreference" ADD CONSTRAINT "UserPreference_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Notification" ADD CONSTRAINT "Notification_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|