diff --git a/github/sst-env.d.ts b/github/sst-env.d.ts index 6b69016e..f742a120 100644 --- a/github/sst-env.d.ts +++ b/github/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/infra/app.ts b/infra/app.ts index 465ed905..15187920 100644 --- a/infra/app.ts +++ b/infra/app.ts @@ -2,6 +2,7 @@ import { domain } from "./stage" const GITHUB_APP_ID = new sst.Secret("GITHUB_APP_ID") const GITHUB_APP_PRIVATE_KEY = new sst.Secret("GITHUB_APP_PRIVATE_KEY") +export const EMAILOCTOPUS_API_KEY = new sst.Secret("EMAILOCTOPUS_API_KEY") const bucket = new sst.cloudflare.Bucket("Bucket") export const api = new sst.cloudflare.Worker("Api", { diff --git a/infra/console.ts b/infra/console.ts index b898995d..bab66197 100644 --- a/infra/console.ts +++ b/infra/console.ts @@ -1,4 +1,5 @@ import { domain } from "./stage" +import { EMAILOCTOPUS_API_KEY } from "./app" //////////////// // DATABASE @@ -121,7 +122,7 @@ if ($app.stage === "production" || $app.stage === "frank") { new sst.cloudflare.x.SolidStart("Console", { domain, path: "packages/console/app", - link: [database, AUTH_API_URL, STRIPE_WEBHOOK_SECRET, STRIPE_SECRET_KEY, ZEN_MODELS], + link: [database, AUTH_API_URL, STRIPE_WEBHOOK_SECRET, STRIPE_SECRET_KEY, ZEN_MODELS, EMAILOCTOPUS_API_KEY], environment: { //VITE_DOCS_URL: web.url.apply((url) => url!), //VITE_API_URL: gateway.url.apply((url) => url!), diff --git a/packages/app/src/sst-env.d.ts b/packages/app/src/sst-env.d.ts index 1b1683a1..47a8fbec 100644 --- a/packages/app/src/sst-env.d.ts +++ b/packages/app/src/sst-env.d.ts @@ -2,7 +2,9 @@ /* tslint:disable */ /* eslint-disable */ /// -interface ImportMetaEnv {} +interface ImportMetaEnv { + +} interface ImportMeta { readonly env: ImportMetaEnv -} +} \ No newline at end of file diff --git a/packages/app/sst-env.d.ts b/packages/app/sst-env.d.ts index 0397645b..b6a7e906 100644 --- a/packages/app/sst-env.d.ts +++ b/packages/app/sst-env.d.ts @@ -6,4 +6,4 @@ /// import "sst" -export {} +export {} \ No newline at end of file diff --git a/packages/console/app/src/routes/workspace/member-section.tsx b/packages/console/app/src/routes/workspace/member-section.tsx index 602c29ef..d0afd7eb 100644 --- a/packages/console/app/src/routes/workspace/member-section.tsx +++ b/packages/console/app/src/routes/workspace/member-section.tsx @@ -5,7 +5,7 @@ import { createStore } from "solid-js/store" import { formatDateUTC, formatDateForTable } from "./common" import styles from "./member-section.module.css" import { and, Database, eq, sql } from "@opencode/console-core/drizzle/index.js" -import { UserTable } from "@opencode/console-core/schema/user.sql.js" +import { UserTable, UserRole } from "@opencode/console-core/schema/user.sql.js" import { Identifier } from "@opencode/console-core/identifier.js" const removeMember = action(async (form: FormData) => { @@ -31,10 +31,12 @@ const removeMember = action(async (form: FormData) => { const inviteMember = action(async (form: FormData) => { "use server" - const name = form.get("name")?.toString().trim() - if (!name) return { error: "Name is required" } + const email = form.get("email")?.toString().trim() + if (!email) return { error: "Email is required" } const workspaceID = form.get("workspaceID")?.toString() if (!workspaceID) return { error: "Workspace ID is required" } + const role = form.get("role")?.toString() as (typeof UserRole)[number] + if (!role) return { error: "Role is required" } return json( await withActor( () => @@ -44,12 +46,10 @@ const inviteMember = action(async (form: FormData) => { .values({ id: Identifier.create("user"), name: "", - email: name, + email, workspaceID, - role: "member", - timeJoined: sql`now()`, + role, }) - .onDuplicateKeyUpdate({ set: { timeJoined: sql`now()` } }) .then((data) => ({ error: undefined, data })) .catch((e) => ({ error: e.message as string })), ), @@ -109,7 +109,23 @@ export function MemberCreateForm() { >
Can manage models, members, and billing
Can only generate API keys for themselves