331 lines
11 KiB
SQL
331 lines
11 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "TemplateType" AS ENUM ('MARKETING', 'TRANSACTIONAL');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "TemplateStyle" AS ENUM ('PLUNK', 'HTML');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "EmailStatus" AS ENUM ('SENT', 'DELIVERED', 'BOUNCED', 'OPENED', 'COMPLAINT');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "CampaignStatus" AS ENUM ('DRAFT', 'SCHEDULED', 'DELIVERED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "Role" AS ENUM ('OWNER', 'ADMIN', 'MEMBER');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"password" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "projects" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"url" TEXT NOT NULL,
|
|
"verified" BOOLEAN NOT NULL DEFAULT false,
|
|
"email" TEXT,
|
|
"from" TEXT,
|
|
"public" TEXT NOT NULL,
|
|
"secret" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "projects_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "projectmemberhips" (
|
|
"role" "Role" NOT NULL DEFAULT 'MEMBER',
|
|
"userId" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "projectmemberhips_pkey" PRIMARY KEY ("userId","projectId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "events" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"templateId" TEXT,
|
|
"campaignId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "events_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "templates" (
|
|
"id" TEXT NOT NULL,
|
|
"subject" TEXT NOT NULL,
|
|
"body" TEXT NOT NULL,
|
|
"type" "TemplateType" NOT NULL,
|
|
"style" "TemplateStyle" NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "templates_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "actions" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"runOnce" BOOLEAN NOT NULL DEFAULT false,
|
|
"delay" INTEGER NOT NULL DEFAULT 0,
|
|
"projectId" TEXT NOT NULL,
|
|
"templateId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "actions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "campaigns" (
|
|
"id" TEXT NOT NULL,
|
|
"subject" TEXT NOT NULL,
|
|
"body" TEXT NOT NULL,
|
|
"status" "CampaignStatus" NOT NULL DEFAULT 'DRAFT',
|
|
"delivered" TIMESTAMP(3),
|
|
"style" "TemplateStyle" NOT NULL,
|
|
"projectId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "triggers" (
|
|
"id" TEXT NOT NULL,
|
|
"contactId" TEXT NOT NULL,
|
|
"eventId" TEXT,
|
|
"actionId" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "triggers_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "contacts" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"subscribed" BOOLEAN NOT NULL DEFAULT true,
|
|
"data" TEXT,
|
|
"projectId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "contacts_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "emails" (
|
|
"id" TEXT NOT NULL,
|
|
"messageId" TEXT NOT NULL,
|
|
"subject" TEXT,
|
|
"body" TEXT,
|
|
"status" "EmailStatus" NOT NULL DEFAULT 'SENT',
|
|
"projectId" TEXT,
|
|
"actionId" TEXT,
|
|
"campaignId" TEXT,
|
|
"contactId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "emails_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "clicks" (
|
|
"id" TEXT NOT NULL,
|
|
"link" TEXT NOT NULL,
|
|
"emailId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "clicks_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "tasks" (
|
|
"id" TEXT NOT NULL,
|
|
"runBy" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"actionId" TEXT,
|
|
"campaignId" TEXT,
|
|
"contactId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "tasks_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "_ActionToEvent" (
|
|
"A" TEXT NOT NULL,
|
|
"B" TEXT NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "_ActionToNotEvent" (
|
|
"A" TEXT NOT NULL,
|
|
"B" TEXT NOT NULL
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "_CampaignToContact" (
|
|
"A" TEXT NOT NULL,
|
|
"B" TEXT NOT NULL
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "projects_public_key" ON "projects"("public");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "projects_secret_key" ON "projects"("secret");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "events_projectId_templateId_campaignId_idx" ON "events"("projectId", "templateId", "campaignId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "templates_projectId_idx" ON "templates"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "actions_projectId_templateId_idx" ON "actions"("projectId", "templateId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "campaigns_projectId_idx" ON "campaigns"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "triggers_contactId_eventId_actionId_createdAt_idx" ON "triggers"("contactId", "eventId", "actionId", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "contacts_projectId_idx" ON "contacts"("projectId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "emails_messageId_key" ON "emails"("messageId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "emails_projectId_actionId_campaignId_contactId_createdAt_idx" ON "emails"("projectId", "actionId", "campaignId", "contactId", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "clicks_emailId_createdAt_idx" ON "clicks"("emailId", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "tasks_runBy_createdAt_idx" ON "tasks"("runBy", "createdAt");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "_ActionToEvent_AB_unique" ON "_ActionToEvent"("A", "B");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "_ActionToEvent_B_index" ON "_ActionToEvent"("B");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "_ActionToNotEvent_AB_unique" ON "_ActionToNotEvent"("A", "B");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "_ActionToNotEvent_B_index" ON "_ActionToNotEvent"("B");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "_CampaignToContact_AB_unique" ON "_CampaignToContact"("A", "B");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "_CampaignToContact_B_index" ON "_CampaignToContact"("B");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "projectmemberhips" ADD CONSTRAINT "projectmemberhips_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "projectmemberhips" ADD CONSTRAINT "projectmemberhips_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "events" ADD CONSTRAINT "events_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "events" ADD CONSTRAINT "events_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "templates"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "events" ADD CONSTRAINT "events_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "templates" ADD CONSTRAINT "templates_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "actions" ADD CONSTRAINT "actions_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "actions" ADD CONSTRAINT "actions_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "templates"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "campaigns" ADD CONSTRAINT "campaigns_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "triggers" ADD CONSTRAINT "triggers_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "triggers" ADD CONSTRAINT "triggers_eventId_fkey" FOREIGN KEY ("eventId") REFERENCES "events"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "triggers" ADD CONSTRAINT "triggers_actionId_fkey" FOREIGN KEY ("actionId") REFERENCES "actions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "contacts" ADD CONSTRAINT "contacts_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "emails" ADD CONSTRAINT "emails_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "projects"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "emails" ADD CONSTRAINT "emails_actionId_fkey" FOREIGN KEY ("actionId") REFERENCES "actions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "emails" ADD CONSTRAINT "emails_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "emails" ADD CONSTRAINT "emails_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "clicks" ADD CONSTRAINT "clicks_emailId_fkey" FOREIGN KEY ("emailId") REFERENCES "emails"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tasks" ADD CONSTRAINT "tasks_actionId_fkey" FOREIGN KEY ("actionId") REFERENCES "actions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tasks" ADD CONSTRAINT "tasks_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "tasks" ADD CONSTRAINT "tasks_contactId_fkey" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_ActionToEvent" ADD CONSTRAINT "_ActionToEvent_A_fkey" FOREIGN KEY ("A") REFERENCES "actions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_ActionToEvent" ADD CONSTRAINT "_ActionToEvent_B_fkey" FOREIGN KEY ("B") REFERENCES "events"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_ActionToNotEvent" ADD CONSTRAINT "_ActionToNotEvent_A_fkey" FOREIGN KEY ("A") REFERENCES "actions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_ActionToNotEvent" ADD CONSTRAINT "_ActionToNotEvent_B_fkey" FOREIGN KEY ("B") REFERENCES "events"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_CampaignToContact" ADD CONSTRAINT "_CampaignToContact_A_fkey" FOREIGN KEY ("A") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "_CampaignToContact" ADD CONSTRAINT "_CampaignToContact_B_fkey" FOREIGN KEY ("B") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|