From 833c69a73e146ca9a8c7a00b88625481973dcfa0 Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 29 May 2026 22:58:09 +0100 Subject: [PATCH] cloud: enable workspace slots for partners --- apps/web/src/components/WorkspaceMenu.tsx | 23 +- apps/web/src/pages/api/partner/_utils.ts | 7 +- apps/web/src/pages/api/partner/callback.ts | 54 +- apps/web/src/pages/api/partner/link.ts | 64 +- apps/web/src/pages/api/partner/webhook.ts | 214 +- .../onboarding/workspace-details/index.tsx | 4 +- packages/api/src/routers/workspace.ts | 88 +- ..._DropPartnerLicenseKeyUniqueConstraint.sql | 1 + .../meta/20260529123231_snapshot.json | 3939 +++++++++++++++++ packages/db/migrations/meta/_journal.json | 7 + .../db/src/repository/subscription.repo.ts | 87 +- packages/db/src/schema/subscriptions.ts | 53 +- 12 files changed, 4345 insertions(+), 196 deletions(-) create mode 100644 packages/db/migrations/20260529123231_DropPartnerLicenseKeyUniqueConstraint.sql create mode 100644 packages/db/migrations/meta/20260529123231_snapshot.json diff --git a/apps/web/src/components/WorkspaceMenu.tsx b/apps/web/src/components/WorkspaceMenu.tsx index 7d8f2ef5..e8c54d27 100644 --- a/apps/web/src/components/WorkspaceMenu.tsx +++ b/apps/web/src/components/WorkspaceMenu.tsx @@ -1,6 +1,6 @@ +import { useRouter } from "next/navigation"; import { Button, Menu, Transition } from "@headlessui/react"; import { t } from "@lingui/core/macro"; -import { useRouter } from "next/navigation"; import { env } from "next-runtime-env"; import { Fragment, useState } from "react"; import { HiCheck, HiMagnifyingGlass } from "react-icons/hi2"; @@ -9,6 +9,7 @@ import { twMerge } from "tailwind-merge"; import { useKeyboardShortcut } from "~/providers/keyboard-shortcuts"; import { useModal } from "~/providers/modal"; import { useWorkspace } from "~/providers/workspace"; +import { api } from "~/utils/api"; import CommandPallette from "./CommandPallette"; import { Tooltip } from "./Tooltip"; @@ -20,6 +21,8 @@ export default function WorkspaceMenu({ const { workspace, isLoading, availableWorkspaces, switchWorkspace } = useWorkspace(); const { openModal } = useModal(); + const { data: hasPartnerSlot } = + api.workspace.hasAvailablePartnerSlot.useQuery(); const router = useRouter(); const [isOpen, setIsOpen] = useState(false); @@ -150,11 +153,19 @@ export default function WorkspaceMenu({