diff --git a/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx b/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx index 4f695ac88e..5aa8f296d8 100644 --- a/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx +++ b/apps/dokploy/components/dashboard/application/environment/show-enviroment.tsx @@ -55,16 +55,16 @@ export const ShowEnvironment = ({ id, type }: Props) => { const [isEnvVisible, setIsEnvVisible] = useState(true); const mutationMap = { - postgres: () => api.postgres.update.useMutation(), - redis: () => api.redis.update.useMutation(), - mysql: () => api.mysql.update.useMutation(), - mariadb: () => api.mariadb.update.useMutation(), - mongo: () => api.mongo.update.useMutation(), - compose: () => api.compose.update.useMutation(), + postgres: () => api.postgres.saveEnvironment.useMutation(), + redis: () => api.redis.saveEnvironment.useMutation(), + mysql: () => api.mysql.saveEnvironment.useMutation(), + mariadb: () => api.mariadb.saveEnvironment.useMutation(), + mongo: () => api.mongo.saveEnvironment.useMutation(), + compose: () => api.compose.saveEnvironment.useMutation(), }; const { mutateAsync, isPending } = mutationMap[type] ? mutationMap[type]() - : api.mongo.update.useMutation(); + : api.mongo.saveEnvironment.useMutation(); const form = useForm({ defaultValues: { @@ -86,15 +86,18 @@ export const ShowEnvironment = ({ id, type }: Props) => { }, [data, form]); const onSubmit = async (formData: EnvironmentSchema) => { - mutateAsync({ - mongoId: id || "", - postgresId: id || "", - redisId: id || "", - mysqlId: id || "", - mariadbId: id || "", - composeId: id || "", - env: formData.environment, - }) + const payloadMap = { + postgres: { postgresId: id, env: formData.environment }, + redis: { redisId: id, env: formData.environment }, + mysql: { mysqlId: id, env: formData.environment }, + mariadb: { mariadbId: id, env: formData.environment }, + mongo: { mongoId: id, env: formData.environment }, + compose: { composeId: id, env: formData.environment }, + } as const; + + (mutateAsync as (input: (typeof payloadMap)[typeof type]) => Promise)( + payloadMap[type], + ) .then(async () => { toast.success("Environments Added"); await refetch(); diff --git a/apps/dokploy/server/api/routers/compose.ts b/apps/dokploy/server/api/routers/compose.ts index 0d3782eab1..659701f999 100644 --- a/apps/dokploy/server/api/routers/compose.ts +++ b/apps/dokploy/server/api/routers/compose.ts @@ -60,6 +60,7 @@ import { apiFindCompose, apiRandomizeCompose, apiRedeployCompose, + apiSaveEnvironmentVariablesCompose, apiUpdateCompose, compose as composeTable, environments, @@ -189,6 +190,30 @@ export const composeRouter = createTRPCRouter({ }); return updated; }), + saveEnvironment: protectedProcedure + .input(apiSaveEnvironmentVariablesCompose) + .mutation(async ({ input, ctx }) => { + await checkServicePermissionAndAccess(ctx, input.composeId, { + envVars: ["write"], + }); + const service = await updateCompose(input.composeId, { + env: input.env, + }); + + if (!service) { + throw new TRPCError({ + code: "BAD_REQUEST", + message: "Error adding environment variables", + }); + } + + await audit(ctx, { + action: "update", + resourceType: "compose", + resourceId: input.composeId, + }); + return true; + }), delete: protectedProcedure .input(apiDeleteCompose) .mutation(async ({ input, ctx }) => { @@ -278,7 +303,7 @@ export const composeRouter = createTRPCRouter({ .input(apiFetchServices) .query(async ({ input, ctx }) => { await checkServicePermissionAndAccess(ctx, input.composeId, { - service: ["create"], + service: ["read"], }); return await loadServices(input.composeId, input.type); }), diff --git a/packages/server/src/db/schema/compose.ts b/packages/server/src/db/schema/compose.ts index 531449bfa9..f4c3f8f12b 100644 --- a/packages/server/src/db/schema/compose.ts +++ b/packages/server/src/db/schema/compose.ts @@ -223,7 +223,14 @@ export const apiUpdateCompose = createSchema composeFile: z.string().optional(), command: z.string().optional(), }) - .omit({ serverId: true }); + .omit({ serverId: true, env: true }); + +export const apiSaveEnvironmentVariablesCompose = createSchema + .pick({ + composeId: true, + env: true, + }) + .required(); export const apiRandomizeCompose = createSchema .pick({ diff --git a/packages/server/src/db/schema/mariadb.ts b/packages/server/src/db/schema/mariadb.ts index 2659c29786..28d4dae281 100644 --- a/packages/server/src/db/schema/mariadb.ts +++ b/packages/server/src/db/schema/mariadb.ts @@ -204,7 +204,7 @@ export const apiUpdateMariaDB = createSchema mariadbId: z.string().min(1), dockerImage: z.string().optional(), }) - .omit({ serverId: true }); + .omit({ serverId: true, env: true }); export const apiRebuildMariadb = createSchema .pick({ diff --git a/packages/server/src/db/schema/mongo.ts b/packages/server/src/db/schema/mongo.ts index 4599cedb2c..4406db6cb5 100644 --- a/packages/server/src/db/schema/mongo.ts +++ b/packages/server/src/db/schema/mongo.ts @@ -193,7 +193,7 @@ export const apiUpdateMongo = createSchema mongoId: z.string().min(1), dockerImage: z.string().optional(), }) - .omit({ serverId: true }); + .omit({ serverId: true, env: true }); export const apiResetMongo = createSchema .pick({ diff --git a/packages/server/src/db/schema/mysql.ts b/packages/server/src/db/schema/mysql.ts index 90b38e6fa2..94bb0c1dc5 100644 --- a/packages/server/src/db/schema/mysql.ts +++ b/packages/server/src/db/schema/mysql.ts @@ -201,7 +201,7 @@ export const apiUpdateMySql = createSchema mysqlId: z.string().min(1), dockerImage: z.string().optional(), }) - .omit({ serverId: true }); + .omit({ serverId: true, env: true }); export const apiRebuildMysql = createSchema .pick({ diff --git a/packages/server/src/db/schema/postgres.ts b/packages/server/src/db/schema/postgres.ts index 5cb3015ce9..57f093c0e5 100644 --- a/packages/server/src/db/schema/postgres.ts +++ b/packages/server/src/db/schema/postgres.ts @@ -194,7 +194,7 @@ export const apiUpdatePostgres = createSchema postgresId: z.string().min(1), dockerImage: z.string().optional(), }) - .omit({ serverId: true }); + .omit({ serverId: true, env: true }); export const apiRebuildPostgres = createSchema .pick({ diff --git a/packages/server/src/db/schema/redis.ts b/packages/server/src/db/schema/redis.ts index f024378053..e462493e98 100644 --- a/packages/server/src/db/schema/redis.ts +++ b/packages/server/src/db/schema/redis.ts @@ -180,7 +180,7 @@ export const apiUpdateRedis = createSchema redisId: z.string().min(1), dockerImage: z.string().optional(), }) - .omit({ serverId: true }); + .omit({ serverId: true, env: true }); export const apiRebuildRedis = createSchema .pick({