diff --git a/src/remote/activitypub/act/undo/follow.ts b/src/remote/activitypub/act/undo/follow.ts new file mode 100644 index 0000000000..b1c462a3b0 --- /dev/null +++ b/src/remote/activitypub/act/undo/follow.ts @@ -0,0 +1,25 @@ +import parseAcct from '../../../../acct/parse'; +import User from '../../../../models/user'; +import config from '../../../../config'; +import unfollow from '../../../../services/following/delete'; + +export default async (actor, activity): Promise => { + const prefix = config.url + '/@'; + const id = activity.object.id || activity.object; + + if (!id.startsWith(prefix)) { + return null; + } + + const { username, host } = parseAcct(id.slice(prefix.length)); + if (host !== null) { + throw new Error(); + } + + const followee = await User.findOne({ username, host }); + if (followee === null) { + throw new Error(); + } + + await unfollow(actor, followee, activity); +}; diff --git a/src/remote/activitypub/act/undo.ts b/src/remote/activitypub/act/undo/index.ts similarity index 89% rename from src/remote/activitypub/act/undo.ts rename to src/remote/activitypub/act/undo/index.ts index 9d9f6b0359..ecd9944b42 100644 --- a/src/remote/activitypub/act/undo.ts +++ b/src/remote/activitypub/act/undo/index.ts @@ -1,4 +1,4 @@ -import unfollow from './unfollow'; +import unfollow from './follow'; export default async (actor, activity): Promise => { if ('actor' in activity && actor.account.uri !== activity.actor) {