From 5fdaf644b1cce68c81f7e8eeec01f4d116e34ae2 Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Wed, 2 Sep 2026 21:11:02 +0300 Subject: [PATCH] fix(environment): scope saved state to application --- .../env/application-environment-cache.test.ts | 26 +++++++++++++++++++ .../application/environment/cache.ts | 14 ++++++++++ .../application/environment/show.tsx | 14 ++++++---- 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/apps/dokploy/__test__/env/application-environment-cache.test.ts b/apps/dokploy/__test__/env/application-environment-cache.test.ts index bba73836c..e08d69176 100644 --- a/apps/dokploy/__test__/env/application-environment-cache.test.ts +++ b/apps/dokploy/__test__/env/application-environment-cache.test.ts @@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest"; import { isSavedApplicationEnvironment, mergeSavedApplicationEnvironment, + shouldIgnoreApplicationEnvironment, } from "../../components/dashboard/application/environment/cache"; describe("mergeSavedApplicationEnvironment", () => { @@ -62,3 +63,28 @@ describe("isSavedApplicationEnvironment", () => { ).toBe(false); }); }); + +describe("shouldIgnoreApplicationEnvironment", () => { + it("does not carry saved state from application A into application B", () => { + const savedForApplicationA = { + applicationId: "application-a", + env: "A_VALUE=1", + buildArgs: "", + buildSecrets: "", + createEnvFile: true, + }; + + expect( + shouldIgnoreApplicationEnvironment( + "application-b", + { + env: "B_VALUE=1", + buildArgs: "", + buildSecrets: "", + createEnvFile: true, + }, + savedForApplicationA, + ), + ).toBe(false); + }); +}); diff --git a/apps/dokploy/components/dashboard/application/environment/cache.ts b/apps/dokploy/components/dashboard/application/environment/cache.ts index b26ca6686..1b9f28ac7 100644 --- a/apps/dokploy/components/dashboard/application/environment/cache.ts +++ b/apps/dokploy/components/dashboard/application/environment/cache.ts @@ -5,6 +5,10 @@ export type SavedApplicationEnvironment = { createEnvFile: boolean; }; +export type SavedApplicationEnvironmentState = SavedApplicationEnvironment & { + applicationId: string; +}; + export const mergeSavedApplicationEnvironment = ( application: T | undefined, environment: SavedApplicationEnvironment, @@ -29,3 +33,13 @@ export const isSavedApplicationEnvironment = ( application.buildArgs === environment.buildArgs && application.buildSecrets === environment.buildSecrets && application.createEnvFile === environment.createEnvFile; + +export const shouldIgnoreApplicationEnvironment = ( + applicationId: string, + application: Partial< + Record + >, + savedEnvironment: SavedApplicationEnvironmentState | undefined, +) => + savedEnvironment?.applicationId === applicationId && + !isSavedApplicationEnvironment(application, savedEnvironment); diff --git a/apps/dokploy/components/dashboard/application/environment/show.tsx b/apps/dokploy/components/dashboard/application/environment/show.tsx index 4da7d84b7..fd4009236 100644 --- a/apps/dokploy/components/dashboard/application/environment/show.tsx +++ b/apps/dokploy/components/dashboard/application/environment/show.tsx @@ -20,7 +20,8 @@ import { api } from "@/utils/api"; import { isSavedApplicationEnvironment, mergeSavedApplicationEnvironment, - type SavedApplicationEnvironment, + shouldIgnoreApplicationEnvironment, + type SavedApplicationEnvironmentState, } from "./cache"; const addEnvironmentSchema = z.object({ @@ -40,7 +41,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => { const { data: permissions } = api.user.getPermissions.useQuery(); const canWrite = permissions?.envVars.write ?? false; const utils = api.useUtils(); - const savedEnvironment = useRef(); + const savedEnvironment = useRef(); const { mutateAsync, isPending } = api.application.saveEnvironment.useMutation(); @@ -93,8 +94,11 @@ export const ShowEnvironment = ({ applicationId }: Props) => { }; if ( - savedEnvironment.current && - !isSavedApplicationEnvironment(data, savedEnvironment.current) + shouldIgnoreApplicationEnvironment( + applicationId, + data, + savedEnvironment.current, + ) ) { return; } @@ -122,7 +126,7 @@ export const ShowEnvironment = ({ applicationId }: Props) => { ...nextEnvironment, applicationId, }); - savedEnvironment.current = nextEnvironment; + savedEnvironment.current = { ...nextEnvironment, applicationId }; utils.application.one.setData({ applicationId }, (application) => mergeSavedApplicationEnvironment(application, nextEnvironment), );