diff --git a/apps/dokploy/server/api/routers/server.ts b/apps/dokploy/server/api/routers/server.ts index a872679c3..6eb10b107 100644 --- a/apps/dokploy/server/api/routers/server.ts +++ b/apps/dokploy/server/api/routers/server.ts @@ -19,7 +19,10 @@ import { updateServerById, } from "@dokploy/server"; import { db } from "@dokploy/server/db"; -import { findMemberByUserId } from "@dokploy/server/services/permission"; +import { + findMemberByUserId, + hasPermission, +} from "@dokploy/server/services/permission"; import { hasValidLicense } from "@dokploy/server/services/proprietary/license-key"; import { TRPCError } from "@trpc/server"; import { observable } from "@trpc/server/observable"; @@ -51,6 +54,22 @@ import { } from "@/server/db/schema"; import { applyDockerCleanupSchedule } from "@/server/utils/docker-cleanup"; +// Users without server.read only get what the server pickers render +const toServerOptions = async ( + ctx: Parameters[0], + servers: (typeof server.$inferSelect)[], +) => { + await findMemberByUserId(ctx.user.id, ctx.session.activeOrganizationId); + if (await hasPermission(ctx, { server: ["read"] })) { + return servers; + } + return servers.map(({ serverId, name, ipAddress }) => ({ + serverId, + name, + ipAddress, + })); +}; + export const serverRouter = createTRPCRouter({ create: withPermission("server", "create") .input(apiCreateServer) @@ -216,7 +235,7 @@ export const serverRouter = createTRPCRouter({ return servers.length ?? 0; }), - withSSHKey: withPermission("server", "read").query(async ({ ctx }) => { + withSSHKey: protectedProcedure.query(async ({ ctx }) => { const accessibleIds = await getAccessibleServerIds(ctx.session); const result = await db.query.server.findMany({ @@ -234,9 +253,12 @@ export const serverRouter = createTRPCRouter({ eq(server.serverType, "deploy"), ), }); - return result.filter((s) => accessibleIds.has(s.serverId)); + return toServerOptions( + ctx, + result.filter((s) => accessibleIds.has(s.serverId)), + ); }), - buildServers: withPermission("server", "read").query(async ({ ctx }) => { + buildServers: protectedProcedure.query(async ({ ctx }) => { const accessibleIds = await getAccessibleServerIds(ctx.session); const result = await db.query.server.findMany({ @@ -254,7 +276,10 @@ export const serverRouter = createTRPCRouter({ eq(server.serverType, "build"), ), }); - return result.filter((s) => accessibleIds.has(s.serverId)); + return toServerOptions( + ctx, + result.filter((s) => accessibleIds.has(s.serverId)), + ); }), setup: withPermission("server", "create") .input(apiFindOneServer)