From 3625d702e30b0da8f93d3135f7e8d18401d221eb Mon Sep 17 00:00:00 2001 From: Henry <30578846+hjball@users.noreply.github.com> Date: Wed, 4 Jun 2025 07:34:19 +0100 Subject: [PATCH] fix: bypass custom URL checkout for self hosted (#16) * fix: bypass custom URL checkout for self hosted * Update error code --- apps/web/public/__ENV.js | 9 +-------- .../settings/components/UpdateWorkspaceUrlForm.tsx | 11 +++++++++-- packages/api/src/routers/workspace.ts | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/apps/web/public/__ENV.js b/apps/web/public/__ENV.js index ac7eca8e..8bd6b347 100644 --- a/apps/web/public/__ENV.js +++ b/apps/web/public/__ENV.js @@ -1,8 +1 @@ -window.__ENV = { - NEXT_PUBLIC_UMAMI_ID: "aaed1f55-25e2-4223-b918-e429c390be35", - NEXT_PUBLIC_KAN_ENV: "cloud", - NEXT_PUBLIC_BASE_URL: "http://localhost:3000", - NEXT_PUBLIC_AVATAR_BUCKET_NAME: "avatars", - NEXT_PUBLIC_STORAGE_DOMAIN: "storage.kanbn.com", - NEXT_PUBLIC_STORAGE_URL: "https://storage.kanbn.com", -}; +window.__ENV = {"NEXT_PUBLIC_UMAMI_ID":"aaed1f55-25e2-4223-b918-e429c390be35","NEXT_PUBLIC_KAN_ENV":"cloud","NEXT_PUBLIC_BASE_URL":"http://localhost:3000","NEXT_PUBLIC_AVATAR_BUCKET_NAME":"avatars","NEXT_PUBLIC_STORAGE_DOMAIN":"storage.kanbn.com","NEXT_PUBLIC_STORAGE_URL":"https://storage.kanbn.com"}; \ No newline at end of file diff --git a/apps/web/src/views/settings/components/UpdateWorkspaceUrlForm.tsx b/apps/web/src/views/settings/components/UpdateWorkspaceUrlForm.tsx index 309cd2c3..6b35ef4a 100644 --- a/apps/web/src/views/settings/components/UpdateWorkspaceUrlForm.tsx +++ b/apps/web/src/views/settings/components/UpdateWorkspaceUrlForm.tsx @@ -1,4 +1,5 @@ import { zodResolver } from "@hookform/resolvers/zod"; +import { env } from "next-runtime-env"; import { useForm } from "react-hook-form"; import { HiCheck, HiMiniStar } from "react-icons/hi2"; import { z } from "zod"; @@ -92,7 +93,9 @@ const UpdateWorkspaceUrlForm = ({ const isWorkspaceSlugAvailable = checkWorkspaceSlugAvailability.data; const onSubmit = (data: FormValues) => { - if (isWorkspaceSlugAvailable?.isAvailable && workspacePlan !== "pro") + if (!isWorkspaceSlugAvailable?.isAvailable) return; + + if (workspacePlan !== "pro" && env("NEXT_PUBLIC_KAN_ENV") === "cloud") return openModal("UPDATE_WORKSPACE_URL", data.slug); updateWorkspaceSlug.mutate({ @@ -118,7 +121,11 @@ const UpdateWorkspaceUrlForm = ({ ? "This workspace username has already been taken" : undefined) } - prefix="kan.bn/" + prefix={ + env("NEXT_PUBLIC_KAN_ENV") === "cloud" + ? "kan.bn/" + : `${env("NEXT_PUBLIC_BASE_URL")}/` + } iconRight={ isWorkspaceSlugAvailable?.isAvailable || (workspacePlan === "pro" && slug === workspaceUrl) ? ( diff --git a/packages/api/src/routers/workspace.ts b/packages/api/src/routers/workspace.ts index 514cee69..a9cd9a9f 100644 --- a/packages/api/src/routers/workspace.ts +++ b/packages/api/src/routers/workspace.ts @@ -1,4 +1,5 @@ import { TRPCError } from "@trpc/server"; +import { env } from "next-runtime-env"; import { z } from "zod"; import * as workspaceRepo from "@kan/db/repository/workspace.repo"; @@ -224,10 +225,19 @@ export const workspaceRouter = createTRPCRouter({ const isWorkspaceSlugAvailable = await workspaceRepo.isWorkspaceSlugAvailable(ctx.db, input.slug); + if ( + env("NEXT_PUBLIC_KAN_ENV") === "cloud" && + workspace.plan !== "pro" && + input.slug !== workspace.publicId + ) { + throw new TRPCError({ + message: `Workspace slug cannot be changed in cloud without upgrading to a paid plan`, + code: "FORBIDDEN", + }); + } + if ( reservedOrPremiumWorkspaceSlug?.type === "reserved" || - (workspace.plan !== "pro" && - reservedOrPremiumWorkspaceSlug?.type === "premium") || !isWorkspaceSlugAvailable ) { throw new TRPCError({