mirror of
				https://github.com/9technologygroup/patchmon.net.git
				synced 2025-11-04 05:53:27 +00:00 
			
		
		
		
	Make user_sessions migration idempotent for 1.2.7 compatibility
- Modified 20251005000000_add_user_sessions to check if table exists first - Added existence checks for all indexes and foreign keys - Migration now works for both fresh installs and 1.2.7 upgrades - Prevents P3018 error by gracefully handling existing table - Added comprehensive logging for debugging
This commit is contained in:
		@@ -52,4 +52,13 @@ BEGIN
 | 
			
		||||
        RAISE NOTICE 'Table does not exist - migration will proceed normally';
 | 
			
		||||
    END IF;
 | 
			
		||||
    
 | 
			
		||||
    -- Additional check: If we have any old migration names, update them
 | 
			
		||||
    IF EXISTS (SELECT 1 FROM _prisma_migrations WHERE migration_name = 'add_user_sessions') THEN
 | 
			
		||||
        RAISE NOTICE 'Found old migration name - updating to new format';
 | 
			
		||||
        UPDATE _prisma_migrations 
 | 
			
		||||
        SET migration_name = '20251005000000_add_user_sessions'
 | 
			
		||||
        WHERE migration_name = 'add_user_sessions';
 | 
			
		||||
        RAISE NOTICE 'Old migration name updated';
 | 
			
		||||
    END IF;
 | 
			
		||||
    
 | 
			
		||||
END $$;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,106 @@
 | 
			
		||||
-- CreateTable
 | 
			
		||||
CREATE TABLE "user_sessions" (
 | 
			
		||||
    "id" TEXT NOT NULL,
 | 
			
		||||
    "user_id" TEXT NOT NULL,
 | 
			
		||||
    "refresh_token" TEXT NOT NULL,
 | 
			
		||||
    "access_token_hash" TEXT,
 | 
			
		||||
    "ip_address" TEXT,
 | 
			
		||||
    "user_agent" TEXT,
 | 
			
		||||
    "last_activity" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
 | 
			
		||||
    "expires_at" TIMESTAMP(3) NOT NULL,
 | 
			
		||||
    "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
 | 
			
		||||
    "is_revoked" BOOLEAN NOT NULL DEFAULT false,
 | 
			
		||||
-- CreateTable (with existence check for 1.2.7 compatibility)
 | 
			
		||||
DO $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    -- Check if table already exists (from 1.2.7 installation)
 | 
			
		||||
    IF NOT EXISTS (
 | 
			
		||||
        SELECT 1 FROM information_schema.tables 
 | 
			
		||||
        WHERE table_schema = 'public' 
 | 
			
		||||
        AND table_name = 'user_sessions'
 | 
			
		||||
    ) THEN
 | 
			
		||||
        -- Table doesn't exist, create it
 | 
			
		||||
        CREATE TABLE "user_sessions" (
 | 
			
		||||
            "id" TEXT NOT NULL,
 | 
			
		||||
            "user_id" TEXT NOT NULL,
 | 
			
		||||
            "refresh_token" TEXT NOT NULL,
 | 
			
		||||
            "access_token_hash" TEXT,
 | 
			
		||||
            "ip_address" TEXT,
 | 
			
		||||
            "user_agent" TEXT,
 | 
			
		||||
            "last_activity" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
 | 
			
		||||
            "expires_at" TIMESTAMP(3) NOT NULL,
 | 
			
		||||
            "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
 | 
			
		||||
            "is_revoked" BOOLEAN NOT NULL DEFAULT false,
 | 
			
		||||
 | 
			
		||||
    CONSTRAINT "user_sessions_pkey" PRIMARY KEY ("id")
 | 
			
		||||
);
 | 
			
		||||
            CONSTRAINT "user_sessions_pkey" PRIMARY KEY ("id")
 | 
			
		||||
        );
 | 
			
		||||
        
 | 
			
		||||
-- CreateIndex
 | 
			
		||||
CREATE UNIQUE INDEX "user_sessions_refresh_token_key" ON "user_sessions"("refresh_token");
 | 
			
		||||
        RAISE NOTICE 'Created user_sessions table';
 | 
			
		||||
    ELSE
 | 
			
		||||
        RAISE NOTICE 'user_sessions table already exists, skipping creation';
 | 
			
		||||
    END IF;
 | 
			
		||||
END $$;
 | 
			
		||||
 | 
			
		||||
-- CreateIndex
 | 
			
		||||
CREATE INDEX "user_sessions_user_id_idx" ON "user_sessions"("user_id");
 | 
			
		||||
-- CreateIndex (with existence check)
 | 
			
		||||
DO $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    IF NOT EXISTS (
 | 
			
		||||
        SELECT 1 FROM pg_indexes 
 | 
			
		||||
        WHERE tablename = 'user_sessions' 
 | 
			
		||||
        AND indexname = 'user_sessions_refresh_token_key'
 | 
			
		||||
    ) THEN
 | 
			
		||||
        CREATE UNIQUE INDEX "user_sessions_refresh_token_key" ON "user_sessions"("refresh_token");
 | 
			
		||||
        RAISE NOTICE 'Created user_sessions_refresh_token_key index';
 | 
			
		||||
    ELSE
 | 
			
		||||
        RAISE NOTICE 'user_sessions_refresh_token_key index already exists, skipping';
 | 
			
		||||
    END IF;
 | 
			
		||||
END $$;
 | 
			
		||||
 | 
			
		||||
-- CreateIndex
 | 
			
		||||
CREATE INDEX "user_sessions_refresh_token_idx" ON "user_sessions"("refresh_token");
 | 
			
		||||
-- CreateIndex (with existence check)
 | 
			
		||||
DO $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    IF NOT EXISTS (
 | 
			
		||||
        SELECT 1 FROM pg_indexes 
 | 
			
		||||
        WHERE tablename = 'user_sessions' 
 | 
			
		||||
        AND indexname = 'user_sessions_user_id_idx'
 | 
			
		||||
    ) THEN
 | 
			
		||||
        CREATE INDEX "user_sessions_user_id_idx" ON "user_sessions"("user_id");
 | 
			
		||||
        RAISE NOTICE 'Created user_sessions_user_id_idx index';
 | 
			
		||||
    ELSE
 | 
			
		||||
        RAISE NOTICE 'user_sessions_user_id_idx index already exists, skipping';
 | 
			
		||||
    END IF;
 | 
			
		||||
END $$;
 | 
			
		||||
 | 
			
		||||
-- CreateIndex
 | 
			
		||||
CREATE INDEX "user_sessions_expires_at_idx" ON "user_sessions"("expires_at");
 | 
			
		||||
-- CreateIndex (with existence check)
 | 
			
		||||
DO $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    IF NOT EXISTS (
 | 
			
		||||
        SELECT 1 FROM pg_indexes 
 | 
			
		||||
        WHERE tablename = 'user_sessions' 
 | 
			
		||||
        AND indexname = 'user_sessions_refresh_token_idx'
 | 
			
		||||
    ) THEN
 | 
			
		||||
        CREATE INDEX "user_sessions_refresh_token_idx" ON "user_sessions"("refresh_token");
 | 
			
		||||
        RAISE NOTICE 'Created user_sessions_refresh_token_idx index';
 | 
			
		||||
    ELSE
 | 
			
		||||
        RAISE NOTICE 'user_sessions_refresh_token_idx index already exists, skipping';
 | 
			
		||||
    END IF;
 | 
			
		||||
END $$;
 | 
			
		||||
 | 
			
		||||
-- AddForeignKey
 | 
			
		||||
ALTER TABLE "user_sessions" ADD CONSTRAINT "user_sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
 | 
			
		||||
-- CreateIndex (with existence check)
 | 
			
		||||
DO $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    IF NOT EXISTS (
 | 
			
		||||
        SELECT 1 FROM pg_indexes 
 | 
			
		||||
        WHERE tablename = 'user_sessions' 
 | 
			
		||||
        AND indexname = 'user_sessions_expires_at_idx'
 | 
			
		||||
    ) THEN
 | 
			
		||||
        CREATE INDEX "user_sessions_expires_at_idx" ON "user_sessions"("expires_at");
 | 
			
		||||
        RAISE NOTICE 'Created user_sessions_expires_at_idx index';
 | 
			
		||||
    ELSE
 | 
			
		||||
        RAISE NOTICE 'user_sessions_expires_at_idx index already exists, skipping';
 | 
			
		||||
    END IF;
 | 
			
		||||
END $$;
 | 
			
		||||
 | 
			
		||||
-- AddForeignKey (with existence check)
 | 
			
		||||
DO $$
 | 
			
		||||
BEGIN
 | 
			
		||||
    IF NOT EXISTS (
 | 
			
		||||
        SELECT 1 FROM information_schema.table_constraints 
 | 
			
		||||
        WHERE table_name = 'user_sessions' 
 | 
			
		||||
        AND constraint_name = 'user_sessions_user_id_fkey'
 | 
			
		||||
    ) THEN
 | 
			
		||||
        ALTER TABLE "user_sessions" ADD CONSTRAINT "user_sessions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
 | 
			
		||||
        RAISE NOTICE 'Created user_sessions_user_id_fkey foreign key';
 | 
			
		||||
    ELSE
 | 
			
		||||
        RAISE NOTICE 'user_sessions_user_id_fkey foreign key already exists, skipping';
 | 
			
		||||
    END IF;
 | 
			
		||||
END $$;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user