This commit is contained in:
@@ -3,6 +3,9 @@ import { getTranslations } from "next-intl/server";
|
||||
import { redirect } from "next/navigation";
|
||||
import { OnboardingFlow } from "@/components/onboarding/onboarding-flow";
|
||||
import { BackLink } from "@/components/ui/back-link";
|
||||
import { listTenants } from "@/lib/k8s";
|
||||
import { listActiveTenantRequestsByOrgId } from "@/lib/db";
|
||||
import { personalAccountAtCapacity } from "@/lib/personal-org";
|
||||
|
||||
/**
|
||||
* /dashboard/new — wizard for creating an additional instance for an
|
||||
@@ -21,6 +24,10 @@ import { BackLink } from "@/components/ui/back-link";
|
||||
* may create new instances. The server-side POST handler enforces the
|
||||
* same; this redirect is purely UX so /user-role members don't land on
|
||||
* a wizard that will 403 on submit.
|
||||
*
|
||||
* Bug 5: personal accounts that already hold a tenant or have one
|
||||
* in-flight are sent back to the dashboard with the same UX rationale.
|
||||
* Matching API guard lives in `/api/onboarding`.
|
||||
*/
|
||||
export default async function NewInstancePage() {
|
||||
const user = await getSessionUser();
|
||||
@@ -28,6 +35,25 @@ export default async function NewInstancePage() {
|
||||
if (user.isPlatform) redirect("/dashboard");
|
||||
if (!canMutate(user)) redirect("/dashboard");
|
||||
|
||||
if (user.isPersonal) {
|
||||
const [allTenants, activeRequests] = await Promise.all([
|
||||
listTenants(),
|
||||
listActiveTenantRequestsByOrgId(user.orgId),
|
||||
]);
|
||||
const ownTenants = allTenants.filter(
|
||||
(t) => t.metadata.labels?.["pieced.ch/zitadel-org-id"] === user.orgId
|
||||
);
|
||||
if (
|
||||
personalAccountAtCapacity(
|
||||
user.isPersonal,
|
||||
ownTenants.length,
|
||||
activeRequests.length
|
||||
)
|
||||
) {
|
||||
redirect("/dashboard");
|
||||
}
|
||||
}
|
||||
|
||||
const t = await getTranslations("dashboard");
|
||||
|
||||
return (
|
||||
@@ -43,7 +69,11 @@ export default async function NewInstancePage() {
|
||||
</div>
|
||||
|
||||
<div className="animate-in animate-in-delay-1">
|
||||
<OnboardingFlow orgName={user.orgName} />
|
||||
<OnboardingFlow
|
||||
orgName={user.orgName}
|
||||
userName={user.name}
|
||||
userEmail={user.email}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user