From 9422e94a8e22dc9ec573b80babec2db9d744fec1 Mon Sep 17 00:00:00 2001 From: Sanju Sivalingam Date: Tue, 17 Feb 2026 14:40:42 +0530 Subject: [PATCH] feat: add API keys management page Co-Authored-By: Claude Opus 4.6 --- web/src/lib/api/api-keys.remote.ts | 27 +++++ web/src/lib/schema/api-keys.ts | 5 + .../routes/dashboard/api-keys/+page.svelte | 114 ++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 web/src/lib/api/api-keys.remote.ts create mode 100644 web/src/lib/schema/api-keys.ts create mode 100644 web/src/routes/dashboard/api-keys/+page.svelte diff --git a/web/src/lib/api/api-keys.remote.ts b/web/src/lib/api/api-keys.remote.ts new file mode 100644 index 0000000..65be17e --- /dev/null +++ b/web/src/lib/api/api-keys.remote.ts @@ -0,0 +1,27 @@ +import { form, getRequestEvent, query } from '$app/server'; +import { auth } from '$lib/server/auth'; +import { createKeySchema } from '$lib/schema/api-keys'; + +export const listKeys = query(async () => { + const { request } = getRequestEvent(); + return await auth.api.listApiKeys({ headers: request.headers }); +}); + +export const createKey = form(createKeySchema, async ({ name }) => { + const { request } = getRequestEvent(); + const result = await auth.api.createApiKey({ + body: { name, prefix: 'dc' }, + headers: request.headers + }); + return result; +}); + +export const deleteKey = form(async () => { + const { request } = getRequestEvent(); + const formData = await request.clone().formData(); + const keyId = formData.get('keyId') as string; + await auth.api.deleteApiKey({ + body: { keyId }, + headers: request.headers + }); +}); diff --git a/web/src/lib/schema/api-keys.ts b/web/src/lib/schema/api-keys.ts new file mode 100644 index 0000000..aeca962 --- /dev/null +++ b/web/src/lib/schema/api-keys.ts @@ -0,0 +1,5 @@ +import { object, string, pipe, minLength } from 'valibot'; + +export const createKeySchema = object({ + name: pipe(string(), minLength(1)) +}); diff --git a/web/src/routes/dashboard/api-keys/+page.svelte b/web/src/routes/dashboard/api-keys/+page.svelte new file mode 100644 index 0000000..389577c --- /dev/null +++ b/web/src/routes/dashboard/api-keys/+page.svelte @@ -0,0 +1,114 @@ + + +

API Keys

+ + +
+

Create New Key

+
+ + +
+
+ + +{#if newKeyValue} +
+

Save Your API Key

+

+ Copy this key now. It will not be shown again. +

+
+ + {newKeyValue} + + +
+ +
+{/if} + + +
+
+

Your Keys

+
+ + {#await listKeys()} +
Loading keys...
+ {:then keys} + {#if keys && keys.length > 0} +
    + {#each keys as key (key.id)} +
  • +
    +

    {key.name ?? 'Unnamed Key'}

    +
    + {#if key.start} + {key.start}... + {/if} + + Created {new Date(key.createdAt).toLocaleDateString()} + +
    +
    +
    + + +
    +
  • + {/each} +
+ {:else} +
+ No API keys yet. Create one above. +
+ {/if} + {:catch} +
+ Failed to load keys. Please try again. +
+ {/await} +