diff --git a/packages/api/src/routers/workspace.ts b/packages/api/src/routers/workspace.ts index a9cd9a9f..e8dda1ee 100644 --- a/packages/api/src/routers/workspace.ts +++ b/packages/api/src/routers/workspace.ts @@ -334,6 +334,14 @@ export const workspaceRouter = createTRPCRouter({ }), ) .query(async ({ ctx, input }) => { + const userId = ctx.user?.id; + + if (!userId) + throw new TRPCError({ + message: `User not authenticated`, + code: "UNAUTHORIZED", + }); + const slug = input.workspaceSlug.toLowerCase(); // check slug is not reserved const workspaceSlug = await workspaceSlugRepo.getWorkspaceSlug( @@ -345,6 +353,19 @@ export const workspaceRouter = createTRPCRouter({ const isWorkspaceSlugAvailable = await workspaceRepo.isWorkspaceSlugAvailable(ctx.db, slug); + const isAvailable = + isWorkspaceSlugAvailable && workspaceSlug?.type !== "reserved"; + const isReserved = workspaceSlug?.type === "reserved"; + + if (env("NEXT_PUBLIC_KAN_ENV") === "cloud") { + await workspaceSlugRepo.createWorkspaceSlugCheck(ctx.db, { + slug, + userId, + available: isAvailable, + reserved: isReserved, + }); + } + return { isAvailable: isWorkspaceSlugAvailable && workspaceSlug?.type !== "reserved", diff --git a/packages/db/migrations/20250910200416_AddWorkspaceSlugChecks.sql b/packages/db/migrations/20250910200416_AddWorkspaceSlugChecks.sql new file mode 100644 index 00000000..6178af32 --- /dev/null +++ b/packages/db/migrations/20250910200416_AddWorkspaceSlugChecks.sql @@ -0,0 +1,22 @@ +CREATE TABLE IF NOT EXISTS "workspace_slug_checks" ( + "id" bigserial PRIMARY KEY NOT NULL, + "slug" varchar(255) NOT NULL, + "available" boolean NOT NULL, + "reserved" boolean NOT NULL, + "workspaceId" bigint, + "createdBy" uuid, + "createdAt" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +ALTER TABLE "workspace_slug_checks" ENABLE ROW LEVEL SECURITY;--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "workspace_slug_checks" ADD CONSTRAINT "workspace_slug_checks_workspaceId_workspace_id_fk" FOREIGN KEY ("workspaceId") REFERENCES "public"."workspace"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "workspace_slug_checks" ADD CONSTRAINT "workspace_slug_checks_createdBy_user_id_fk" FOREIGN KEY ("createdBy") REFERENCES "public"."user"("id") ON DELETE set null ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$;