mirror of
https://github.com/aljazceru/opencode.git
synced 2025-12-21 09:44:21 +01:00
77 lines
2.0 KiB
TypeScript
77 lines
2.0 KiB
TypeScript
import { z } from "zod"
|
|
import { fn } from "./util/fn"
|
|
import { Actor } from "./actor"
|
|
import { Database } from "./drizzle"
|
|
import { Identifier } from "./identifier"
|
|
import { UserTable } from "./schema/user.sql"
|
|
import { BillingTable } from "./schema/billing.sql"
|
|
import { WorkspaceTable } from "./schema/workspace.sql"
|
|
import { Key } from "./key"
|
|
import { eq, sql } from "drizzle-orm"
|
|
|
|
export namespace Workspace {
|
|
export const create = fn(
|
|
z.object({
|
|
name: z.string().min(1),
|
|
}),
|
|
async ({ name }) => {
|
|
const account = Actor.assert("account")
|
|
const workspaceID = Identifier.create("workspace")
|
|
const userID = Identifier.create("user")
|
|
await Database.transaction(async (tx) => {
|
|
await tx.insert(WorkspaceTable).values({
|
|
id: workspaceID,
|
|
name,
|
|
})
|
|
await tx.insert(UserTable).values({
|
|
workspaceID,
|
|
id: userID,
|
|
accountID: account.properties.accountID,
|
|
name: "",
|
|
role: "admin",
|
|
})
|
|
await tx.insert(BillingTable).values({
|
|
workspaceID,
|
|
id: Identifier.create("billing"),
|
|
balance: 0,
|
|
})
|
|
})
|
|
await Actor.provide(
|
|
"system",
|
|
{
|
|
workspaceID,
|
|
},
|
|
() => Key.create({ userID, name: "Default API Key" }),
|
|
)
|
|
return workspaceID
|
|
},
|
|
)
|
|
|
|
export const update = fn(
|
|
z.object({
|
|
name: z.string().min(1).max(255),
|
|
}),
|
|
async ({ name }) => {
|
|
Actor.assertAdmin()
|
|
const workspaceID = Actor.workspace()
|
|
return await Database.use((tx) =>
|
|
tx
|
|
.update(WorkspaceTable)
|
|
.set({
|
|
name,
|
|
})
|
|
.where(eq(WorkspaceTable.id, workspaceID)),
|
|
)
|
|
},
|
|
)
|
|
|
|
export const remove = fn(z.void(), async () => {
|
|
await Database.use((tx) =>
|
|
tx
|
|
.update(WorkspaceTable)
|
|
.set({ timeDeleted: sql`now()` })
|
|
.where(eq(WorkspaceTable.id, Actor.workspace())),
|
|
)
|
|
})
|
|
}
|