From cb095ab7eebd68ca2f1b906ec1bc2c973bb97414 Mon Sep 17 00:00:00 2001 From: alma Date: Fri, 2 May 2025 09:15:59 +0200 Subject: [PATCH] courrier msft oauth --- prisma/complete_migration.sql | 114 ++++++++++++++ .../20240612_add_oauth_fields/migration.sql | 7 - .../migration.sql | 38 ----- prisma/migrations/migration_lock.toml | 3 - scripts/regenerate-migrations.sh | 139 ++++++++++++++++++ 5 files changed, 253 insertions(+), 48 deletions(-) create mode 100644 prisma/complete_migration.sql delete mode 100644 prisma/migrations/20240612_add_oauth_fields/migration.sql delete mode 100644 prisma/migrations/20250413123640_add_user_id_indexes/migration.sql delete mode 100644 prisma/migrations/migration_lock.toml create mode 100755 scripts/regenerate-migrations.sh diff --git a/prisma/complete_migration.sql b/prisma/complete_migration.sql new file mode 100644 index 00000000..b4950a22 --- /dev/null +++ b/prisma/complete_migration.sql @@ -0,0 +1,114 @@ +-- Complete migration script for all Prisma tables +-- Run this directly on your PostgreSQL server + +-- Create User table if it doesn't exist +CREATE TABLE IF NOT EXISTS "User" ( + "id" TEXT PRIMARY KEY, + "email" TEXT UNIQUE NOT NULL, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL +); + +-- Create Calendar table if it doesn't exist +CREATE TABLE IF NOT EXISTS "Calendar" ( + "id" TEXT PRIMARY KEY, + "name" TEXT NOT NULL, + "color" TEXT NOT NULL DEFAULT '#0082c9', + "description" TEXT, + "userId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE +); + +-- Create index on Calendar +CREATE INDEX IF NOT EXISTS "Calendar_userId_idx" ON "Calendar"("userId"); + +-- Create Event table if it doesn't exist +CREATE TABLE IF NOT EXISTS "Event" ( + "id" TEXT PRIMARY KEY, + "title" TEXT NOT NULL, + "description" TEXT, + "start" TIMESTAMP(3) NOT NULL, + "end" TIMESTAMP(3) NOT NULL, + "location" TEXT, + "isAllDay" BOOLEAN NOT NULL DEFAULT false, + "calendarId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + FOREIGN KEY ("calendarId") REFERENCES "Calendar"("id") ON DELETE CASCADE, + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE +); + +-- Create indexes on Event +CREATE INDEX IF NOT EXISTS "Event_calendarId_idx" ON "Event"("calendarId"); +CREATE INDEX IF NOT EXISTS "Event_userId_idx" ON "Event"("userId"); + +-- Create or update MailCredentials table with OAuth support +DO $$ +BEGIN + -- Check if MailCredentials table exists + IF EXISTS (SELECT FROM information_schema.tables WHERE table_name = 'MailCredentials') THEN + -- Alter existing table to add OAuth fields + BEGIN + -- Make password column nullable + ALTER TABLE "MailCredentials" ALTER COLUMN "password" DROP NOT NULL; + EXCEPTION WHEN undefined_column THEN + -- Password column doesn't exist or is already nullable + END; + + -- Add OAuth columns if they don't exist + BEGIN + ALTER TABLE "MailCredentials" + ADD COLUMN IF NOT EXISTS "useOAuth" BOOLEAN NOT NULL DEFAULT false, + ADD COLUMN IF NOT EXISTS "refreshToken" TEXT, + ADD COLUMN IF NOT EXISTS "accessToken" TEXT, + ADD COLUMN IF NOT EXISTS "tokenExpiry" TIMESTAMP(3); + EXCEPTION WHEN duplicate_column THEN + -- Columns already exist + END; + ELSE + -- Create MailCredentials table with OAuth support + CREATE TABLE "MailCredentials" ( + "id" TEXT PRIMARY KEY, + "userId" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT, + "host" TEXT NOT NULL, + "port" INTEGER NOT NULL, + "secure" BOOLEAN NOT NULL DEFAULT true, + "useOAuth" BOOLEAN NOT NULL DEFAULT false, + "refreshToken" TEXT, + "accessToken" TEXT, + "tokenExpiry" TIMESTAMP(3), + "smtp_host" TEXT, + "smtp_port" INTEGER, + "smtp_secure" BOOLEAN DEFAULT false, + "display_name" TEXT, + "color" TEXT DEFAULT '#0082c9', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE, + UNIQUE("userId", "email") + ); + + -- Create index on MailCredentials + CREATE INDEX IF NOT EXISTS "MailCredentials_userId_idx" ON "MailCredentials"("userId"); + END IF; +END $$; + +-- Create WebDAVCredentials table if it doesn't exist +CREATE TABLE IF NOT EXISTS "WebDAVCredentials" ( + "id" TEXT PRIMARY KEY, + "userId" TEXT UNIQUE NOT NULL, + "username" TEXT NOT NULL, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE +); + +-- Create index on WebDAVCredentials +CREATE INDEX IF NOT EXISTS "WebDAVCredentials_userId_idx" ON "WebDAVCredentials"("userId"); \ No newline at end of file diff --git a/prisma/migrations/20240612_add_oauth_fields/migration.sql b/prisma/migrations/20240612_add_oauth_fields/migration.sql deleted file mode 100644 index e1d4a868..00000000 --- a/prisma/migrations/20240612_add_oauth_fields/migration.sql +++ /dev/null @@ -1,7 +0,0 @@ --- AlterTable to make password optional and add OAuth fields -ALTER TABLE "MailCredentials" - ALTER COLUMN "password" DROP NOT NULL, - ADD COLUMN "useOAuth" BOOLEAN NOT NULL DEFAULT false, - ADD COLUMN "refreshToken" TEXT, - ADD COLUMN "accessToken" TEXT, - ADD COLUMN "tokenExpiry" TIMESTAMP(3); \ No newline at end of file diff --git a/prisma/migrations/20250413123640_add_user_id_indexes/migration.sql b/prisma/migrations/20250413123640_add_user_id_indexes/migration.sql deleted file mode 100644 index 31d257db..00000000 --- a/prisma/migrations/20250413123640_add_user_id_indexes/migration.sql +++ /dev/null @@ -1,38 +0,0 @@ --- CreateTable -CREATE TABLE "Calendar" ( - "id" TEXT NOT NULL, - "name" TEXT NOT NULL, - "color" TEXT NOT NULL DEFAULT '#0082c9', - "description" TEXT, - "userId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Calendar_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Event" ( - "id" TEXT NOT NULL, - "title" TEXT NOT NULL, - "description" TEXT, - "start" TIMESTAMP(3) NOT NULL, - "end" TIMESTAMP(3) NOT NULL, - "location" TEXT, - "isAllDay" BOOLEAN NOT NULL DEFAULT false, - "calendarId" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Event_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE INDEX "Event_calendarId_idx" ON "Event"("calendarId"); - --- CreateIndex -CREATE INDEX "Event_userId_idx" ON "Event"("userId"); - --- AddForeignKey -ALTER TABLE "Event" ADD CONSTRAINT "Event_calendarId_fkey" FOREIGN KEY ("calendarId") REFERENCES "Calendar"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml deleted file mode 100644 index 648c57fd..00000000 --- a/prisma/migrations/migration_lock.toml +++ /dev/null @@ -1,3 +0,0 @@ -# Please do not edit this file manually -# It should be added in your version-control system (e.g., Git) -provider = "postgresql" \ No newline at end of file diff --git a/scripts/regenerate-migrations.sh b/scripts/regenerate-migrations.sh new file mode 100755 index 00000000..4977eeea --- /dev/null +++ b/scripts/regenerate-migrations.sh @@ -0,0 +1,139 @@ +#!/bin/bash + +# Script to regenerate Prisma migrations properly + +# Step 1: Remove existing migrations +echo "Removing existing migrations..." +rm -rf prisma/migrations + +# Step 2: Create migration directory +mkdir -p prisma/migrations/20240612000000_initial_schema + +# Step 3: Create migration file +cat > prisma/migrations/20240612000000_initial_schema/migration.sql << EOL +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Calendar" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "color" TEXT NOT NULL DEFAULT '#0082c9', + "description" TEXT, + "userId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Calendar_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Event" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "description" TEXT, + "start" TIMESTAMP(3) NOT NULL, + "end" TIMESTAMP(3) NOT NULL, + "location" TEXT, + "isAllDay" BOOLEAN NOT NULL DEFAULT false, + "calendarId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Event_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MailCredentials" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "email" TEXT NOT NULL, + "password" TEXT, + "host" TEXT NOT NULL, + "port" INTEGER NOT NULL, + "secure" BOOLEAN NOT NULL DEFAULT true, + "useOAuth" BOOLEAN NOT NULL DEFAULT false, + "refreshToken" TEXT, + "accessToken" TEXT, + "tokenExpiry" TIMESTAMP(3), + "smtp_host" TEXT, + "smtp_port" INTEGER, + "smtp_secure" BOOLEAN DEFAULT false, + "display_name" TEXT, + "color" TEXT DEFAULT '#0082c9', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "MailCredentials_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "WebDAVCredentials" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "username" TEXT NOT NULL, + "password" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "WebDAVCredentials_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE INDEX "Calendar_userId_idx" ON "Calendar"("userId"); + +-- CreateIndex +CREATE INDEX "Event_calendarId_idx" ON "Event"("calendarId"); + +-- CreateIndex +CREATE INDEX "Event_userId_idx" ON "Event"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "MailCredentials_userId_email_key" ON "MailCredentials"("userId", "email"); + +-- CreateIndex +CREATE INDEX "MailCredentials_userId_idx" ON "MailCredentials"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "WebDAVCredentials_userId_key" ON "WebDAVCredentials"("userId"); + +-- CreateIndex +CREATE INDEX "WebDAVCredentials_userId_idx" ON "WebDAVCredentials"("userId"); + +-- AddForeignKey +ALTER TABLE "Calendar" ADD CONSTRAINT "Calendar_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Event" ADD CONSTRAINT "Event_calendarId_fkey" FOREIGN KEY ("calendarId") REFERENCES "Calendar"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Event" ADD CONSTRAINT "Event_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MailCredentials" ADD CONSTRAINT "MailCredentials_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "WebDAVCredentials" ADD CONSTRAINT "WebDAVCredentials_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +EOL + +# Step 4: Create migration_lock.toml file +cat > prisma/migrations/migration_lock.toml << EOL +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "postgresql" +EOL + +echo "Migrations regenerated successfully!" +echo "Now run: npx prisma migrate resolve --applied 20240612000000_initial_schema" \ No newline at end of file