import "server-only"; import { getDb, organizations, organizationMembers, projects, eq } from "@fetcha/db"; import { newId } from "@fetcha/core"; import { slugify } from "./utils"; /** Every user gets a personal organization + a default project at signup. */ export async function ensureWorkspace(user: { id: string; name?: string | null; email: string }): Promise<{ organizationId: string; projectId: string }> { const db = getDb(); const [membership] = await db.select().from(organizationMembers).where(eq(organizationMembers.userId, user.id)).limit(1); if (membership) { const [p] = await db.select().from(projects).where(eq(projects.organizationId, membership.organizationId)).limit(1); if (p) return { organizationId: membership.organizationId, projectId: p.id }; const projectId = newId("proj"); await db.insert(projects).values({ id: projectId, organizationId: membership.organizationId, name: "Default", slug: "default" }); return { organizationId: membership.organizationId, projectId }; } const organizationId = newId("org"); const base = user.name?.trim() || user.email.split("@")[0] || "workspace"; const slug = `${slugify(base)}-${organizationId.slice(-6)}`; await db.insert(organizations).values({ id: organizationId, name: `${base}'s workspace`, slug, ownerUserId: user.id }); await db.insert(organizationMembers).values({ organizationId, userId: user.id, role: "owner" }); const projectId = newId("proj"); await db.insert(projects).values({ id: projectId, organizationId, name: "Default", slug: "default", description: "Your first project. Rename it or create more from the Projects page." }); return { organizationId, projectId }; }