generated from fahricansecer/boilerplate-be
2019 lines
66 KiB
SQL
2019 lines
66 KiB
SQL
/*
|
|
Warnings:
|
|
|
|
- A unique constraint covering the columns `[domain]` on the table `Tenant` will be added. If there are existing duplicate values, this will fail.
|
|
- A unique constraint covering the columns `[key,locale,namespace,tenantId]` on the table `Translation` will be added. If there are existing duplicate values, this will fail.
|
|
- A unique constraint covering the columns `[stripeCustomerId]` on the table `User` will be added. If there are existing duplicate values, this will fail.
|
|
|
|
*/
|
|
-- CreateEnum
|
|
CREATE TYPE "UserPlan" AS ENUM ('FREE', 'STARTER', 'PRO', 'ULTIMATE', 'ENTERPRISE');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ContentType" AS ENUM ('BLOG', 'TWITTER', 'INSTAGRAM', 'LINKEDIN', 'FACEBOOK', 'TIKTOK', 'YOUTUBE', 'THREADS', 'PINTEREST');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "MasterContentType" AS ENUM ('BLOG', 'NEWSLETTER', 'PODCAST_SCRIPT', 'VIDEO_SCRIPT', 'THREAD');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ContentStatus" AS ENUM ('DRAFT', 'REVIEW', 'APPROVED', 'SCHEDULED', 'PUBLISHED', 'FAILED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "TrendSource" AS ENUM ('GOOGLE_TRENDS', 'TWITTER', 'REDDIT', 'NEWSAPI', 'RSS', 'YOUTUBE', 'CUSTOM');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "TrendStatus" AS ENUM ('NEW', 'REVIEWED', 'SELECTED', 'DISMISSED', 'EXPIRED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "MediaType" AS ENUM ('IMAGE', 'VIDEO', 'GIF', 'AUDIO');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SocialPlatform" AS ENUM ('TWITTER', 'INSTAGRAM', 'LINKEDIN', 'FACEBOOK', 'TIKTOK', 'YOUTUBE', 'THREADS', 'PINTEREST');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "AuthMethod" AS ENUM ('OAUTH', 'CREDENTIALS');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ScheduleStatus" AS ENUM ('SCHEDULED', 'PUBLISHING', 'PUBLISHED', 'FAILED', 'CANCELLED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "WorkspaceRole" AS ENUM ('OWNER', 'ADMIN', 'EDITOR', 'VIEWER');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ApprovalStatus" AS ENUM ('PENDING', 'APPROVED', 'REJECTED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "CreditTransactionType" AS ENUM ('PURCHASE', 'SPEND', 'REFUND', 'BONUS', 'RESET', 'ADMIN_ADJUST');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "CreditCategory" AS ENUM ('TREND_SCAN', 'DEEP_RESEARCH', 'MASTER_CONTENT', 'BUILDING_BLOCKS', 'PLATFORM_CONTENT', 'IMAGE_GENERATION', 'VIDEO_SCRIPT', 'THUMBNAIL', 'SEO_OPTIMIZATION', 'NEURO_ANALYSIS', 'SOURCE_ANALYSIS', 'AUTO_PUBLISH');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "BuildingBlockType" AS ENUM ('HOOK', 'PAIN_POINT', 'PARADOX', 'QUOTE', 'STATISTIC', 'TRANSFORMATION_ARC', 'OBJECTION_HANDLER', 'CTA', 'METAPHOR', 'STORY', 'INSIGHT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "WritingStyleType" AS ENUM ('PATIENT_OBSERVER', 'HUSTLER_ACHIEVER', 'CONTRARIAN_THINKER', 'CUSTOM');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "PsychologyTriggerCategory" AS ENUM ('CURIOSITY', 'SOCIAL_PROOF', 'SCARCITY', 'URGENCY', 'AUTHORITY', 'RECIPROCITY', 'LOSS_AVERSION', 'PATTERN_INTERRUPT', 'EMOTIONAL_RESONANCE', 'CONTROVERSY');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ContentCategoryType" AS ENUM ('PROVEN', 'EXPERIMENT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SourceType" AS ENUM ('ARTICLE', 'STUDY', 'REPORT', 'SOCIAL_POST', 'VIDEO', 'PODCAST', 'BOOK', 'OFFICIAL_STATEMENT', 'RESEARCH_PAPER', 'NEWS', 'CUSTOM');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "VerificationLevel" AS ENUM ('VERIFIED', 'OPINION', 'INSPIRED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "InstagramFormat" AS ENUM ('STATIC_IMAGE', 'CAROUSEL', 'REEL', 'STORY');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "ContentLanguage" AS ENUM ('EN', 'TR', 'ES', 'FR', 'DE', 'ZH', 'PT', 'AR', 'RU', 'JA');
|
|
|
|
-- DropIndex
|
|
DROP INDEX "Translation_key_locale_namespace_key";
|
|
|
|
-- DropIndex
|
|
DROP INDEX "Translation_namespace_idx";
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "Tenant" ADD COLUMN "brandColor" TEXT,
|
|
ADD COLUMN "customCss" TEXT,
|
|
ADD COLUMN "domain" TEXT,
|
|
ADD COLUMN "logo" TEXT;
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "Translation" ADD COLUMN "tenantId" TEXT;
|
|
|
|
-- AlterTable
|
|
ALTER TABLE "User" ADD COLUMN "avatar" TEXT,
|
|
ADD COLUMN "credits" INTEGER NOT NULL DEFAULT 50,
|
|
ADD COLUMN "creditsResetAt" TIMESTAMP(3),
|
|
ADD COLUMN "emailVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
ADD COLUMN "language" TEXT NOT NULL DEFAULT 'en',
|
|
ADD COLUMN "lastLoginAt" TIMESTAMP(3),
|
|
ADD COLUMN "plan" "UserPlan" NOT NULL DEFAULT 'FREE',
|
|
ADD COLUMN "stripeCustomerId" TEXT,
|
|
ADD COLUMN "timezone" TEXT NOT NULL DEFAULT 'UTC';
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SubscriptionPlan" (
|
|
"id" TEXT NOT NULL,
|
|
"name" "UserPlan" NOT NULL,
|
|
"displayName" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"monthlyPrice" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
|
"yearlyPrice" DECIMAL(10,2) NOT NULL DEFAULT 0,
|
|
"currency" TEXT NOT NULL DEFAULT 'USD',
|
|
"stripeMonthlyPriceId" TEXT,
|
|
"stripeYearlyPriceId" TEXT,
|
|
"monthlyCredits" INTEGER NOT NULL DEFAULT 50,
|
|
"maxWorkspaces" INTEGER NOT NULL DEFAULT 1,
|
|
"maxTeamMembers" INTEGER NOT NULL DEFAULT 1,
|
|
"maxNiches" INTEGER NOT NULL DEFAULT 1,
|
|
"maxTemplates" INTEGER NOT NULL DEFAULT 5,
|
|
"maxScheduledPosts" INTEGER NOT NULL DEFAULT 10,
|
|
"maxSocialAccounts" INTEGER NOT NULL DEFAULT 2,
|
|
"maxSourceAccounts" INTEGER NOT NULL DEFAULT 5,
|
|
"maxStorageMb" INTEGER NOT NULL DEFAULT 100,
|
|
"features" JSONB NOT NULL DEFAULT '{}',
|
|
"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 "SubscriptionPlan_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Subscription" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"planId" TEXT NOT NULL,
|
|
"stripeSubscriptionId" TEXT,
|
|
"status" TEXT NOT NULL,
|
|
"currentPeriodStart" TIMESTAMP(3) NOT NULL,
|
|
"currentPeriodEnd" TIMESTAMP(3) NOT NULL,
|
|
"cancelAtPeriodEnd" BOOLEAN NOT NULL DEFAULT false,
|
|
"canceledAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Subscription_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CreditTransaction" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"amount" INTEGER NOT NULL,
|
|
"balanceAfter" INTEGER NOT NULL,
|
|
"type" "CreditTransactionType" NOT NULL,
|
|
"category" "CreditCategory",
|
|
"description" TEXT,
|
|
"referenceId" TEXT,
|
|
"referenceType" TEXT,
|
|
"adminUserId" TEXT,
|
|
"adminNote" TEXT,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "CreditTransaction_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "BrandVoice" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT,
|
|
"description" TEXT,
|
|
"tone" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"vocabulary" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"avoidWords" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"sampleContent" TEXT,
|
|
"aiProfile" JSONB,
|
|
"aiProfileVersion" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "BrandVoice_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "WritingStyle" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT,
|
|
"type" "WritingStyleType" NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"traits" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"tone" TEXT,
|
|
"vocabulary" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"avoidWords" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"examples" TEXT,
|
|
"bestFor" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"sentenceLength" TEXT,
|
|
"emojiUsage" TEXT,
|
|
"hashtagStyle" TEXT,
|
|
"structurePreference" TEXT,
|
|
"engagementStyle" TEXT,
|
|
"signatureElements" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"preferredPhrases" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"isDefault" BOOLEAN NOT NULL DEFAULT false,
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "WritingStyle_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Workspace" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"slug" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"logo" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"tenantId" TEXT,
|
|
"ownerId" TEXT NOT NULL,
|
|
"settings" JSONB NOT NULL DEFAULT '{}',
|
|
"requireApproval" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"deletedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Workspace_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "WorkspaceMember" (
|
|
"id" TEXT NOT NULL,
|
|
"workspaceId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"role" "WorkspaceRole" NOT NULL DEFAULT 'VIEWER',
|
|
"permissions" JSONB,
|
|
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "WorkspaceMember_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ApprovalWorkflow" (
|
|
"id" TEXT NOT NULL,
|
|
"workspaceId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"isDefault" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ApprovalWorkflow_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ApprovalStep" (
|
|
"id" TEXT NOT NULL,
|
|
"workflowId" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL,
|
|
"name" TEXT,
|
|
"approverRole" "WorkspaceRole",
|
|
"approverUserId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ApprovalStep_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentApproval" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"stepOrder" INTEGER NOT NULL DEFAULT 0,
|
|
"status" "ApprovalStatus" NOT NULL DEFAULT 'PENDING',
|
|
"requestedById" TEXT NOT NULL,
|
|
"notes" TEXT,
|
|
"reviewedById" TEXT,
|
|
"reviewedAt" TIMESTAMP(3),
|
|
"feedback" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ContentApproval_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Niche" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"keywords" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"scanFrequency" TEXT NOT NULL DEFAULT 'daily',
|
|
"autoScan" BOOLEAN NOT NULL DEFAULT false,
|
|
"autoScanCron" TEXT,
|
|
"lastScannedAt" TIMESTAMP(3),
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"deletedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Niche_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "NicheSource" (
|
|
"id" TEXT NOT NULL,
|
|
"nicheId" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"url" TEXT NOT NULL,
|
|
"name" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"lastFetchedAt" TIMESTAMP(3),
|
|
"lastError" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "NicheSource_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Trend" (
|
|
"id" TEXT NOT NULL,
|
|
"nicheId" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"source" "TrendSource" NOT NULL,
|
|
"sourceUrl" TEXT,
|
|
"sourceData" JSONB,
|
|
"score" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
"velocity" DOUBLE PRECISION,
|
|
"volume" INTEGER,
|
|
"keywords" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"relatedTopics" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"sentiment" TEXT,
|
|
"status" "TrendStatus" NOT NULL DEFAULT 'NEW',
|
|
"scanId" TEXT,
|
|
"discoveredAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"expiresAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Trend_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "TrendScan" (
|
|
"id" TEXT NOT NULL,
|
|
"nicheId" TEXT NOT NULL,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"trendsFound" INTEGER NOT NULL DEFAULT 0,
|
|
"newTrends" INTEGER NOT NULL DEFAULT 0,
|
|
"sources" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"errors" JSONB,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"startedAt" TIMESTAMP(3),
|
|
"completedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "TrendScan_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "PsychologyTrigger" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"category" "PsychologyTriggerCategory" NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"examples" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"bestFor" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"templates" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
"avgEngagement" DOUBLE PRECISION,
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "PsychologyTrigger_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "EmotionalHook" (
|
|
"id" TEXT NOT NULL,
|
|
"emotion" TEXT NOT NULL,
|
|
"hookType" TEXT NOT NULL,
|
|
"template" TEXT NOT NULL,
|
|
"examples" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
"avgEngagement" DOUBLE PRECISION,
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "EmotionalHook_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentPsychology" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"triggersUsed" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"hookType" TEXT,
|
|
"emotionalTone" TEXT,
|
|
"engagementScore" DOUBLE PRECISION,
|
|
"viralPotential" DOUBLE PRECISION,
|
|
"controversyLevel" INTEGER,
|
|
"aiAnalysis" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ContentPsychology_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SeoKeyword" (
|
|
"id" TEXT NOT NULL,
|
|
"keyword" TEXT NOT NULL,
|
|
"nicheId" TEXT,
|
|
"searchVolume" INTEGER,
|
|
"difficulty" DOUBLE PRECISION,
|
|
"cpc" DOUBLE PRECISION,
|
|
"trend" TEXT,
|
|
"relatedKeywords" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "SeoKeyword_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentSeo" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"primaryKeyword" TEXT,
|
|
"secondaryKeywords" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"keywordDensity" DOUBLE PRECISION,
|
|
"metaTitle" TEXT,
|
|
"metaDescription" TEXT,
|
|
"slugSuggestion" TEXT,
|
|
"seoScore" INTEGER,
|
|
"readabilityScore" DOUBLE PRECISION,
|
|
"improvements" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ContentSeo_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SourceAccount" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"username" TEXT NOT NULL,
|
|
"displayName" TEXT,
|
|
"profileUrl" TEXT NOT NULL,
|
|
"bio" TEXT,
|
|
"followersCount" INTEGER,
|
|
"avgEngagement" DOUBLE PRECISION,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"lastFetchedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "SourceAccount_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SourcePost" (
|
|
"id" TEXT NOT NULL,
|
|
"accountId" TEXT NOT NULL,
|
|
"platformPostId" TEXT NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"mediaUrls" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"likes" INTEGER,
|
|
"comments" INTEGER,
|
|
"shares" INTEGER,
|
|
"engagementRate" DOUBLE PRECISION,
|
|
"postedAt" TIMESTAMP(3),
|
|
"fetchedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "SourcePost_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SourcePostAnalysis" (
|
|
"id" TEXT NOT NULL,
|
|
"postId" TEXT NOT NULL,
|
|
"hook" TEXT,
|
|
"pain" TEXT,
|
|
"payoff" TEXT,
|
|
"cta" TEXT,
|
|
"mainIdea" TEXT,
|
|
"psychologyTriggers" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"structure" JSONB,
|
|
"structureSkeleton" JSONB,
|
|
"inspiredContent" TEXT,
|
|
"isProcessed" BOOLEAN NOT NULL DEFAULT false,
|
|
"processedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "SourcePostAnalysis_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ViralPostAnalysis" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"originalPost" TEXT NOT NULL,
|
|
"sourceUrl" TEXT,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"engagementCount" INTEGER,
|
|
"hook" TEXT,
|
|
"pain" TEXT,
|
|
"payoff" TEXT,
|
|
"cta" TEXT,
|
|
"psychologyTriggers" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"structureSkeleton" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ViralPostAnalysis_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "MasterContent" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"nicheId" TEXT,
|
|
"trendId" TEXT,
|
|
"type" "MasterContentType" NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"body" TEXT NOT NULL,
|
|
"summary" TEXT,
|
|
"writingStyleId" TEXT,
|
|
"researchNotes" TEXT,
|
|
"targetAudience" TEXT,
|
|
"outline" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"status" "ContentStatus" NOT NULL DEFAULT 'DRAFT',
|
|
"hooks" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"painPoints" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"paradoxes" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"quotes" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"researchId" TEXT,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "MasterContent_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "BuildingBlock" (
|
|
"id" TEXT NOT NULL,
|
|
"masterContentId" TEXT NOT NULL,
|
|
"type" "BuildingBlockType" NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"engagementPotential" DOUBLE PRECISION,
|
|
"isSelected" BOOLEAN NOT NULL DEFAULT false,
|
|
"usedInContentIds" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "BuildingBlock_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentSession" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"phase" TEXT NOT NULL DEFAULT 'context_gathering',
|
|
"targetAudience" TEXT,
|
|
"keyTakeaway" TEXT,
|
|
"personalStories" TEXT,
|
|
"emotionToEvoke" TEXT,
|
|
"beliefToChallenge" TEXT,
|
|
"actionToInspire" TEXT,
|
|
"additionalContext" JSONB,
|
|
"selectedVariationId" TEXT,
|
|
"contentId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ContentSession_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentVariation" (
|
|
"id" TEXT NOT NULL,
|
|
"sessionId" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"content" TEXT NOT NULL,
|
|
"aiScore" DOUBLE PRECISION,
|
|
"isSelected" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ContentVariation_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Content" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"nicheId" TEXT,
|
|
"trendId" TEXT,
|
|
"masterContentId" TEXT,
|
|
"type" "ContentType" NOT NULL,
|
|
"title" TEXT,
|
|
"body" TEXT NOT NULL,
|
|
"summary" TEXT,
|
|
"htmlBody" TEXT,
|
|
"markdownBody" TEXT,
|
|
"hashtags" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"keywords" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"category" "ContentCategoryType" NOT NULL DEFAULT 'EXPERIMENT',
|
|
"goldPostId" TEXT,
|
|
"aiModel" TEXT,
|
|
"aiPrompt" TEXT,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"sourceLanguage" "ContentLanguage",
|
|
"targetLanguage" "ContentLanguage" NOT NULL DEFAULT 'EN',
|
|
"status" "ContentStatus" NOT NULL DEFAULT 'DRAFT',
|
|
"abTestId" TEXT,
|
|
"researchId" TEXT,
|
|
"isSourceVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"verificationLevel" "VerificationLevel" NOT NULL DEFAULT 'VERIFIED',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"publishedAt" TIMESTAMP(3),
|
|
"scheduledAt" TIMESTAMP(3),
|
|
"publishedUrl" TEXT,
|
|
|
|
CONSTRAINT "Content_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentVariant" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"text" TEXT NOT NULL,
|
|
"hashtags" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"mentions" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"characterCount" INTEGER,
|
|
"impressions" INTEGER NOT NULL DEFAULT 0,
|
|
"clicks" INTEGER NOT NULL DEFAULT 0,
|
|
"engagements" INTEGER NOT NULL DEFAULT 0,
|
|
"shares" INTEGER NOT NULL DEFAULT 0,
|
|
"conversions" INTEGER NOT NULL DEFAULT 0,
|
|
"name" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"isWinner" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ContentVariant_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Citation" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"url" TEXT NOT NULL,
|
|
"author" TEXT,
|
|
"source" TEXT,
|
|
"publishedDate" TIMESTAMP(3),
|
|
"excerpt" TEXT,
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Citation_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "DeepResearch" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"topic" TEXT NOT NULL,
|
|
"query" TEXT NOT NULL,
|
|
"nicheId" TEXT,
|
|
"trendId" TEXT,
|
|
"sources" JSONB,
|
|
"summary" TEXT,
|
|
"keyFindings" JSONB,
|
|
"outline" JSONB,
|
|
"status" TEXT NOT NULL DEFAULT 'pending',
|
|
"error" TEXT,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"startedAt" TIMESTAMP(3),
|
|
"completedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "DeepResearch_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "VideoContent" (
|
|
"id" TEXT NOT NULL,
|
|
"masterContentId" TEXT,
|
|
"userId" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"script" TEXT NOT NULL,
|
|
"duration" INTEGER,
|
|
"seoTitle" TEXT,
|
|
"seoDescription" TEXT,
|
|
"tags" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"timestamps" JSONB,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "VideoContent_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "VideoThumbnail" (
|
|
"id" TEXT NOT NULL,
|
|
"videoId" TEXT NOT NULL,
|
|
"headline" TEXT,
|
|
"subheadline" TEXT,
|
|
"style" TEXT,
|
|
"emotionalTrigger" TEXT,
|
|
"colorScheme" TEXT,
|
|
"faceExpression" TEXT,
|
|
"imageUrl" TEXT,
|
|
"prompt" TEXT,
|
|
"isSelected" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "VideoThumbnail_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Media" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"type" "MediaType" NOT NULL,
|
|
"filename" TEXT NOT NULL,
|
|
"originalFilename" TEXT,
|
|
"mimeType" TEXT NOT NULL,
|
|
"size" INTEGER NOT NULL,
|
|
"storagePath" TEXT NOT NULL,
|
|
"publicUrl" TEXT,
|
|
"thumbnailUrl" TEXT,
|
|
"width" INTEGER,
|
|
"height" INTEGER,
|
|
"duration" INTEGER,
|
|
"isAiGenerated" BOOLEAN NOT NULL DEFAULT false,
|
|
"aiModel" TEXT,
|
|
"aiPrompt" TEXT,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"contentId" TEXT,
|
|
"variantId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Media_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Template" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT,
|
|
"workspaceId" TEXT,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"platform" "SocialPlatform",
|
|
"type" TEXT,
|
|
"width" INTEGER NOT NULL,
|
|
"height" INTEGER NOT NULL,
|
|
"presetData" JSONB,
|
|
"thumbnailUrl" TEXT,
|
|
"isPublic" BOOLEAN NOT NULL DEFAULT false,
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
"deletedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "Template_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "TemplateLayer" (
|
|
"id" TEXT NOT NULL,
|
|
"templateId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL,
|
|
"x" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
"y" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
"width" DOUBLE PRECISION NOT NULL,
|
|
"height" DOUBLE PRECISION NOT NULL,
|
|
"rotation" DOUBLE PRECISION NOT NULL DEFAULT 0,
|
|
"content" JSONB,
|
|
"style" JSONB,
|
|
"assetId" TEXT,
|
|
"isLocked" BOOLEAN NOT NULL DEFAULT false,
|
|
"isVisible" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
CONSTRAINT "TemplateLayer_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Asset" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"filename" TEXT NOT NULL,
|
|
"mimeType" TEXT NOT NULL,
|
|
"size" INTEGER NOT NULL,
|
|
"storagePath" TEXT NOT NULL,
|
|
"publicUrl" TEXT,
|
|
"width" INTEGER,
|
|
"height" INTEGER,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Asset_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SocialAccount" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"platformUserId" TEXT,
|
|
"username" TEXT,
|
|
"displayName" TEXT,
|
|
"profileImageUrl" TEXT,
|
|
"authMethod" "AuthMethod" NOT NULL DEFAULT 'OAUTH',
|
|
"accessToken" TEXT,
|
|
"refreshToken" TEXT,
|
|
"tokenExpiresAt" TIMESTAMP(3),
|
|
"tokenScope" TEXT,
|
|
"encryptedCredentials" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"lastUsedAt" TIMESTAMP(3),
|
|
"lastError" TEXT,
|
|
"errorCount" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "SocialAccount_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ScheduledPost" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"contentId" TEXT,
|
|
"variantId" TEXT,
|
|
"socialAccountId" TEXT NOT NULL,
|
|
"textSnapshot" TEXT NOT NULL,
|
|
"mediaUrls" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"scheduledFor" TIMESTAMP(3) NOT NULL,
|
|
"timezone" TEXT NOT NULL DEFAULT 'UTC',
|
|
"isRecurring" BOOLEAN NOT NULL DEFAULT false,
|
|
"recurrenceRule" TEXT,
|
|
"parentPostId" TEXT,
|
|
"aiSuggestedTime" TIMESTAMP(3),
|
|
"aiConfidence" DOUBLE PRECISION,
|
|
"requiresApproval" BOOLEAN NOT NULL DEFAULT true,
|
|
"isApproved" BOOLEAN NOT NULL DEFAULT false,
|
|
"approvedBy" TEXT,
|
|
"approvedAt" TIMESTAMP(3),
|
|
"status" "ScheduleStatus" NOT NULL DEFAULT 'SCHEDULED',
|
|
"publishedPostId" TEXT,
|
|
"error" TEXT,
|
|
"retryCount" INTEGER NOT NULL DEFAULT 0,
|
|
"creditsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ScheduledPost_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "PublishedPost" (
|
|
"id" TEXT NOT NULL,
|
|
"socialAccountId" TEXT NOT NULL,
|
|
"platformPostId" TEXT NOT NULL,
|
|
"platformUrl" TEXT,
|
|
"content" TEXT NOT NULL,
|
|
"mediaUrls" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"isGoldPost" BOOLEAN NOT NULL DEFAULT false,
|
|
"engagementMultiplier" DOUBLE PRECISION,
|
|
"publishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "PublishedPost_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentAnalytics" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"views" INTEGER NOT NULL DEFAULT 0,
|
|
"likes" INTEGER NOT NULL DEFAULT 0,
|
|
"comments" INTEGER NOT NULL DEFAULT 0,
|
|
"shares" INTEGER NOT NULL DEFAULT 0,
|
|
"saves" INTEGER NOT NULL DEFAULT 0,
|
|
"clicks" INTEGER NOT NULL DEFAULT 0,
|
|
"impressions" INTEGER NOT NULL DEFAULT 0,
|
|
"reach" INTEGER NOT NULL DEFAULT 0,
|
|
"engagementRate" DOUBLE PRECISION,
|
|
"predictedEngagement" DOUBLE PRECISION,
|
|
"predictionAccuracy" DOUBLE PRECISION,
|
|
"recordedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ContentAnalytics_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "PostAnalytics" (
|
|
"id" TEXT NOT NULL,
|
|
"publishedPostId" TEXT NOT NULL,
|
|
"views" INTEGER NOT NULL DEFAULT 0,
|
|
"likes" INTEGER NOT NULL DEFAULT 0,
|
|
"comments" INTEGER NOT NULL DEFAULT 0,
|
|
"shares" INTEGER NOT NULL DEFAULT 0,
|
|
"saves" INTEGER NOT NULL DEFAULT 0,
|
|
"clicks" INTEGER NOT NULL DEFAULT 0,
|
|
"impressions" INTEGER NOT NULL DEFAULT 0,
|
|
"reach" INTEGER NOT NULL DEFAULT 0,
|
|
"engagementRate" DOUBLE PRECISION,
|
|
"snapshotAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "PostAnalytics_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ABTest" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"metric" TEXT NOT NULL,
|
|
"winnerId" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'running',
|
|
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"endedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "ABTest_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "EngagementPrediction" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"predictedViews" INTEGER,
|
|
"predictedLikes" INTEGER,
|
|
"predictedComments" INTEGER,
|
|
"predictedShares" INTEGER,
|
|
"predictedEngRate" DOUBLE PRECISION,
|
|
"confidence" DOUBLE PRECISION,
|
|
"modelVersion" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "EngagementPrediction_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentCalendar" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"isAiGenerated" BOOLEAN NOT NULL DEFAULT false,
|
|
"aiPrompt" TEXT,
|
|
"startDate" TIMESTAMP(3) NOT NULL,
|
|
"endDate" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ContentCalendar_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CalendarEntry" (
|
|
"id" TEXT NOT NULL,
|
|
"calendarId" TEXT NOT NULL,
|
|
"date" TIMESTAMP(3) NOT NULL,
|
|
"time" TEXT,
|
|
"contentId" TEXT,
|
|
"suggestedTopic" TEXT,
|
|
"suggestedPlatform" "SocialPlatform",
|
|
"suggestedType" TEXT,
|
|
"contentCategory" "ContentCategoryType",
|
|
"notes" TEXT,
|
|
"status" TEXT NOT NULL DEFAULT 'planned',
|
|
|
|
CONSTRAINT "CalendarEntry_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "OptimalPostTime" (
|
|
"id" TEXT NOT NULL,
|
|
"socialAccountId" TEXT NOT NULL,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"dayOfWeek" INTEGER NOT NULL,
|
|
"hour" INTEGER NOT NULL,
|
|
"score" DOUBLE PRECISION NOT NULL,
|
|
"dataPoints" INTEGER NOT NULL DEFAULT 0,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "OptimalPostTime_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "WorkflowTemplate" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"postsPerDay" INTEGER NOT NULL DEFAULT 3,
|
|
"provenPercent" INTEGER NOT NULL DEFAULT 33,
|
|
"experimentPercent" INTEGER NOT NULL DEFAULT 67,
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT false,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "WorkflowTemplate_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "WorkflowDay" (
|
|
"id" TEXT NOT NULL,
|
|
"templateId" TEXT NOT NULL,
|
|
"dayOfWeek" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "WorkflowDay_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "WorkflowTask" (
|
|
"id" TEXT NOT NULL,
|
|
"dayId" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL,
|
|
"type" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"duration" INTEGER,
|
|
|
|
CONSTRAINT "WorkflowTask_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "YouTubeVideo" (
|
|
"id" TEXT NOT NULL,
|
|
"videoId" TEXT NOT NULL,
|
|
"url" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"channelId" TEXT,
|
|
"channelTitle" TEXT,
|
|
"publishedAt" TIMESTAMP(3),
|
|
"duration" INTEGER,
|
|
"thumbnailUrl" TEXT,
|
|
"viewCount" INTEGER,
|
|
"likeCount" INTEGER,
|
|
"commentCount" INTEGER,
|
|
"transcript" TEXT,
|
|
"transcriptLanguage" TEXT,
|
|
"transcriptStatus" TEXT NOT NULL DEFAULT 'pending',
|
|
"lastFetchedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "YouTubeVideo_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "RssFeed" (
|
|
"id" TEXT NOT NULL,
|
|
"url" TEXT NOT NULL,
|
|
"title" TEXT,
|
|
"description" TEXT,
|
|
"siteUrl" TEXT,
|
|
"fetchInterval" INTEGER NOT NULL DEFAULT 3600,
|
|
"lastFetchedAt" TIMESTAMP(3),
|
|
"lastError" TEXT,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "RssFeed_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "RssFeedItem" (
|
|
"id" TEXT NOT NULL,
|
|
"feedId" TEXT NOT NULL,
|
|
"guid" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"link" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"content" TEXT,
|
|
"author" TEXT,
|
|
"categories" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"publishedAt" TIMESTAMP(3),
|
|
"extractedContent" TEXT,
|
|
"isProcessed" BOOLEAN NOT NULL DEFAULT false,
|
|
"fetchedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "RssFeedItem_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ApiKey" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"key" TEXT NOT NULL,
|
|
"keyPrefix" TEXT NOT NULL,
|
|
"keyHash" TEXT NOT NULL,
|
|
"permissions" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"rateLimit" INTEGER NOT NULL DEFAULT 1000,
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"lastUsedAt" TIMESTAMP(3),
|
|
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
"expiresAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ApiKey_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Webhook" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"workspaceId" TEXT,
|
|
"name" TEXT NOT NULL,
|
|
"url" TEXT NOT NULL,
|
|
"secret" TEXT,
|
|
"events" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"lastTriggeredAt" TIMESTAMP(3),
|
|
"consecutiveFailures" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Webhook_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "WebhookLog" (
|
|
"id" TEXT NOT NULL,
|
|
"webhookId" TEXT NOT NULL,
|
|
"event" TEXT NOT NULL,
|
|
"payload" JSONB NOT NULL,
|
|
"statusCode" INTEGER,
|
|
"responseBody" TEXT,
|
|
"responseTime" INTEGER,
|
|
"success" BOOLEAN NOT NULL,
|
|
"error" TEXT,
|
|
"sentAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "WebhookLog_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "SystemSetting" (
|
|
"id" TEXT NOT NULL,
|
|
"key" TEXT NOT NULL,
|
|
"value" JSONB NOT NULL,
|
|
"description" TEXT,
|
|
"isPublic" BOOLEAN NOT NULL DEFAULT false,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "SystemSetting_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "JobLog" (
|
|
"id" TEXT NOT NULL,
|
|
"jobName" TEXT NOT NULL,
|
|
"jobId" TEXT,
|
|
"status" TEXT NOT NULL,
|
|
"input" JSONB,
|
|
"output" JSONB,
|
|
"error" TEXT,
|
|
"duration" INTEGER,
|
|
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"completedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "JobLog_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CopywritingFormula" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"acronym" TEXT,
|
|
"description" TEXT NOT NULL,
|
|
"steps" JSONB NOT NULL,
|
|
"examples" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"bestFor" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "CopywritingFormula_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CtaTemplate" (
|
|
"id" TEXT NOT NULL,
|
|
"category" TEXT NOT NULL,
|
|
"template" TEXT NOT NULL,
|
|
"examples" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
"avgEngagement" DOUBLE PRECISION,
|
|
"isSystem" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "CtaTemplate_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ContentSource" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"sourceType" "SourceType" NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"url" TEXT,
|
|
"author" TEXT,
|
|
"publisher" TEXT,
|
|
"publishDate" TIMESTAMP(3),
|
|
"isVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"verifiedAt" TIMESTAMP(3),
|
|
"verifiedBy" TEXT,
|
|
"excerpt" TEXT,
|
|
"claimMade" TEXT,
|
|
"reliabilityScore" DOUBLE PRECISION,
|
|
"order" INTEGER NOT NULL DEFAULT 0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ContentSource_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ViralLearning" (
|
|
"id" TEXT NOT NULL,
|
|
"platform" "SocialPlatform" NOT NULL,
|
|
"sourceUrl" TEXT,
|
|
"originalContent" TEXT NOT NULL,
|
|
"engagementCount" INTEGER,
|
|
"hookPattern" TEXT,
|
|
"painPattern" TEXT,
|
|
"payoffPattern" TEXT,
|
|
"ctaPattern" TEXT,
|
|
"psychologyTriggers" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"emotionalHooks" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"structureTemplate" JSONB,
|
|
"successFactors" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"targetAudience" TEXT,
|
|
"contentType" TEXT,
|
|
"timesUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"derivedContents" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"avgDerivedEngagement" DOUBLE PRECISION,
|
|
"tags" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ViralLearning_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "InstagramContent" (
|
|
"id" TEXT NOT NULL,
|
|
"contentId" TEXT NOT NULL,
|
|
"format" "InstagramFormat" NOT NULL,
|
|
"caption" TEXT NOT NULL,
|
|
"hashtags" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"mentions" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"reelDuration" INTEGER,
|
|
"reelScript" TEXT,
|
|
"audioTrack" TEXT,
|
|
"imageAltText" TEXT,
|
|
"coverImageUrl" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "InstagramContent_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "CarouselSlide" (
|
|
"id" TEXT NOT NULL,
|
|
"instagramContentId" TEXT NOT NULL,
|
|
"order" INTEGER NOT NULL,
|
|
"imageUrl" TEXT,
|
|
"text" TEXT,
|
|
"headline" TEXT,
|
|
"templateId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "CarouselSlide_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "SubscriptionPlan_name_key" ON "SubscriptionPlan"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Subscription_userId_key" ON "Subscription"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Subscription_stripeSubscriptionId_key" ON "Subscription"("stripeSubscriptionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subscription_userId_idx" ON "Subscription"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subscription_status_idx" ON "Subscription"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subscription_stripeSubscriptionId_idx" ON "Subscription"("stripeSubscriptionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CreditTransaction_userId_idx" ON "CreditTransaction"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CreditTransaction_type_idx" ON "CreditTransaction"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CreditTransaction_category_idx" ON "CreditTransaction"("category");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CreditTransaction_createdAt_idx" ON "CreditTransaction"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "BrandVoice_userId_key" ON "BrandVoice"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WritingStyle_userId_idx" ON "WritingStyle"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WritingStyle_type_idx" ON "WritingStyle"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Workspace_slug_key" ON "Workspace"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Workspace_slug_idx" ON "Workspace"("slug");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Workspace_ownerId_idx" ON "Workspace"("ownerId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WorkspaceMember_workspaceId_idx" ON "WorkspaceMember"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WorkspaceMember_userId_idx" ON "WorkspaceMember"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "WorkspaceMember_workspaceId_userId_key" ON "WorkspaceMember"("workspaceId", "userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ApprovalWorkflow_workspaceId_idx" ON "ApprovalWorkflow"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ApprovalStep_workflowId_idx" ON "ApprovalStep"("workflowId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentApproval_contentId_idx" ON "ContentApproval"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentApproval_status_idx" ON "ContentApproval"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentApproval_requestedById_idx" ON "ContentApproval"("requestedById");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Niche_userId_idx" ON "Niche"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Niche_workspaceId_idx" ON "Niche"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "NicheSource_nicheId_idx" ON "NicheSource"("nicheId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Trend_nicheId_idx" ON "Trend"("nicheId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Trend_source_idx" ON "Trend"("source");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Trend_score_idx" ON "Trend"("score");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Trend_status_idx" ON "Trend"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Trend_discoveredAt_idx" ON "Trend"("discoveredAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Trend_nicheId_title_key" ON "Trend"("nicheId", "title");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TrendScan_nicheId_idx" ON "TrendScan"("nicheId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TrendScan_status_idx" ON "TrendScan"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TrendScan_createdAt_idx" ON "TrendScan"("createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "PsychologyTrigger_name_key" ON "PsychologyTrigger"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PsychologyTrigger_category_idx" ON "PsychologyTrigger"("category");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "EmotionalHook_emotion_idx" ON "EmotionalHook"("emotion");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "EmotionalHook_hookType_idx" ON "EmotionalHook"("hookType");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ContentPsychology_contentId_key" ON "ContentPsychology"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SeoKeyword_nicheId_idx" ON "SeoKeyword"("nicheId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SeoKeyword_keyword_idx" ON "SeoKeyword"("keyword");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "SeoKeyword_keyword_nicheId_key" ON "SeoKeyword"("keyword", "nicheId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ContentSeo_contentId_key" ON "ContentSeo"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SourceAccount_userId_idx" ON "SourceAccount"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SourceAccount_workspaceId_idx" ON "SourceAccount"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SourceAccount_platform_idx" ON "SourceAccount"("platform");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "SourceAccount_userId_platform_username_key" ON "SourceAccount"("userId", "platform", "username");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SourcePost_accountId_idx" ON "SourcePost"("accountId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SourcePost_engagementRate_idx" ON "SourcePost"("engagementRate");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "SourcePost_accountId_platformPostId_key" ON "SourcePost"("accountId", "platformPostId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "SourcePostAnalysis_postId_key" ON "SourcePostAnalysis"("postId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ViralPostAnalysis_userId_idx" ON "ViralPostAnalysis"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ViralPostAnalysis_platform_idx" ON "ViralPostAnalysis"("platform");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "MasterContent_userId_idx" ON "MasterContent"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "MasterContent_workspaceId_idx" ON "MasterContent"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "MasterContent_type_idx" ON "MasterContent"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "BuildingBlock_masterContentId_idx" ON "BuildingBlock"("masterContentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "BuildingBlock_type_idx" ON "BuildingBlock"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentSession_userId_idx" ON "ContentSession"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentSession_phase_idx" ON "ContentSession"("phase");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentVariation_sessionId_idx" ON "ContentVariation"("sessionId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_userId_idx" ON "Content"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_workspaceId_idx" ON "Content"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_nicheId_idx" ON "Content"("nicheId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_trendId_idx" ON "Content"("trendId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_masterContentId_idx" ON "Content"("masterContentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_type_idx" ON "Content"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_status_idx" ON "Content"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_category_idx" ON "Content"("category");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Content_isSourceVerified_idx" ON "Content"("isSourceVerified");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentVariant_contentId_idx" ON "ContentVariant"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentVariant_platform_idx" ON "ContentVariant"("platform");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Citation_contentId_idx" ON "Citation"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "DeepResearch_userId_idx" ON "DeepResearch"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "DeepResearch_status_idx" ON "DeepResearch"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "VideoContent_masterContentId_key" ON "VideoContent"("masterContentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "VideoContent_userId_idx" ON "VideoContent"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "VideoContent_masterContentId_idx" ON "VideoContent"("masterContentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "VideoThumbnail_videoId_idx" ON "VideoThumbnail"("videoId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Media_userId_idx" ON "Media"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Media_contentId_idx" ON "Media"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Media_type_idx" ON "Media"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_userId_idx" ON "Template"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_workspaceId_idx" ON "Template"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_platform_idx" ON "Template"("platform");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Template_isSystem_idx" ON "Template"("isSystem");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TemplateLayer_templateId_idx" ON "TemplateLayer"("templateId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Asset_userId_idx" ON "Asset"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Asset_type_idx" ON "Asset"("type");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SocialAccount_userId_idx" ON "SocialAccount"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SocialAccount_workspaceId_idx" ON "SocialAccount"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SocialAccount_platform_idx" ON "SocialAccount"("platform");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "SocialAccount_userId_platform_platformUserId_key" ON "SocialAccount"("userId", "platform", "platformUserId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ScheduledPost_userId_idx" ON "ScheduledPost"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ScheduledPost_socialAccountId_idx" ON "ScheduledPost"("socialAccountId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ScheduledPost_scheduledFor_idx" ON "ScheduledPost"("scheduledFor");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ScheduledPost_status_idx" ON "ScheduledPost"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PublishedPost_socialAccountId_idx" ON "PublishedPost"("socialAccountId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PublishedPost_platformPostId_idx" ON "PublishedPost"("platformPostId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PublishedPost_publishedAt_idx" ON "PublishedPost"("publishedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PublishedPost_isGoldPost_idx" ON "PublishedPost"("isGoldPost");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentAnalytics_contentId_idx" ON "ContentAnalytics"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentAnalytics_platform_idx" ON "ContentAnalytics"("platform");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentAnalytics_recordedAt_idx" ON "ContentAnalytics"("recordedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PostAnalytics_publishedPostId_idx" ON "PostAnalytics"("publishedPostId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "PostAnalytics_snapshotAt_idx" ON "PostAnalytics"("snapshotAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ABTest_userId_idx" ON "ABTest"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ABTest_status_idx" ON "ABTest"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "EngagementPrediction_contentId_idx" ON "EngagementPrediction"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentCalendar_userId_idx" ON "ContentCalendar"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentCalendar_workspaceId_idx" ON "ContentCalendar"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CalendarEntry_calendarId_idx" ON "CalendarEntry"("calendarId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CalendarEntry_date_idx" ON "CalendarEntry"("date");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "OptimalPostTime_socialAccountId_idx" ON "OptimalPostTime"("socialAccountId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "OptimalPostTime_socialAccountId_platform_dayOfWeek_hour_key" ON "OptimalPostTime"("socialAccountId", "platform", "dayOfWeek", "hour");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WorkflowTemplate_userId_idx" ON "WorkflowTemplate"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WorkflowTemplate_isSystem_idx" ON "WorkflowTemplate"("isSystem");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WorkflowDay_templateId_idx" ON "WorkflowDay"("templateId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WorkflowTask_dayId_idx" ON "WorkflowTask"("dayId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "YouTubeVideo_videoId_key" ON "YouTubeVideo"("videoId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "YouTubeVideo_videoId_idx" ON "YouTubeVideo"("videoId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "YouTubeVideo_channelId_idx" ON "YouTubeVideo"("channelId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "RssFeed_url_key" ON "RssFeed"("url");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RssFeed_url_idx" ON "RssFeed"("url");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RssFeedItem_feedId_idx" ON "RssFeedItem"("feedId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "RssFeedItem_publishedAt_idx" ON "RssFeedItem"("publishedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "RssFeedItem_feedId_guid_key" ON "RssFeedItem"("feedId", "guid");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ApiKey_key_key" ON "ApiKey"("key");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ApiKey_keyHash_idx" ON "ApiKey"("keyHash");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ApiKey_userId_idx" ON "ApiKey"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Webhook_userId_idx" ON "Webhook"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Webhook_workspaceId_idx" ON "Webhook"("workspaceId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WebhookLog_webhookId_idx" ON "WebhookLog"("webhookId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "WebhookLog_sentAt_idx" ON "WebhookLog"("sentAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "SystemSetting_key_key" ON "SystemSetting"("key");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "SystemSetting_key_idx" ON "SystemSetting"("key");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "JobLog_jobName_idx" ON "JobLog"("jobName");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "JobLog_status_idx" ON "JobLog"("status");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "JobLog_startedAt_idx" ON "JobLog"("startedAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "CopywritingFormula_name_key" ON "CopywritingFormula"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CtaTemplate_category_idx" ON "CtaTemplate"("category");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentSource_contentId_idx" ON "ContentSource"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentSource_sourceType_idx" ON "ContentSource"("sourceType");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ContentSource_isVerified_idx" ON "ContentSource"("isVerified");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ViralLearning_platform_idx" ON "ViralLearning"("platform");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ViralLearning_tags_idx" ON "ViralLearning"("tags");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ViralLearning_timesUsed_idx" ON "ViralLearning"("timesUsed");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "InstagramContent_contentId_idx" ON "InstagramContent"("contentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "InstagramContent_format_idx" ON "InstagramContent"("format");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CarouselSlide_instagramContentId_idx" ON "CarouselSlide"("instagramContentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "CarouselSlide_order_idx" ON "CarouselSlide"("order");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Tenant_domain_key" ON "Tenant"("domain");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Tenant_domain_idx" ON "Tenant"("domain");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Translation_key_locale_namespace_tenantId_key" ON "Translation"("key", "locale", "namespace", "tenantId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_stripeCustomerId_key" ON "User"("stripeCustomerId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "User_plan_idx" ON "User"("plan");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Translation" ADD CONSTRAINT "Translation_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Subscription" ADD CONSTRAINT "Subscription_planId_fkey" FOREIGN KEY ("planId") REFERENCES "SubscriptionPlan"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CreditTransaction" ADD CONSTRAINT "CreditTransaction_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "BrandVoice" ADD CONSTRAINT "BrandVoice_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WritingStyle" ADD CONSTRAINT "WritingStyle_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Workspace" ADD CONSTRAINT "Workspace_tenantId_fkey" FOREIGN KEY ("tenantId") REFERENCES "Tenant"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Workspace" ADD CONSTRAINT "Workspace_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WorkspaceMember" ADD CONSTRAINT "WorkspaceMember_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WorkspaceMember" ADD CONSTRAINT "WorkspaceMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ApprovalWorkflow" ADD CONSTRAINT "ApprovalWorkflow_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ApprovalStep" ADD CONSTRAINT "ApprovalStep_workflowId_fkey" FOREIGN KEY ("workflowId") REFERENCES "ApprovalWorkflow"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentApproval" ADD CONSTRAINT "ContentApproval_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentApproval" ADD CONSTRAINT "ContentApproval_requestedById_fkey" FOREIGN KEY ("requestedById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentApproval" ADD CONSTRAINT "ContentApproval_reviewedById_fkey" FOREIGN KEY ("reviewedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Niche" ADD CONSTRAINT "Niche_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Niche" ADD CONSTRAINT "Niche_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "NicheSource" ADD CONSTRAINT "NicheSource_nicheId_fkey" FOREIGN KEY ("nicheId") REFERENCES "Niche"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Trend" ADD CONSTRAINT "Trend_nicheId_fkey" FOREIGN KEY ("nicheId") REFERENCES "Niche"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Trend" ADD CONSTRAINT "Trend_scanId_fkey" FOREIGN KEY ("scanId") REFERENCES "TrendScan"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentPsychology" ADD CONSTRAINT "ContentPsychology_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SeoKeyword" ADD CONSTRAINT "SeoKeyword_nicheId_fkey" FOREIGN KEY ("nicheId") REFERENCES "Niche"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentSeo" ADD CONSTRAINT "ContentSeo_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SourceAccount" ADD CONSTRAINT "SourceAccount_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SourceAccount" ADD CONSTRAINT "SourceAccount_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SourcePost" ADD CONSTRAINT "SourcePost_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "SourceAccount"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SourcePostAnalysis" ADD CONSTRAINT "SourcePostAnalysis_postId_fkey" FOREIGN KEY ("postId") REFERENCES "SourcePost"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MasterContent" ADD CONSTRAINT "MasterContent_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MasterContent" ADD CONSTRAINT "MasterContent_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MasterContent" ADD CONSTRAINT "MasterContent_nicheId_fkey" FOREIGN KEY ("nicheId") REFERENCES "Niche"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MasterContent" ADD CONSTRAINT "MasterContent_trendId_fkey" FOREIGN KEY ("trendId") REFERENCES "Trend"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MasterContent" ADD CONSTRAINT "MasterContent_writingStyleId_fkey" FOREIGN KEY ("writingStyleId") REFERENCES "WritingStyle"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MasterContent" ADD CONSTRAINT "MasterContent_researchId_fkey" FOREIGN KEY ("researchId") REFERENCES "DeepResearch"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "BuildingBlock" ADD CONSTRAINT "BuildingBlock_masterContentId_fkey" FOREIGN KEY ("masterContentId") REFERENCES "MasterContent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentSession" ADD CONSTRAINT "ContentSession_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentVariation" ADD CONSTRAINT "ContentVariation_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "ContentSession"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Content" ADD CONSTRAINT "Content_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Content" ADD CONSTRAINT "Content_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Content" ADD CONSTRAINT "Content_nicheId_fkey" FOREIGN KEY ("nicheId") REFERENCES "Niche"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Content" ADD CONSTRAINT "Content_trendId_fkey" FOREIGN KEY ("trendId") REFERENCES "Trend"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Content" ADD CONSTRAINT "Content_masterContentId_fkey" FOREIGN KEY ("masterContentId") REFERENCES "MasterContent"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Content" ADD CONSTRAINT "Content_abTestId_fkey" FOREIGN KEY ("abTestId") REFERENCES "ABTest"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Content" ADD CONSTRAINT "Content_researchId_fkey" FOREIGN KEY ("researchId") REFERENCES "DeepResearch"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentVariant" ADD CONSTRAINT "ContentVariant_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Citation" ADD CONSTRAINT "Citation_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "DeepResearch" ADD CONSTRAINT "DeepResearch_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "VideoContent" ADD CONSTRAINT "VideoContent_masterContentId_fkey" FOREIGN KEY ("masterContentId") REFERENCES "MasterContent"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "VideoContent" ADD CONSTRAINT "VideoContent_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "VideoThumbnail" ADD CONSTRAINT "VideoThumbnail_videoId_fkey" FOREIGN KEY ("videoId") REFERENCES "VideoContent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Media" ADD CONSTRAINT "Media_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Media" ADD CONSTRAINT "Media_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Media" ADD CONSTRAINT "Media_variantId_fkey" FOREIGN KEY ("variantId") REFERENCES "ContentVariant"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Template" ADD CONSTRAINT "Template_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Template" ADD CONSTRAINT "Template_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "TemplateLayer" ADD CONSTRAINT "TemplateLayer_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "Template"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "TemplateLayer" ADD CONSTRAINT "TemplateLayer_assetId_fkey" FOREIGN KEY ("assetId") REFERENCES "Asset"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Asset" ADD CONSTRAINT "Asset_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SocialAccount" ADD CONSTRAINT "SocialAccount_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "SocialAccount" ADD CONSTRAINT "SocialAccount_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ScheduledPost" ADD CONSTRAINT "ScheduledPost_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ScheduledPost" ADD CONSTRAINT "ScheduledPost_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ScheduledPost" ADD CONSTRAINT "ScheduledPost_variantId_fkey" FOREIGN KEY ("variantId") REFERENCES "ContentVariant"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ScheduledPost" ADD CONSTRAINT "ScheduledPost_socialAccountId_fkey" FOREIGN KEY ("socialAccountId") REFERENCES "SocialAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ScheduledPost" ADD CONSTRAINT "ScheduledPost_publishedPostId_fkey" FOREIGN KEY ("publishedPostId") REFERENCES "PublishedPost"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "PublishedPost" ADD CONSTRAINT "PublishedPost_socialAccountId_fkey" FOREIGN KEY ("socialAccountId") REFERENCES "SocialAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentAnalytics" ADD CONSTRAINT "ContentAnalytics_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "PostAnalytics" ADD CONSTRAINT "PostAnalytics_publishedPostId_fkey" FOREIGN KEY ("publishedPostId") REFERENCES "PublishedPost"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentCalendar" ADD CONSTRAINT "ContentCalendar_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentCalendar" ADD CONSTRAINT "ContentCalendar_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CalendarEntry" ADD CONSTRAINT "CalendarEntry_calendarId_fkey" FOREIGN KEY ("calendarId") REFERENCES "ContentCalendar"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "OptimalPostTime" ADD CONSTRAINT "OptimalPostTime_socialAccountId_fkey" FOREIGN KEY ("socialAccountId") REFERENCES "SocialAccount"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WorkflowTemplate" ADD CONSTRAINT "WorkflowTemplate_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WorkflowDay" ADD CONSTRAINT "WorkflowDay_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "WorkflowTemplate"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WorkflowTask" ADD CONSTRAINT "WorkflowTask_dayId_fkey" FOREIGN KEY ("dayId") REFERENCES "WorkflowDay"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "RssFeedItem" ADD CONSTRAINT "RssFeedItem_feedId_fkey" FOREIGN KEY ("feedId") REFERENCES "RssFeed"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ApiKey" ADD CONSTRAINT "ApiKey_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Webhook" ADD CONSTRAINT "Webhook_workspaceId_fkey" FOREIGN KEY ("workspaceId") REFERENCES "Workspace"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WebhookLog" ADD CONSTRAINT "WebhookLog_webhookId_fkey" FOREIGN KEY ("webhookId") REFERENCES "Webhook"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ContentSource" ADD CONSTRAINT "ContentSource_contentId_fkey" FOREIGN KEY ("contentId") REFERENCES "Content"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "CarouselSlide" ADD CONSTRAINT "CarouselSlide_instagramContentId_fkey" FOREIGN KEY ("instagramContentId") REFERENCES "InstagramContent"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|