echos-ocr/src/app/api/org/create-personal/route.ts
Randall Stillwell ab873f7f08 Add multi-workspace support with org switcher and open registration
- Open registration to all users (remove invite-only gate)
- Add domain auto-join: new users matching org allowedDomains get auto-added
- Track active workspace via activeOrgId on User model
- Refactor JWT callback to resolve active org from all memberships
- Add org switch, list, and create-personal API endpoints
- Add workspace-setup page for users without an org
- Build OrgSwitcher dropdown in sidebar header
- Add allowed email domains management to org settings

Made-with: Cursor
2026-04-16 18:08:08 -05:00

53 lines
1.3 KiB
TypeScript

import { NextResponse } from "next/server";
import { auth } from "@/auth";
import { prisma } from "@/lib/db";
function slugify(name: string): string {
return name
.toLowerCase()
.replace(/[^a-z0-9]+/g, "-")
.replace(/(^-|-$)/g, "")
.slice(0, 48);
}
export async function POST() {
const session = await auth();
if (!session?.user?.id) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const user = await prisma.user.findUnique({
where: { id: session.user.id },
select: { displayName: true, email: true },
});
const displayName = user?.displayName || user?.email?.split("@")[0] || "User";
const orgName = `${displayName}'s Workspace`;
const baseSlug = slugify(orgName);
const slug = `${baseSlug}-${session.user.id.slice(0, 6)}`;
const org = await prisma.organization.create({
data: {
name: orgName,
slug,
type: "personal",
onboardingComplete: true,
onboardingStep: 99,
},
});
await prisma.orgMember.create({
data: {
userId: session.user.id,
organizationId: org.id,
role: "owner",
},
});
await prisma.user.update({
where: { id: session.user.id },
data: { activeOrgId: org.id },
});
return NextResponse.json({ success: true, orgId: org.id });
}