summaryrefslogtreecommitdiffhomepage
path: root/packages/cloud/core/src/account.ts
diff options
context:
space:
mode:
authorFrank <[email protected]>2025-09-18 01:32:40 -0400
committerFrank <[email protected]>2025-09-18 01:32:40 -0400
commitfc4f281408c56ab12db571a470456212a479edf5 (patch)
tree309d23b0c497bc61af6f8e650a6036fa41d7cbdb /packages/cloud/core/src/account.ts
parentf8c4f713a5b48892899d0ac195c3470ab7ef764c (diff)
downloadopencode-fc4f281408c56ab12db571a470456212a479edf5.tar.gz
opencode-fc4f281408c56ab12db571a470456212a479edf5.zip
wip: zen
Diffstat (limited to 'packages/cloud/core/src/account.ts')
-rw-r--r--packages/cloud/core/src/account.ts67
1 files changed, 67 insertions, 0 deletions
diff --git a/packages/cloud/core/src/account.ts b/packages/cloud/core/src/account.ts
new file mode 100644
index 000000000..cb123e048
--- /dev/null
+++ b/packages/cloud/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(),
+ )
+ }
+}