From 7b8b0c47317711633716b02b390b0a9698e2a24b Mon Sep 17 00:00:00 2001 From: Sven Sauleau Date: Mon, 20 Feb 2023 16:19:29 +0000 Subject: [PATCH] add & deliver to relay --- backend/src/mastodon/follow.ts | 26 +++++++++++---- functions/api/wb/settings/relay.ts | 53 ++++++++++++++++++++++++++++++ migrations/0008_add_relays.sql | 8 +++++ 3 files changed, 81 insertions(+), 6 deletions(-) create mode 100644 functions/api/wb/settings/relay.ts create mode 100644 migrations/0008_add_relays.sql diff --git a/backend/src/mastodon/follow.ts b/backend/src/mastodon/follow.ts index 16ef42e..b4c515d 100644 --- a/backend/src/mastodon/follow.ts +++ b/backend/src/mastodon/follow.ts @@ -125,12 +125,26 @@ export function getFollowingId(db: D1Database, actor: Actor): Promise> { - const query = ` - SELECT actor_id FROM actor_following WHERE target_actor_id=? AND state=? - ` +export async function getFollowers(db: D1Database, actor: Actor): Promise> { + const followers = [] - const statement = db.prepare(query).bind(actor.id.toString(), STATE_ACCEPTED) + { + const query = ` + SELECT actor_id FROM actor_following WHERE target_actor_id=? AND state=? + ` + const statement = db.prepare(query).bind(actor.id.toString(), STATE_ACCEPTED) + const actors = await getResultsField(statement, 'actor_id') + followers.push(...actors) + } - return getResultsField(statement, 'actor_id') + { + const query = ` + SELECT actor_id FROM relays + ` + const statement = db.prepare(query) + const relays = await getResultsField(statement, 'actor_id') + followers.push(...relays) + } + + return followers } diff --git a/functions/api/wb/settings/relay.ts b/functions/api/wb/settings/relay.ts new file mode 100644 index 0000000..a6f5abd --- /dev/null +++ b/functions/api/wb/settings/relay.ts @@ -0,0 +1,53 @@ +import type { Env } from 'wildebeest/backend/src/types/env' +import { deliverToActor } from 'wildebeest/backend/src/activitypub/deliver' +import type { Person } from 'wildebeest/backend/src/activitypub/actors' +import { getSigningKey } from 'wildebeest/backend/src/mastodon/account' +import * as follow from 'wildebeest/backend/src/activitypub/activities/follow' +import * as actors from 'wildebeest/backend/src/activitypub/actors' +import type { ContextData } from 'wildebeest/backend/src/types/context' + +export const onRequestPost: PagesFunction = async ({ env, request, data }) => { + const domain = new URL(request.url).hostname + return handleRequestPost(env.DATABASE, request, data.connectedActor, env.userKEK, domain) +} + +type AddRelayRequest = { + actor: string +} + +export async function handleRequestPost( + db: D1Database, + request: Request, + connectedActor: Person, + userKEK: string, + domain: string +): Promise { + const body = await request.json() + + // download actor + const actorId = new URL(body.actor) + const targetActor = await actors.getAndCache(actorId, db) + + // add relay + { + const id = crypto.randomUUID() + await db + .prepare( + ` + INSERT INTO relays (id, actor_id) + VALUES (?, ?) + ` + ) + .bind(id, targetActor.id.toString()) + .run() + } + + // follow relay + { + const activity = follow.create(connectedActor, targetActor) + const signingKey = await getSigningKey(userKEK, db, connectedActor) + await deliverToActor(signingKey, connectedActor, targetActor, activity, domain) + } + + return new Response('', { status: 201 }) +} diff --git a/migrations/0008_add_relays.sql b/migrations/0008_add_relays.sql new file mode 100644 index 0000000..eaf1edb --- /dev/null +++ b/migrations/0008_add_relays.sql @@ -0,0 +1,8 @@ +-- Migration number: 0008 2023-02-20T15:47:44.001Z + +CREATE TABLE IF NOT EXISTS relays ( + id TEXT PRIMARY KEY, + actor_id TEXT NOT NULL UNIQUE, + + FOREIGN KEY(actor_id) REFERENCES actors(id) +);