opencode/packages/console/core/src/key.ts

62 lines
1.8 KiB
TypeScript
Raw Normal View History

2025-08-29 04:44:55 +08:00
import { z } from "zod"
import { fn } from "./util/fn"
import { Actor } from "./actor"
2025-09-12 05:21:49 +08:00
import { and, Database, eq, isNull, sql } from "./drizzle"
2025-08-29 04:44:55 +08:00
import { Identifier } from "./identifier"
import { KeyTable } from "./schema/key.sql"
export namespace Key {
export const list = async () => {
2025-09-03 11:56:10 +08:00
const workspace = Actor.workspace()
2025-08-29 04:44:55 +08:00
const keys = await Database.use((tx) =>
tx
2025-09-03 11:56:10 +08:00
.select()
2025-08-29 04:44:55 +08:00
.from(KeyTable)
2025-09-12 05:21:49 +08:00
.where(and(eq(KeyTable.workspaceID, workspace), isNull(KeyTable.timeDeleted)))
2025-08-29 04:44:55 +08:00
.orderBy(sql`${KeyTable.timeCreated} DESC`),
)
return keys
}
export const create = fn(z.object({ name: z.string().min(1).max(255) }), async (input) => {
const { name } = input
// Generate secret key: sk- + 64 random characters (upper, lower, numbers)
const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
2025-09-03 08:38:36 +08:00
let secretKey = "sk-"
const array = new Uint32Array(64)
crypto.getRandomValues(array)
for (let i = 0, l = array.length; i < l; i++) {
secretKey += chars[array[i] % chars.length]
2025-08-29 04:44:55 +08:00
}
2025-09-02 15:14:56 +08:00
const keyID = Identifier.create("key")
2025-10-04 11:48:29 +08:00
const user = Actor.assert("user")
2025-09-02 15:14:56 +08:00
await Database.use((tx) =>
tx.insert(KeyTable).values({
id: keyID,
2025-10-04 11:48:29 +08:00
workspaceID: Actor.workspace(),
actor: user,
userID: user.properties.userID,
2025-09-02 15:14:56 +08:00
name,
key: secretKey,
timeUsed: null,
}),
2025-10-04 11:48:29 +08:00
)
2025-08-29 04:44:55 +08:00
2025-09-02 15:14:56 +08:00
return keyID
2025-08-29 04:44:55 +08:00
})
export const remove = fn(z.object({ id: z.string() }), async (input) => {
2025-09-03 11:56:10 +08:00
const workspace = Actor.workspace()
2025-10-04 11:48:29 +08:00
await Database.transaction((tx) =>
tx
2025-09-12 05:21:49 +08:00
.update(KeyTable)
.set({
timeDeleted: sql`now()`,
})
2025-10-04 11:48:29 +08:00
.where(and(eq(KeyTable.id, input.id), eq(KeyTable.workspaceID, workspace))),
)
2025-08-29 04:44:55 +08:00
})
}