122 lines
4.1 KiB
SQL
122 lines
4.1 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "SubscriptionTier" AS ENUM ('FREE', 'STARTER', 'PRO');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SubscriptionStatus" AS ENUM ('ACTIVE', 'PAST_DUE', 'CANCELED', 'UNPAID');
|
|
|
|
-- Drop existing foreign key on Generation
|
|
ALTER TABLE "Generation" DROP CONSTRAINT IF EXISTS "Generation_userId_fkey";
|
|
|
|
-- Drop old User table (clean migration — no real users)
|
|
DROP TABLE IF EXISTS "User" CASCADE;
|
|
|
|
-- CreateTable User (new schema with auth fields)
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"name" TEXT,
|
|
"emailVerified" BOOLEAN NOT NULL DEFAULT false,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable Subscription
|
|
CREATE TABLE "Subscription" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"tier" "SubscriptionTier" NOT NULL DEFAULT 'FREE',
|
|
"status" "SubscriptionStatus" NOT NULL DEFAULT 'ACTIVE',
|
|
"stripeCustomerId" TEXT,
|
|
"stripeSubscriptionId" TEXT,
|
|
"stripePriceId" TEXT,
|
|
"generationsLimit" INTEGER NOT NULL DEFAULT 15,
|
|
"generationsUsed" INTEGER NOT NULL DEFAULT 0,
|
|
"currentPeriodStart" TIMESTAMP(3),
|
|
"currentPeriodEnd" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Subscription_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable ApiKey
|
|
CREATE TABLE "ApiKey" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL DEFAULT 'Default',
|
|
"keyHash" TEXT NOT NULL,
|
|
"keyPrefix" TEXT NOT NULL,
|
|
"revoked" BOOLEAN NOT NULL DEFAULT false,
|
|
"lastUsedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ApiKey_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable PasswordResetToken
|
|
CREATE TABLE "PasswordResetToken" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"token" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "PasswordResetToken_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable EmailVerificationToken
|
|
CREATE TABLE "EmailVerificationToken" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"token" TEXT NOT NULL,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "EmailVerificationToken_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Subscription_userId_key" ON "Subscription"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Subscription_stripeCustomerId_key" ON "Subscription"("stripeCustomerId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Subscription_stripeSubscriptionId_key" ON "Subscription"("stripeSubscriptionId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ApiKey_keyHash_key" ON "ApiKey"("keyHash");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ApiKey_userId_idx" ON "ApiKey"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "PasswordResetToken_token_key" ON "PasswordResetToken"("token");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "EmailVerificationToken_token_key" ON "EmailVerificationToken"("token");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Generation_userId_idx" ON "Generation"("userId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Generation" ADD CONSTRAINT "Generation_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("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 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 "PasswordResetToken" ADD CONSTRAINT "PasswordResetToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "EmailVerificationToken" ADD CONSTRAINT "EmailVerificationToken_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|