diff --git a/src/api/activitypub.js b/src/api/activitypub.js index be6600d3a2..ed9e6f2f64 100644 --- a/src/api/activitypub.js +++ b/src/api/activitypub.js @@ -13,6 +13,7 @@ const winston = require('winston'); const db = require('../database'); const user = require('../user'); +const categories = require('../categories'); const meta = require('../meta'); const privileges = require('../privileges'); const activitypub = require('../activitypub'); @@ -43,7 +44,14 @@ activitypubApi.follow = enabledCheck(async (caller, { type, id, actor } = {}) => throw new Error('[[error:activitypub.invalid-id]]'); } - actor = actor.includes('@') ? await user.getUidByUserslug(actor) : actor; + if (actor.includes('@')) { + const [uid, cid] = await Promise.all([ + user.getUidByUserslug(actor), + categories.getCidByHandle(actor), + ]); + + actor = uid || cid; + } const [handle, isFollowing] = await Promise.all([ user.getUserField(actor, 'username'), db.isSortedSetMember(type === 'uid' ? `followingRemote:${id}` : `cid:${id}:following`, actor), diff --git a/src/categories/index.js b/src/categories/index.js index 308516cd97..de7ff6d769 100644 --- a/src/categories/index.js +++ b/src/categories/index.js @@ -85,7 +85,13 @@ Categories.getCategoryById = async function (data) { }; Categories.getCidByHandle = async function (handle) { - return await db.sortedSetScore('categoryhandle:cid', handle); + let cid = await db.sortedSetScore('categoryhandle:cid', handle); + if (!cid) { + // remote cids + cid = await db.getObjectField('handle:cid', handle); + } + + return cid; }; Categories.getAllCidsFromSet = async function (key) {