diff options
Diffstat (limited to 'cloud/core/src')
| -rw-r--r-- | cloud/core/src/key.ts | 26 | ||||
| -rw-r--r-- | cloud/core/src/schema/key.sql.ts | 7 |
2 files changed, 27 insertions, 6 deletions
diff --git a/cloud/core/src/key.ts b/cloud/core/src/key.ts index b62a8961b..a8bcec401 100644 --- a/cloud/core/src/key.ts +++ b/cloud/core/src/key.ts @@ -1,7 +1,7 @@ import { z } from "zod" import { fn } from "./util/fn" import { Actor } from "./actor" -import { and, Database, eq, sql } from "./drizzle" +import { and, Database, eq, isNull, sql } from "./drizzle" import { Identifier } from "./identifier" import { KeyTable } from "./schema/key.sql" @@ -12,7 +12,7 @@ export namespace Key { tx .select() .from(KeyTable) - .where(eq(KeyTable.workspaceID, workspace)) + .where(and(eq(KeyTable.workspaceID, workspace), isNull(KeyTable.timeDeleted))) .orderBy(sql`${KeyTable.timeCreated} DESC`), ) return keys @@ -48,8 +48,24 @@ export namespace Key { export const remove = fn(z.object({ id: z.string() }), async (input) => { const workspace = Actor.workspace() - await Database.use((tx) => - tx.delete(KeyTable).where(and(eq(KeyTable.id, input.id), eq(KeyTable.workspaceID, workspace))), - ) + await Database.transaction(async (tx) => { + const row = await tx + .select({ + name: KeyTable.name, + }) + .from(KeyTable) + .where(and(eq(KeyTable.id, input.id), eq(KeyTable.workspaceID, workspace))) + .then((rows) => rows[0]) + if (!row) return + + await tx + .update(KeyTable) + .set({ + timeDeleted: sql`now()`, + oldName: row.name, + name: input.id, // Use the key ID as the name + }) + .where(and(eq(KeyTable.id, input.id), eq(KeyTable.workspaceID, workspace))) + }) }) } diff --git a/cloud/core/src/schema/key.sql.ts b/cloud/core/src/schema/key.sql.ts index 07982779b..98b99c788 100644 --- a/cloud/core/src/schema/key.sql.ts +++ b/cloud/core/src/schema/key.sql.ts @@ -10,8 +10,13 @@ export const KeyTable = mysqlTable( ...timestamps, actor: json("actor").$type<Actor.Info>(), name: varchar("name", { length: 255 }).notNull(), + oldName: varchar("old_name", { length: 255 }), key: varchar("key", { length: 255 }).notNull(), timeUsed: utc("time_used"), }, - (table) => [...workspaceIndexes(table), uniqueIndex("global_key").on(table.key)], + (table) => [ + ...workspaceIndexes(table), + uniqueIndex("global_key").on(table.key), + uniqueIndex("name").on(table.workspaceID, table.name), + ], ) |
