From 96fc7b4b2c5c3a0133b8965f279b496f5bf6e6f5 Mon Sep 17 00:00:00 2001 From: Sven Sauleau Date: Tue, 7 Mar 2023 13:06:28 +0000 Subject: [PATCH] refactor UI alias API --- backend/src/accounts/alias.ts | 20 +++++++++ backend/test/wildebeest/settings.spec.ts | 11 +---- frontend/src/entry.cloudflare-pages.tsx | 2 +- .../(admin)/settings/(auth)/aliases/index.tsx | 43 ++++++++++++++----- functions/api/wb/settings/account/alias.ts | 35 --------------- 5 files changed, 55 insertions(+), 56 deletions(-) create mode 100644 backend/src/accounts/alias.ts delete mode 100644 functions/api/wb/settings/account/alias.ts diff --git a/backend/src/accounts/alias.ts b/backend/src/accounts/alias.ts new file mode 100644 index 0000000..999f70e --- /dev/null +++ b/backend/src/accounts/alias.ts @@ -0,0 +1,20 @@ +import { setActorAlias } from 'wildebeest/backend/src/activitypub/actors' +import type { Actor } from 'wildebeest/backend/src/activitypub/actors' +import { parseHandle } from 'wildebeest/backend/src/utils/parse' +import { queryAcct } from 'wildebeest/backend/src/webfinger' +import { type Database } from 'wildebeest/backend/src/database' + +export async function addAlias(db: Database, alias: string, connectedActor: Actor) { + const handle = parseHandle(alias) + const acct = `${handle.localPart}@${handle.domain}` + if (handle.domain === null) { + throw new Error("account migration within an instance isn't supported") + } + + const actor = await queryAcct(handle.domain, db, acct) + if (actor === null) { + throw new Error('actor not found') + } + + await setActorAlias(db, connectedActor.id, actor.id) +} diff --git a/backend/test/wildebeest/settings.spec.ts b/backend/test/wildebeest/settings.spec.ts index fb14004..b7608ae 100644 --- a/backend/test/wildebeest/settings.spec.ts +++ b/backend/test/wildebeest/settings.spec.ts @@ -1,7 +1,7 @@ import { makeDB } from '../utils' import { strict as assert } from 'node:assert/strict' import { createPerson, getActorById } from 'wildebeest/backend/src/activitypub/actors' -import * as account_alias from 'wildebeest/functions/api/wb/settings/account/alias' +import * as alias from 'wildebeest/backend/src/accounts/alias' const domain = 'cloudflare.com' const userKEK = 'test_kek22' @@ -39,14 +39,7 @@ describe('Wildebeest', () => { throw new Error('unexpected request to ' + input) } - const alias = 'test@example.com' - - const req = new Request('https://example.com', { - method: 'POST', - body: JSON.stringify({ alias }), - }) - const res = await account_alias.handleRequestPost(db, req, actor) - assert.equal(res.status, 201) + await alias.addAlias(db, 'test@example.com', actor) // Ensure the actor has the alias set const newActor = await getActorById(db, actor.id) diff --git a/frontend/src/entry.cloudflare-pages.tsx b/frontend/src/entry.cloudflare-pages.tsx index fa113c9..afc3bf6 100644 --- a/frontend/src/entry.cloudflare-pages.tsx +++ b/frontend/src/entry.cloudflare-pages.tsx @@ -23,7 +23,7 @@ import type { Person } from 'wildebeest/backend/src/activitypub/actors' const qwikHandler = createQwikCity({ render, qwikCityPlan }) type QwikContextData = { - connectedActor: Person | null, + connectedActor: Person | null } // eslint-disable-next-line diff --git a/frontend/src/routes/(admin)/settings/(auth)/aliases/index.tsx b/frontend/src/routes/(admin)/settings/(auth)/aliases/index.tsx index 6d24fea..9be0354 100644 --- a/frontend/src/routes/(admin)/settings/(auth)/aliases/index.tsx +++ b/frontend/src/routes/(admin)/settings/(auth)/aliases/index.tsx @@ -1,7 +1,35 @@ import { component$, useStore, useSignal, $ } from '@builder.io/qwik' +import { getErrorHtml } from '~/utils/getErrorHtml/getErrorHtml' +import { getDatabase } from 'wildebeest/backend/src/database' +import { action$, Form, zod$, z } from '@builder.io/qwik-city' +import { addAlias } from 'wildebeest/backend/src/accounts/alias' + +const zodSchema = zod$({ + alias: z.string().min(1), +}) + +export const action = action$(async (data, { env, platform, html }) => { + const db = await getDatabase(platform) + // eslint-disable-next-line + const connectedActor = (env as any).data.connectedActor + if (connectedActor === null) { + throw html(500, getErrorHtml('user not present in context')) + } + + let success = false + try { + await addAlias(db, data.alias, connectedActor) + success = true + } catch (e: unknown) { + success = false + } + + return { + success, + } +}, zodSchema) export default component$(() => { - const ref = useSignal() const state = useStore({ alias: '' }) const toast = useSignal<'success' | 'failure' | null>(null) @@ -9,17 +37,10 @@ export default component$(() => { state.alias = (event.target as HTMLInputElement).value }) - const handleSubmit = $(async () => { - const res = await fetch('/api/wb/settings/account/alias', { method: 'POST', body: JSON.stringify(state) }) - if (res.status == 200) { - toast.value = 'success' - } else { - toast.value = 'failure' - } - }) + const saveAction = action() return ( - + ) }) diff --git a/functions/api/wb/settings/account/alias.ts b/functions/api/wb/settings/account/alias.ts deleted file mode 100644 index 6eaa3ca..0000000 --- a/functions/api/wb/settings/account/alias.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { Env } from 'wildebeest/backend/src/types/env' -import { setActorAlias } from 'wildebeest/backend/src/activitypub/actors' -import type { ContextData } from 'wildebeest/backend/src/types/context' -import type { Actor } from 'wildebeest/backend/src/activitypub/actors' -import { parseHandle } from 'wildebeest/backend/src/utils/parse' -import { queryAcct } from 'wildebeest/backend/src/webfinger' -import * as errors from 'wildebeest/backend/src/errors' -import { type Database, getDatabase } from 'wildebeest/backend/src/database' - -export const onRequestPost: PagesFunction = async ({ env, request, data }) => { - return handleRequestPost(await getDatabase(env), request, data.connectedActor) -} - -type AddAliasRequest = { - alias: string -} - -export async function handleRequestPost(db: Database, request: Request, connectedActor: Actor): Promise { - const body = await request.json() - - const handle = parseHandle(body.alias) - const acct = `${handle.localPart}@${handle.domain}` - if (handle.domain === null) { - console.warn("account migration within an instance isn't supported") - return new Response('', { status: 400 }) - } - const actor = await queryAcct(handle.domain, db, acct) - if (actor === null) { - return errors.resourceNotFound('actor', acct) - } - - await setActorAlias(db, connectedActor.id, actor.id) - - return new Response('', { status: 201 }) -}