kopia lustrzana https://github.com/cloudflare/wildebeest
add & deliver to relay
rodzic
c1fc07d2ba
commit
7b8b0c4731
|
@ -125,12 +125,26 @@ export function getFollowingId(db: D1Database, actor: Actor): Promise<Array<stri
|
|||
return getResultsField(statement, 'target_actor_id')
|
||||
}
|
||||
|
||||
export function getFollowers(db: D1Database, actor: Actor): Promise<Array<string>> {
|
||||
const query = `
|
||||
SELECT actor_id FROM actor_following WHERE target_actor_id=? AND state=?
|
||||
`
|
||||
export async function getFollowers(db: D1Database, actor: Actor): Promise<Array<string>> {
|
||||
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
|
||||
}
|
||||
|
|
|
@ -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<Env, any, ContextData> = 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<Response> {
|
||||
const body = await request.json<AddRelayRequest>()
|
||||
|
||||
// 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 })
|
||||
}
|
|
@ -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)
|
||||
);
|
Ładowanie…
Reference in New Issue