diff --git a/packages/console/app/src/routes/api/support/actions/unblock-workspace.ts b/packages/console/app/src/routes/api/support/actions/unblock-workspace.ts new file mode 100644 index 00000000000..fd4baa07fda --- /dev/null +++ b/packages/console/app/src/routes/api/support/actions/unblock-workspace.ts @@ -0,0 +1,21 @@ +import type { APIEvent } from "@solidjs/start/server" +import { Workspace } from "@opencode-ai/console-core/workspace.js" +import { safeEqual } from "@opencode-ai/console-core/util/crypto.js" +import { Resource } from "@opencode-ai/console-resource" +import z from "zod" + +const Body = z.object({ workspaceID: z.string().startsWith("wrk_") }) + +export async function POST(event: APIEvent) { + if (!safeEqual(event.request.headers.get("authorization") ?? "", `Bearer ${Resource.SUPPORT_API_KEY.value}`)) { + return Response.json({ error: "Unauthorized" }, { status: 401 }) + } + + const body = Body.safeParse(await event.request.json().catch(() => undefined)) + if (!body.success) { + return Response.json({ error: "Invalid request", issues: body.error.issues }, { status: 400 }) + } + return Workspace.unblock(body.data) + .then(() => Response.json({ success: true, message: "Workspace unblocked" })) + .catch((error) => Response.json({ error: error instanceof Error ? error.message : String(error) }, { status: 400 })) +} diff --git a/packages/console/core/src/workspace.ts b/packages/console/core/src/workspace.ts index 124710b5563..432d4947bdd 100644 --- a/packages/console/core/src/workspace.ts +++ b/packages/console/core/src/workspace.ts @@ -97,6 +97,18 @@ export namespace Workspace { }, ) + export const unblock = fn( + z.object({ + workspaceID: Identifier.schema("workspace"), + }), + async (input) => { + const result = await Database.use((tx) => + tx.update(WorkspaceTable).set({ is_blocked: false }).where(eq(WorkspaceTable.id, input.workspaceID)), + ) + if (result.rowsAffected === 0) throw new Error("Workspace not found") + }, + ) + export const remove = fn(z.void(), async () => { await Database.use((tx) => tx