summaryrefslogtreecommitdiffhomepage
path: root/packages/console/core/src/account.ts
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-09-18 10:59:01 -0400
committerFrank <[email protected]>2025-09-18 10:59:01 -0400
commit4ceabdffa07b1af8d99eb73622a4d549d99ec6d2 (patch)
tree72e2ae62084a9e24cc76caffbd1f30dafc69ea56 /packages/console/core/src/account.ts
parentc87480cf931a6f8f8b55552558ef521f1918b578 (diff)
downloadopencode-4ceabdffa07b1af8d99eb73622a4d549d99ec6d2.tar.gz
opencode-4ceabdffa07b1af8d99eb73622a4d549d99ec6d2.zip
wip: zen
Diffstat (limited to 'packages/console/core/src/account.ts')
-rw-r--r--packages/console/core/src/account.ts67
1 files changed, 67 insertions, 0 deletions
diff --git a/packages/console/core/src/account.ts b/packages/console/core/src/account.ts
new file mode 100644
index 000000000..cb123e048
--- /dev/null
+++ b/packages/console/core/src/account.ts
@@ -0,0 +1,67 @@
+import { z } from "zod"
+import { and, eq, getTableColumns, isNull } from "drizzle-orm"
+import { fn } from "./util/fn"
+import { Database } from "./drizzle"
+import { Identifier } from "./identifier"
+import { AccountTable } from "./schema/account.sql"
+import { Actor } from "./actor"
+import { WorkspaceTable } from "./schema/workspace.sql"
+import { UserTable } from "./schema/user.sql"
+
+export namespace Account {
+ export const create = fn(
+ z.object({
+ email: z.string().email(),
+ id: z.string().optional(),
+ }),
+ async (input) =>
+ Database.transaction(async (tx) => {
+ const id = input.id ?? Identifier.create("account")
+ await tx.insert(AccountTable).values({
+ id,
+ email: input.email,
+ })
+ return id
+ }),
+ )
+
+ export const fromID = fn(z.string(), async (id) =>
+ Database.transaction(async (tx) => {
+ return tx
+ .select()
+ .from(AccountTable)
+ .where(eq(AccountTable.id, id))
+ .execute()
+ .then((rows) => rows[0])
+ }),
+ )
+
+ export const fromEmail = fn(z.string().email(), async (email) =>
+ Database.transaction(async (tx) => {
+ return tx
+ .select()
+ .from(AccountTable)
+ .where(eq(AccountTable.email, email))
+ .execute()
+ .then((rows) => rows[0])
+ }),
+ )
+
+ export const workspaces = async () => {
+ const actor = Actor.assert("account")
+ return Database.transaction(async (tx) =>
+ tx
+ .select(getTableColumns(WorkspaceTable))
+ .from(WorkspaceTable)
+ .innerJoin(UserTable, eq(UserTable.workspaceID, WorkspaceTable.id))
+ .where(
+ and(
+ eq(UserTable.email, actor.properties.email),
+ isNull(UserTable.timeDeleted),
+ isNull(WorkspaceTable.timeDeleted),
+ ),
+ )
+ .execute(),
+ )
+ }
+}