Openstatus
www.openstatus.dev
1import type { AdapterUser } from "next-auth/adapters";
2import * as randomWordSlugs from "random-word-slugs";
3
4import { db, eq } from "@openstatus/db";
5import { user, usersToWorkspaces, workspace } from "@openstatus/db/src/schema";
6
7export async function createUser(data: AdapterUser) {
8 const newUser = await db
9 .insert(user)
10 .values({
11 email: data.email,
12 photoUrl: data.image,
13 name: data.name,
14 firstName: data.firstName,
15 lastName: data.lastName,
16 })
17 .returning()
18 .get();
19
20 let slug: string | undefined = undefined;
21
22 while (!slug) {
23 slug = randomWordSlugs.generateSlug(2);
24 const slugAlreadyExists = await db
25 .select()
26 .from(workspace)
27 .where(eq(workspace.slug, slug))
28 .get();
29
30 if (slugAlreadyExists) {
31 console.warn(`slug already exists: '${slug} - recreating new one'`);
32 slug = undefined;
33 }
34 }
35
36 const newWorkspace = await db
37 .insert(workspace)
38 .values({ slug, name: "" })
39 .returning({ id: workspace.id })
40 .get();
41
42 await db
43 .insert(usersToWorkspaces)
44 .values({
45 userId: newUser.id,
46 workspaceId: newWorkspace.id,
47 role: "owner",
48 })
49 .returning()
50 .get();
51
52 return newUser;
53}
54
55export async function getUser(id: string) {
56 const _user = await db
57 .select()
58 .from(user)
59 .where(eq(user.id, Number(id)))
60 .get();
61
62 return _user || null;
63}