From 39d48d8bdf8869625ff26a9e0910d02fa0d3dbc2 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Mon, 1 Sep 2025 20:39:58 -0600 Subject: [PATCH] refactor: update API and dashboard components to replace projectId with environmentId for improved context handling and authorization checks --- .../dashboard/project/ai/template-generator.tsx | 8 ++++---- apps/dokploy/server/api/routers/ai.ts | 9 ++++++--- apps/dokploy/server/api/routers/deployment.ts | 4 ++-- apps/dokploy/server/api/routers/security.ts | 8 ++++---- packages/server/src/db/schema/ai.ts | 2 +- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/apps/dokploy/components/dashboard/project/ai/template-generator.tsx b/apps/dokploy/components/dashboard/project/ai/template-generator.tsx index bca27e2d0..7b48e951c 100644 --- a/apps/dokploy/components/dashboard/project/ai/template-generator.tsx +++ b/apps/dokploy/components/dashboard/project/ai/template-generator.tsx @@ -103,8 +103,6 @@ export const TemplateGenerator = ({ environmentId }: Props) => { useState(defaultTemplateInfo); const utils = api.useUtils(); - // Get environment data to extract projectId - const { data: environment } = api.environment.one.useQuery({ environmentId }); const haveAtleasOneProviderEnabled = aiSettings?.some( (ai) => ai.isEnabled === true, @@ -124,7 +122,7 @@ export const TemplateGenerator = ({ environmentId }: Props) => { const onSubmit = async () => { await mutateAsync({ - projectId: environment?.projectId || "", + environmentId: environmentId, id: templateInfo.details?.id || "", name: templateInfo?.details?.name || "", description: templateInfo?.details?.shortDescription || "", @@ -142,7 +140,9 @@ export const TemplateGenerator = ({ environmentId }: Props) => { toast.success("Compose Created"); setOpen(false); // Invalidate the project query to refresh the environment data - await utils.project.one.invalidate(); + await utils.environment.one.invalidate({ + environmentId, + }); }) .catch(() => { toast.error("Error creating the compose"); diff --git a/apps/dokploy/server/api/routers/ai.ts b/apps/dokploy/server/api/routers/ai.ts index 51b9ba95c..28265d90a 100644 --- a/apps/dokploy/server/api/routers/ai.ts +++ b/apps/dokploy/server/api/routers/ai.ts @@ -4,7 +4,7 @@ import { apiUpdateAi, deploySuggestionSchema, } from "@dokploy/server/db/schema/ai"; -import { createDomain, createMount } from "@dokploy/server/index"; +import { createDomain, createMount, findEnvironmentById } from "@dokploy/server/index"; import { deleteAiSettings, getAiSettingById, @@ -177,10 +177,12 @@ export const aiRouter = createTRPCRouter({ deploy: protectedProcedure .input(deploySuggestionSchema) .mutation(async ({ ctx, input }) => { + const environment = await findEnvironmentById(input.environmentId); + const project = await findProjectById(environment.projectId); if (ctx.user.role === "member") { await checkServiceAccess( ctx.session.activeOrganizationId, - input.projectId, + environment.projectId, "create", ); } @@ -192,7 +194,7 @@ export const aiRouter = createTRPCRouter({ }); } - const project = await findProjectById(input.projectId); + const projectName = slugify(`${project.name} ${input.id}`); @@ -205,6 +207,7 @@ export const aiRouter = createTRPCRouter({ sourceType: "raw", appName: `${projectName}-${generatePassword(6)}`, isolatedDeployment: true, + environmentId: input.environmentId, }); if (input.domains && input.domains?.length > 0) { diff --git a/apps/dokploy/server/api/routers/deployment.ts b/apps/dokploy/server/api/routers/deployment.ts index 40a0834ff..4807ac9ef 100644 --- a/apps/dokploy/server/api/routers/deployment.ts +++ b/apps/dokploy/server/api/routers/deployment.ts @@ -29,7 +29,7 @@ export const deploymentRouter = createTRPCRouter({ .query(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); if ( - application.project.organizationId !== ctx.session.activeOrganizationId + application.environment.project.organizationId !== ctx.session.activeOrganizationId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -43,7 +43,7 @@ export const deploymentRouter = createTRPCRouter({ .input(apiFindAllByCompose) .query(async ({ input, ctx }) => { const compose = await findComposeById(input.composeId); - if (compose.project.organizationId !== ctx.session.activeOrganizationId) { + if (compose.environment.project.organizationId !== ctx.session.activeOrganizationId) { throw new TRPCError({ code: "UNAUTHORIZED", message: "You are not authorized to access this compose", diff --git a/apps/dokploy/server/api/routers/security.ts b/apps/dokploy/server/api/routers/security.ts index d973ecc8d..edbcc9d05 100644 --- a/apps/dokploy/server/api/routers/security.ts +++ b/apps/dokploy/server/api/routers/security.ts @@ -19,7 +19,7 @@ export const securityRouter = createTRPCRouter({ .mutation(async ({ input, ctx }) => { const application = await findApplicationById(input.applicationId); if ( - application.project.organizationId !== ctx.session.activeOrganizationId + application.environment.project.organizationId !== ctx.session.activeOrganizationId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -34,7 +34,7 @@ export const securityRouter = createTRPCRouter({ const security = await findSecurityById(input.securityId); const application = await findApplicationById(security.applicationId); if ( - application.project.organizationId !== ctx.session.activeOrganizationId + application.environment.project.organizationId !== ctx.session.activeOrganizationId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -49,7 +49,7 @@ export const securityRouter = createTRPCRouter({ const security = await findSecurityById(input.securityId); const application = await findApplicationById(security.applicationId); if ( - application.project.organizationId !== ctx.session.activeOrganizationId + application.environment.project.organizationId !== ctx.session.activeOrganizationId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -64,7 +64,7 @@ export const securityRouter = createTRPCRouter({ const security = await findSecurityById(input.securityId); const application = await findApplicationById(security.applicationId); if ( - application.project.organizationId !== ctx.session.activeOrganizationId + application.environment.project.organizationId !== ctx.session.activeOrganizationId ) { throw new TRPCError({ code: "UNAUTHORIZED", diff --git a/packages/server/src/db/schema/ai.ts b/packages/server/src/db/schema/ai.ts index 0ee5af4bd..558f2648e 100644 --- a/packages/server/src/db/schema/ai.ts +++ b/packages/server/src/db/schema/ai.ts @@ -55,7 +55,7 @@ export const apiUpdateAi = createSchema .omit({ organizationId: true }); export const deploySuggestionSchema = z.object({ - projectId: z.string().min(1), + environmentId: z.string().min(1), id: z.string().min(1), dockerCompose: z.string().min(1), envVariables: z.string(),