546 lines
17 KiB
SQL
546 lines
17 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "EpisodeStatus" AS ENUM ('DRAFT', 'QUEUED', 'SCRIPTING', 'SYNTHESIZING', 'STITCHING', 'ART', 'SAVING', 'READY', 'FAILED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "EpisodeFormat" AS ENUM ('SOLO', 'INTERVIEW', 'MULTI_HOST');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "user" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"emailVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"image" TEXT,
|
|
"role" TEXT DEFAULT 'user',
|
|
"banned" BOOLEAN DEFAULT false,
|
|
"banReason" TEXT,
|
|
"banExpires" TIMESTAMP(3),
|
|
"stripeCustomerId" TEXT,
|
|
"paypalPayerId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "user_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "session" (
|
|
"id" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"token" TEXT NOT NULL,
|
|
"ipAddress" TEXT,
|
|
"userAgent" TEXT,
|
|
"activeOrganizationId" TEXT,
|
|
"impersonatedBy" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "session_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "account" (
|
|
"id" TEXT NOT NULL,
|
|
"accountId" TEXT NOT NULL,
|
|
"providerId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"accessToken" TEXT,
|
|
"refreshToken" TEXT,
|
|
"idToken" TEXT,
|
|
"accessTokenExpiresAt" TIMESTAMP(3),
|
|
"refreshTokenExpiresAt" TIMESTAMP(3),
|
|
"scope" TEXT,
|
|
"password" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "account_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "verification" (
|
|
"id" TEXT NOT NULL,
|
|
"identifier" TEXT NOT NULL,
|
|
"value" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "verification_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "organization" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"slug" TEXT,
|
|
"logo" TEXT,
|
|
"metadata" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "organization_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "member" (
|
|
"id" TEXT NOT NULL,
|
|
"organizationId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"teamId" TEXT,
|
|
"role" TEXT NOT NULL DEFAULT 'member',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "member_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "invitation" (
|
|
"id" TEXT NOT NULL,
|
|
"organizationId" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"role" TEXT,
|
|
"teamId" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"inviterId" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "invitation_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "team" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"organizationId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "team_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "org_branding" (
|
|
"organizationId" TEXT NOT NULL,
|
|
"brandName" TEXT,
|
|
"primaryColor" TEXT,
|
|
"logoUrl" TEXT,
|
|
"customDomain" TEXT,
|
|
"removePoweredBy" BOOLEAN NOT NULL DEFAULT false,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "org_branding_pkey" PRIMARY KEY ("organizationId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "subscription" (
|
|
"id" TEXT NOT NULL,
|
|
"plan" TEXT NOT NULL,
|
|
"referenceId" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'active',
|
|
"provider" TEXT NOT NULL DEFAULT 'stripe',
|
|
"billingInterval" TEXT,
|
|
"seats" INTEGER,
|
|
"stripeCustomerId" TEXT,
|
|
"stripeSubscriptionId" TEXT,
|
|
"paypalSubscriptionId" TEXT,
|
|
"paypalPlanId" TEXT,
|
|
"periodStart" TIMESTAMP(3),
|
|
"periodEnd" TIMESTAMP(3),
|
|
"cancelAtPeriodEnd" BOOLEAN DEFAULT false,
|
|
"trialStart" TIMESTAMP(3),
|
|
"trialEnd" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "subscription_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "plan" (
|
|
"id" TEXT NOT NULL,
|
|
"key" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"priceMonthly" INTEGER NOT NULL DEFAULT 0,
|
|
"priceYearly" INTEGER NOT NULL DEFAULT 0,
|
|
"stripePriceIdMonthly" TEXT,
|
|
"stripePriceIdYearly" TEXT,
|
|
"paypalPlanIdMonthly" TEXT,
|
|
"paypalPlanIdYearly" TEXT,
|
|
"limits" JSONB NOT NULL,
|
|
"features" JSONB NOT NULL,
|
|
"isPublic" BOOLEAN NOT NULL DEFAULT true,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "plan_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "usage_record" (
|
|
"id" TEXT NOT NULL,
|
|
"ownerId" TEXT NOT NULL,
|
|
"ownerType" TEXT NOT NULL,
|
|
"periodKey" TEXT NOT NULL,
|
|
"metric" TEXT NOT NULL,
|
|
"count" INTEGER NOT NULL DEFAULT 0,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "usage_record_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "episode" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"organizationId" TEXT,
|
|
"seriesId" TEXT,
|
|
"title" TEXT NOT NULL,
|
|
"topic" TEXT NOT NULL,
|
|
"tone" TEXT NOT NULL,
|
|
"format" "EpisodeFormat" NOT NULL DEFAULT 'SOLO',
|
|
"language" TEXT NOT NULL DEFAULT 'en',
|
|
"targetLengthMin" INTEGER NOT NULL DEFAULT 5,
|
|
"audience" TEXT,
|
|
"status" "EpisodeStatus" NOT NULL DEFAULT 'DRAFT',
|
|
"stage" TEXT,
|
|
"errorMessage" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "episode_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "script" (
|
|
"id" TEXT NOT NULL,
|
|
"episodeId" TEXT NOT NULL,
|
|
"content" JSONB NOT NULL,
|
|
"model" TEXT NOT NULL DEFAULT 'gpt-4o',
|
|
"version" INTEGER NOT NULL DEFAULT 1,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "script_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "speaker_config" (
|
|
"id" TEXT NOT NULL,
|
|
"episodeId" TEXT NOT NULL,
|
|
"speakerKey" TEXT NOT NULL,
|
|
"displayName" TEXT NOT NULL,
|
|
"elevenVoiceId" TEXT NOT NULL,
|
|
|
|
CONSTRAINT "speaker_config_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "audio_asset" (
|
|
"id" TEXT NOT NULL,
|
|
"episodeId" TEXT NOT NULL,
|
|
"storageKey" TEXT NOT NULL,
|
|
"durationSec" INTEGER,
|
|
"sizeBytes" INTEGER,
|
|
"format" TEXT NOT NULL DEFAULT 'mp3',
|
|
"segments" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "audio_asset_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "cover_art" (
|
|
"id" TEXT NOT NULL,
|
|
"episodeId" TEXT NOT NULL,
|
|
"storageKey" TEXT NOT NULL,
|
|
"prompt" TEXT NOT NULL,
|
|
"model" TEXT NOT NULL DEFAULT 'dall-e-3',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "cover_art_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "repurposed_content" (
|
|
"id" TEXT NOT NULL,
|
|
"episodeId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"content" JSONB NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "repurposed_content_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "series" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"organizationId" TEXT,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"plannedCount" INTEGER NOT NULL DEFAULT 0,
|
|
"plan" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "series_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "generation_job" (
|
|
"id" TEXT NOT NULL,
|
|
"episodeId" TEXT NOT NULL,
|
|
"pgBossJobId" TEXT,
|
|
"type" TEXT NOT NULL DEFAULT 'full',
|
|
"status" TEXT NOT NULL DEFAULT 'queued',
|
|
"stage" TEXT,
|
|
"attempts" INTEGER NOT NULL DEFAULT 0,
|
|
"costEstimate" JSONB,
|
|
"error" TEXT,
|
|
"startedAt" TIMESTAMP(3),
|
|
"finishedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "generation_job_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "api_key" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"hashedKey" TEXT NOT NULL,
|
|
"prefix" TEXT NOT NULL,
|
|
"lastUsedAt" TIMESTAMP(3),
|
|
"revokedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "api_key_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "audit_log" (
|
|
"id" TEXT NOT NULL,
|
|
"actorId" TEXT,
|
|
"actorType" TEXT NOT NULL DEFAULT 'user',
|
|
"action" TEXT NOT NULL,
|
|
"target" TEXT,
|
|
"metadata" JSONB,
|
|
"ip" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "audit_log_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "feature_flag" (
|
|
"key" TEXT NOT NULL,
|
|
"enabled" BOOLEAN NOT NULL DEFAULT false,
|
|
"rolloutPct" INTEGER NOT NULL DEFAULT 0,
|
|
"metadata" JSONB,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "feature_flag_pkey" PRIMARY KEY ("key")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ai_cost_log" (
|
|
"id" TEXT NOT NULL,
|
|
"provider" TEXT NOT NULL,
|
|
"operation" TEXT NOT NULL,
|
|
"episodeId" TEXT,
|
|
"userId" TEXT,
|
|
"units" INTEGER NOT NULL DEFAULT 0,
|
|
"costUsd" DECIMAL(10,4) NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ai_cost_log_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "content_flag" (
|
|
"id" TEXT NOT NULL,
|
|
"episodeId" TEXT NOT NULL,
|
|
"reason" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'open',
|
|
"reviewedBy" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "content_flag_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "user_email_key" ON "user"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "session_token_key" ON "session"("token");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "session_userId_idx" ON "session"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "account_userId_idx" ON "account"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "verification_identifier_idx" ON "verification"("identifier");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "organization_slug_key" ON "organization"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "member_userId_idx" ON "member"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "member_organizationId_userId_key" ON "member"("organizationId", "userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "invitation_organizationId_idx" ON "invitation"("organizationId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "team_organizationId_idx" ON "team"("organizationId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "org_branding_customDomain_key" ON "org_branding"("customDomain");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "subscription_referenceId_idx" ON "subscription"("referenceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "subscription_stripeSubscriptionId_idx" ON "subscription"("stripeSubscriptionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "subscription_paypalSubscriptionId_idx" ON "subscription"("paypalSubscriptionId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "plan_key_key" ON "plan"("key");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "usage_record_ownerId_periodKey_idx" ON "usage_record"("ownerId", "periodKey");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "usage_record_ownerId_periodKey_metric_key" ON "usage_record"("ownerId", "periodKey", "metric");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "episode_userId_idx" ON "episode"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "episode_organizationId_idx" ON "episode"("organizationId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "episode_seriesId_idx" ON "episode"("seriesId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "episode_status_idx" ON "episode"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "script_episodeId_key" ON "script"("episodeId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "speaker_config_episodeId_speakerKey_key" ON "speaker_config"("episodeId", "speakerKey");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "audio_asset_episodeId_key" ON "audio_asset"("episodeId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "cover_art_episodeId_key" ON "cover_art"("episodeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "repurposed_content_episodeId_idx" ON "repurposed_content"("episodeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "series_userId_idx" ON "series"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "generation_job_episodeId_idx" ON "generation_job"("episodeId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "generation_job_status_idx" ON "generation_job"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "api_key_hashedKey_key" ON "api_key"("hashedKey");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "api_key_userId_idx" ON "api_key"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "audit_log_action_idx" ON "audit_log"("action");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "audit_log_createdAt_idx" ON "audit_log"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ai_cost_log_provider_createdAt_idx" ON "ai_cost_log"("provider", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ai_cost_log_userId_idx" ON "ai_cost_log"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "content_flag_status_idx" ON "content_flag"("status");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "session" ADD CONSTRAINT "session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "account" ADD CONSTRAINT "account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "member" ADD CONSTRAINT "member_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "member" ADD CONSTRAINT "member_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "invitation" ADD CONSTRAINT "invitation_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "invitation" ADD CONSTRAINT "invitation_inviterId_fkey" FOREIGN KEY ("inviterId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "team" ADD CONSTRAINT "team_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "org_branding" ADD CONSTRAINT "org_branding_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organization"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "usage_record" ADD CONSTRAINT "usage_owner_user_fk" FOREIGN KEY ("ownerId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "episode" ADD CONSTRAINT "episode_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "episode" ADD CONSTRAINT "episode_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organization"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "episode" ADD CONSTRAINT "episode_seriesId_fkey" FOREIGN KEY ("seriesId") REFERENCES "series"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "script" ADD CONSTRAINT "script_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "speaker_config" ADD CONSTRAINT "speaker_config_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "audio_asset" ADD CONSTRAINT "audio_asset_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "cover_art" ADD CONSTRAINT "cover_art_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "repurposed_content" ADD CONSTRAINT "repurposed_content_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "series" ADD CONSTRAINT "series_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "series" ADD CONSTRAINT "series_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organization"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "generation_job" ADD CONSTRAINT "generation_job_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "api_key" ADD CONSTRAINT "api_key_userId_fkey" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "audit_log" ADD CONSTRAINT "audit_log_actorId_fkey" FOREIGN KEY ("actorId") REFERENCES "user"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "content_flag" ADD CONSTRAINT "content_flag_episodeId_fkey" FOREIGN KEY ("episodeId") REFERENCES "episode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|