From a775e42e85bbecde7b188ec0c407a0c2115800f3 Mon Sep 17 00:00:00 2001 From: Rajiv Sahal Date: Sat, 14 Sep 2024 04:07:48 +0530 Subject: [PATCH] fix: prevent creating multiple platform orgs (#16629) * set error messages to know whats wrong * trying to find if org with same owner already exists * ensure a user cannot create more than one platform team --------- Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com> --- .../ee/platform/components/CreateANewPlatformForm.tsx | 2 ++ .../routers/viewer/organizations/create.handler.ts | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/packages/features/ee/platform/components/CreateANewPlatformForm.tsx b/packages/features/ee/platform/components/CreateANewPlatformForm.tsx index 9567878eaa..d79a20c661 100644 --- a/packages/features/ee/platform/components/CreateANewPlatformForm.tsx +++ b/packages/features/ee/platform/components/CreateANewPlatformForm.tsx @@ -65,11 +65,13 @@ const CreateANewPlatformFormChild = ({ session }: { session: Ensure { if (err.message === "organization_url_taken") { newOrganizationFormMethods.setError("slug", { type: "custom", message: t("url_taken") }); + setServerErrorMessage(err.message); } else if (err.message === "domain_taken_team" || err.message === "domain_taken_project") { newOrganizationFormMethods.setError("slug", { type: "custom", message: t("problem_registering_domain"), }); + setServerErrorMessage(err.message); } else { setServerErrorMessage(err.message); } diff --git a/packages/trpc/server/routers/viewer/organizations/create.handler.ts b/packages/trpc/server/routers/viewer/organizations/create.handler.ts index a8ac94d78c..ad632d16d9 100644 --- a/packages/trpc/server/routers/viewer/organizations/create.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/create.handler.ts @@ -104,6 +104,8 @@ export const createHandler = async ({ input, ctx }: CreateOptions) => { team: { select: { slug: true, + isOrganization: true, + isPlatform: true, }, }, }, @@ -160,6 +162,14 @@ export const createHandler = async ({ input, ctx }: CreateOptions) => { if (hasAnOrgWithSameSlug || RESERVED_SUBDOMAINS.includes(slug)) throw new TRPCError({ code: "BAD_REQUEST", message: "organization_url_taken" }); + const hasExistingPlatformOrOrgTeam = loggedInUser?.teams.find((team) => { + return team.team.isPlatform || team.team.isOrganization; + }); + + if (!!hasExistingPlatformOrOrgTeam?.team && isPlatform) { + throw new TRPCError({ code: "BAD_REQUEST", message: "User is already part of a team" }); + } + const availability = getAvailabilityFromSchedule(DEFAULT_SCHEDULE); const isOrganizationConfigured = isPlatform ? true : await createDomain(slug);