2022-12-05 20:14:56 +00:00
|
|
|
import type { Actor } from 'wildebeest/backend/src/activitypub/actors'
|
2023-01-04 13:58:49 +00:00
|
|
|
import { getResultsField } from './utils'
|
2022-12-05 20:14:56 +00:00
|
|
|
|
|
|
|
const STATE_PENDING = 'pending'
|
|
|
|
const STATE_ACCEPTED = 'accepted'
|
|
|
|
|
|
|
|
// Add a pending following
|
|
|
|
export async function addFollowing(db: D1Database, actor: Actor, target: Actor, targetAcct: string): Promise<string> {
|
|
|
|
const id = crypto.randomUUID()
|
|
|
|
|
|
|
|
const query = `
|
2023-01-16 13:26:10 +00:00
|
|
|
INSERT OR IGNORE INTO actor_following (id, actor_id, target_actor_id, state, target_actor_acct)
|
2023-01-04 13:58:49 +00:00
|
|
|
VALUES (?, ?, ?, ?, ?)
|
|
|
|
`
|
2022-12-05 20:14:56 +00:00
|
|
|
|
|
|
|
const out = await db
|
|
|
|
.prepare(query)
|
|
|
|
.bind(id, actor.id.toString(), target.id.toString(), STATE_PENDING, targetAcct)
|
|
|
|
.run()
|
|
|
|
if (!out.success) {
|
|
|
|
throw new Error('SQL error: ' + out.error)
|
|
|
|
}
|
|
|
|
return id
|
|
|
|
}
|
|
|
|
|
|
|
|
// Accept the pending following request
|
|
|
|
export async function acceptFollowing(db: D1Database, actor: Actor, target: Actor) {
|
|
|
|
const query = `
|
2023-01-04 13:58:49 +00:00
|
|
|
UPDATE actor_following SET state=? WHERE actor_id=? AND target_actor_id=? AND state=?
|
|
|
|
`
|
2022-12-05 20:14:56 +00:00
|
|
|
|
|
|
|
const out = await db
|
|
|
|
.prepare(query)
|
|
|
|
.bind(STATE_ACCEPTED, actor.id.toString(), target.id.toString(), STATE_PENDING)
|
|
|
|
.run()
|
|
|
|
if (!out.success) {
|
|
|
|
throw new Error('SQL error: ' + out.error)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function removeFollowing(db: D1Database, actor: Actor, target: Actor) {
|
|
|
|
const query = `
|
2023-01-04 13:58:49 +00:00
|
|
|
DELETE FROM actor_following WHERE actor_id=? AND target_actor_id=?
|
|
|
|
`
|
2022-12-05 20:14:56 +00:00
|
|
|
|
|
|
|
const out = await db.prepare(query).bind(actor.id.toString(), target.id.toString()).run()
|
|
|
|
if (!out.success) {
|
|
|
|
throw new Error('SQL error: ' + out.error)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
export function getFollowingAcct(db: D1Database, actor: Actor): Promise<Array<string>> {
|
2022-12-05 20:14:56 +00:00
|
|
|
const query = `
|
2023-01-04 13:58:49 +00:00
|
|
|
SELECT target_actor_acct FROM actor_following WHERE actor_id=? AND state=?
|
|
|
|
`
|
|
|
|
const statement = db.prepare(query).bind(actor.id.toString(), STATE_ACCEPTED)
|
2022-12-05 20:14:56 +00:00
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
return getResultsField(statement, 'target_actor_acct')
|
2022-12-05 20:14:56 +00:00
|
|
|
}
|
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
export function getFollowingRequestedAcct(db: D1Database, actor: Actor): Promise<Array<string>> {
|
2022-12-05 20:14:56 +00:00
|
|
|
const query = `
|
2023-01-04 13:58:49 +00:00
|
|
|
SELECT target_actor_acct FROM actor_following WHERE actor_id=? AND state=?
|
|
|
|
`
|
2022-12-05 20:14:56 +00:00
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
const statement = db.prepare(query).bind(actor.id.toString(), STATE_PENDING)
|
2022-12-05 20:14:56 +00:00
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
return getResultsField(statement, 'target_actor_acct')
|
2022-12-05 20:14:56 +00:00
|
|
|
}
|
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
export function getFollowingId(db: D1Database, actor: Actor): Promise<Array<string>> {
|
2022-12-05 20:14:56 +00:00
|
|
|
const query = `
|
2023-01-04 13:58:49 +00:00
|
|
|
SELECT target_actor_id FROM actor_following WHERE actor_id=? AND state=?
|
|
|
|
`
|
2022-12-05 20:14:56 +00:00
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
const statement = db.prepare(query).bind(actor.id.toString(), STATE_ACCEPTED)
|
2022-12-05 20:14:56 +00:00
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
return getResultsField(statement, 'target_actor_id')
|
2022-12-05 20:14:56 +00:00
|
|
|
}
|
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
export function getFollowers(db: D1Database, actor: Actor): Promise<Array<string>> {
|
2022-12-05 20:14:56 +00:00
|
|
|
const query = `
|
2023-01-04 13:58:49 +00:00
|
|
|
SELECT actor_id FROM actor_following WHERE target_actor_id=? AND state=?
|
|
|
|
`
|
2022-12-05 20:14:56 +00:00
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
const statement = db.prepare(query).bind(actor.id.toString(), STATE_ACCEPTED)
|
2022-12-05 20:14:56 +00:00
|
|
|
|
2023-01-04 13:58:49 +00:00
|
|
|
return getResultsField(statement, 'actor_id')
|
2022-12-05 20:14:56 +00:00
|
|
|
}
|