From 59e550271d3c9bc50ebb8b7ba0d04eacd1e49e1a Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Wed, 3 Sep 2025 12:31:09 -0400 Subject: [PATCH] wip: cloud --- cloud/app/src/context/auth.ts | 117 ++++++++++++------------ cloud/app/src/context/auth.withActor.ts | 1 + cloud/app/src/routes/workspace/[id].tsx | 6 +- 3 files changed, 65 insertions(+), 59 deletions(-) diff --git a/cloud/app/src/context/auth.ts b/cloud/app/src/context/auth.ts index ef81cccf..e80604f8 100644 --- a/cloud/app/src/context/auth.ts +++ b/cloud/app/src/context/auth.ts @@ -18,65 +18,70 @@ export const getActor = async (): Promise => { "use server" const evt = getRequestEvent() if (!evt) throw new Error("No request event") - const url = new URL(evt.request.headers.has("x-server-id") ? evt.request.headers.get("referer")! : evt.request.url) - const auth = await useAuthSession() - auth.data.account = auth.data.account ?? {} - const splits = url.pathname.split("/").filter(Boolean) - if (splits[0] !== "workspace") { - const current = auth.data.account[auth.data.current ?? ""] - if (current) { + if (evt.locals.actor) return evt.locals.actor + evt.locals.actor = (async () => { + console.log("getActor") + const url = new URL(evt.request.headers.has("x-server-id") ? evt.request.headers.get("referer")! : evt.request.url) + const auth = await useAuthSession() + const splits = url.pathname.split("/").filter(Boolean) + if (splits[0] !== "workspace") { + const account = auth.data.account ?? {} + const current = account[auth.data.current ?? ""] + if (current) { + return { + type: "account", + properties: { + email: current.email, + accountID: current.id, + }, + } + } + if (Object.keys(account).length > 0) { + const current = Object.values(account)[0] + await auth.update((val) => ({ + ...val, + current: current.id, + })) + return { + type: "account", + properties: { + email: current.email, + accountID: current.id, + }, + } + } return { - type: "account", - properties: { - email: current.email, - accountID: current.id, - }, + type: "public", + properties: {}, } } - if (Object.keys(auth.data.account ?? {}).length > 0) { - const current = Object.values(auth.data.account)[0] - await auth.update((val) => ({ - ...val, - current: current.id, - })) - return { - type: "account", - properties: { - email: current.email, - accountID: current.id, - }, + const workspaceHint = splits[1] + const accounts = Object.keys(auth.data.account ?? {}) + if (accounts.length) { + const result = await Database.transaction(async (tx) => { + return await tx + .select({ + user: UserTable, + }) + .from(AccountTable) + .innerJoin(UserTable, and(eq(UserTable.email, AccountTable.email))) + .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, UserTable.workspaceID)) + .where(and(inArray(AccountTable.id, accounts), eq(WorkspaceTable.id, workspaceHint))) + .limit(1) + .execute() + .then((x) => x[0]) + }) + if (result) { + return { + type: "user", + properties: { + userID: result.user.id, + workspaceID: result.user.workspaceID, + }, + } } } - return { - type: "public", - properties: {}, - } - } - const workspaceHint = splits[1] - const accounts = Object.keys(auth.data.account ?? {}) - if (accounts.length) { - const result = await Database.transaction(async (tx) => { - return await tx - .select({ - user: UserTable, - }) - .from(AccountTable) - .innerJoin(UserTable, and(eq(UserTable.email, AccountTable.email))) - .innerJoin(WorkspaceTable, eq(WorkspaceTable.id, UserTable.workspaceID)) - .where(and(inArray(AccountTable.id, accounts), eq(WorkspaceTable.id, workspaceHint))) - .limit(1) - .execute() - .then((x) => x[0]) - }) - if (result) { - return { - type: "user", - properties: { - userID: result.user.id, - workspaceID: result.user.workspaceID, - }, - } - } - } - throw redirect("/auth/authorize") + throw redirect("/auth/authorize") + })() + return evt.locals.actor } diff --git a/cloud/app/src/context/auth.withActor.ts b/cloud/app/src/context/auth.withActor.ts index a61b728e..5c87f133 100644 --- a/cloud/app/src/context/auth.withActor.ts +++ b/cloud/app/src/context/auth.withActor.ts @@ -1,5 +1,6 @@ import { Actor } from "@opencode/cloud-core/actor.js" import { getActor } from "./auth" +import { getRequestEvent } from "solid-js/web" export async function withActor(fn: () => T) { const actor = await getActor() diff --git a/cloud/app/src/routes/workspace/[id].tsx b/cloud/app/src/routes/workspace/[id].tsx index 17f4f85d..84d2c10b 100644 --- a/cloud/app/src/routes/workspace/[id].tsx +++ b/cloud/app/src/routes/workspace/[id].tsx @@ -42,12 +42,14 @@ const getBillingInfo = query(async () => { "use server" return withActor(async () => { const actor = Actor.assert("user") + const now = Date.now() const [user, billing, payments, usage] = await Promise.all([ User.fromID(actor.properties.userID), Billing.get(), Billing.payments(), Billing.usages(), ]) + console.log("duration", Date.now() - now) return { user, billing, payments, usage } }) }, "billingInfo") @@ -67,9 +69,7 @@ export default function () { ///////////////// // Keys section ///////////////// - const keys = createAsync(() => listKeys(), { - deferStream: true, - }) + const keys = createAsync(() => listKeys()) const createKeyAction = useAction(createKey) const removeKeyAction = useAction(removeKey) const createKeySubmission = useSubmission(createKey)