From 5d5e56d1447414f7938d346a2d90345735479e00 Mon Sep 17 00:00:00 2001 From: ayham291 Date: Sun, 1 Jun 2025 20:45:29 +0200 Subject: [PATCH] feat: GitHub and GitLab provider integration with user association - Added userId to the GitHub and GitLab provider setup to associate providers with the user who created them. - Updated redirect URL in GitHub provider to include userId for better tracking. - Modified API handlers and service functions to accommodate userId in provider creation and validation. --- .../git/github/add-github-provider.tsx | 3 +- .../pages/api/providers/github/setup.ts | 4 ++- apps/dokploy/server/api/routers/gitlab.ts | 31 +++++++++++++------ packages/server/src/services/github.ts | 2 ++ packages/server/src/services/gitlab.ts | 2 ++ 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/apps/dokploy/components/dashboard/settings/git/github/add-github-provider.tsx b/apps/dokploy/components/dashboard/settings/git/github/add-github-provider.tsx index 90cefe59..af7d5854 100644 --- a/apps/dokploy/components/dashboard/settings/git/github/add-github-provider.tsx +++ b/apps/dokploy/components/dashboard/settings/git/github/add-github-provider.tsx @@ -18,6 +18,7 @@ import { useEffect, useState } from "react"; export const AddGithubProvider = () => { const [isOpen, setIsOpen] = useState(false); const { data: activeOrganization } = authClient.useActiveOrganization(); + const { data: session } = authClient.useSession(); const { data } = api.user.get.useQuery(); const [manifest, setManifest] = useState(""); const [isOrganization, setIsOrganization] = useState(false); @@ -27,7 +28,7 @@ export const AddGithubProvider = () => { const url = document.location.origin; const manifest = JSON.stringify( { - redirect_url: `${origin}/api/providers/github/setup?organizationId=${activeOrganization?.id}`, + redirect_url: `${origin}/api/providers/github/setup?organizationId=${activeOrganization?.id}&userId=${session?.user?.id}`, name: `Dokploy-${format(new Date(), "yyyy-MM-dd")}`, url: origin, hook_attributes: { diff --git a/apps/dokploy/pages/api/providers/github/setup.ts b/apps/dokploy/pages/api/providers/github/setup.ts index 32712250..574fd813 100644 --- a/apps/dokploy/pages/api/providers/github/setup.ts +++ b/apps/dokploy/pages/api/providers/github/setup.ts @@ -10,13 +10,14 @@ type Query = { state: string; installation_id: string; setup_action: string; + userId: string; }; export default async function handler( req: NextApiRequest, res: NextApiResponse, ) { - const { code, state, installation_id }: Query = req.query as Query; + const { code, state, installation_id, userId }: Query = req.query as Query; if (!code) { return res.status(400).json({ error: "Missing code parameter" }); @@ -44,6 +45,7 @@ export default async function handler( githubPrivateKey: data.pem, }, value as string, + userId, ); } else if (action === "gh_setup") { await db diff --git a/apps/dokploy/server/api/routers/gitlab.ts b/apps/dokploy/server/api/routers/gitlab.ts index daae68a5..4232860b 100644 --- a/apps/dokploy/server/api/routers/gitlab.ts +++ b/apps/dokploy/server/api/routers/gitlab.ts @@ -25,7 +25,11 @@ export const gitlabRouter = createTRPCRouter({ .input(apiCreateGitlab) .mutation(async ({ input, ctx }) => { try { - return await createGitlab(input, ctx.session.activeOrganizationId); + return await createGitlab( + input, + ctx.session.activeOrganizationId, + ctx.session.userId, + ); } catch (error) { throw new TRPCError({ code: "BAD_REQUEST", @@ -40,7 +44,8 @@ export const gitlabRouter = createTRPCRouter({ const gitlabProvider = await findGitlabById(input.gitlabId); if ( gitlabProvider.gitProvider.organizationId !== - ctx.session.activeOrganizationId + ctx.session.activeOrganizationId && + gitlabProvider.gitProvider.userId !== ctx.session.userId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -56,11 +61,13 @@ export const gitlabRouter = createTRPCRouter({ }, }); - result = result.filter( - (provider) => + result = result.filter((provider) => { + return ( provider.gitProvider.organizationId === - ctx.session.activeOrganizationId, - ); + ctx.session.activeOrganizationId && + provider.gitProvider.userId === ctx.session.userId + ); + }); const filtered = result .filter((provider) => haveGitlabRequirements(provider)) .map((provider) => { @@ -80,7 +87,8 @@ export const gitlabRouter = createTRPCRouter({ const gitlabProvider = await findGitlabById(input.gitlabId); if ( gitlabProvider.gitProvider.organizationId !== - ctx.session.activeOrganizationId + ctx.session.activeOrganizationId && + gitlabProvider.gitProvider.userId !== ctx.session.userId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -96,7 +104,8 @@ export const gitlabRouter = createTRPCRouter({ const gitlabProvider = await findGitlabById(input.gitlabId || ""); if ( gitlabProvider.gitProvider.organizationId !== - ctx.session.activeOrganizationId + ctx.session.activeOrganizationId && + gitlabProvider.gitProvider.userId !== ctx.session.userId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -112,7 +121,8 @@ export const gitlabRouter = createTRPCRouter({ const gitlabProvider = await findGitlabById(input.gitlabId || ""); if ( gitlabProvider.gitProvider.organizationId !== - ctx.session.activeOrganizationId + ctx.session.activeOrganizationId && + gitlabProvider.gitProvider.userId !== ctx.session.userId ) { throw new TRPCError({ code: "UNAUTHORIZED", @@ -135,7 +145,8 @@ export const gitlabRouter = createTRPCRouter({ const gitlabProvider = await findGitlabById(input.gitlabId); if ( gitlabProvider.gitProvider.organizationId !== - ctx.session.activeOrganizationId + ctx.session.activeOrganizationId && + gitlabProvider.gitProvider.userId !== ctx.session.userId ) { throw new TRPCError({ code: "UNAUTHORIZED", diff --git a/packages/server/src/services/github.ts b/packages/server/src/services/github.ts index 19deb2b2..6485d8fb 100644 --- a/packages/server/src/services/github.ts +++ b/packages/server/src/services/github.ts @@ -13,6 +13,7 @@ export type Github = typeof github.$inferSelect; export const createGithub = async ( input: typeof apiCreateGithub._type, organizationId: string, + userId: string, ) => { return await db.transaction(async (tx) => { const newGitProvider = await tx @@ -21,6 +22,7 @@ export const createGithub = async ( providerType: "github", organizationId: organizationId, name: input.name, + userId: userId, }) .returning() .then((response) => response[0]); diff --git a/packages/server/src/services/gitlab.ts b/packages/server/src/services/gitlab.ts index fdca2775..8f1e1be5 100644 --- a/packages/server/src/services/gitlab.ts +++ b/packages/server/src/services/gitlab.ts @@ -12,6 +12,7 @@ export type Gitlab = typeof gitlab.$inferSelect; export const createGitlab = async ( input: typeof apiCreateGitlab._type, organizationId: string, + userId: string, ) => { return await db.transaction(async (tx) => { const newGitProvider = await tx @@ -20,6 +21,7 @@ export const createGitlab = async ( providerType: "gitlab", organizationId: organizationId, name: input.name, + userId: userId, }) .returning() .then((response) => response[0]);