diff --git a/src/activitypub/index.js b/src/activitypub/index.js index 0caec6b9ff..068264794c 100644 --- a/src/activitypub/index.js +++ b/src/activitypub/index.js @@ -46,39 +46,54 @@ ActivityPub.getActor = async (input) => { return actor; }; -ActivityPub.mockProfile = async (callerUid, actor) => { - // Accepts an actor object; the output of getActor() - const uid = actor.id; - const { preferredUsername, published, icon, image, name, summary, hostname } = actor; - const isFollowing = await db.isSortedSetMember(`followingRemote:${callerUid}`, uid); - - let picture; - if (icon) { - picture = typeof icon === 'string' ? icon : icon.url; +ActivityPub.mockProfile = async (actors, callerUid = 0) => { + // Accepts an array containing actor objects (the output of getActor()), or uris + let single = false; + if (!Array.isArray(actors)) { + single = true; + actors = [actors]; } - const iconBackgrounds = await user.getIconBackgrounds(); - let bgColor = Array.prototype.reduce.call(preferredUsername, (cur, next) => cur + next.charCodeAt(), 0); - bgColor = iconBackgrounds[bgColor % iconBackgrounds.length]; - const payload = { - uid, - username: `${preferredUsername}@${hostname}`, - userslug: `${preferredUsername}@${hostname}`, - fullname: name, - joindate: new Date(published).getTime(), - picture, - 'icon:text': (preferredUsername[0] || '').toUpperCase(), - 'icon:bgColor': bgColor, - uploadedpicture: undefined, - 'cover:url': !image || typeof image === 'string' ? image : image.url, - 'cover:position': '50% 50%', - aboutme: summary, - aboutmeParsed: summary, + const profiles = await Promise.all(actors.map(async (actor) => { + // convert uri to actor object + if (typeof actor === 'string' && ActivityPub.helpers.isUri(actor)) { + actor = await ActivityPub.getActor(actor); + } - isFollowing, - }; + const uid = actor.id; + const { preferredUsername, published, icon, image, name, summary, hostname } = actor; + const isFollowing = await db.isSortedSetMember(`followingRemote:${callerUid}`, uid); - return payload; + let picture; + if (icon) { + picture = typeof icon === 'string' ? icon : icon.url; + } + const iconBackgrounds = await user.getIconBackgrounds(); + let bgColor = Array.prototype.reduce.call(preferredUsername, (cur, next) => cur + next.charCodeAt(), 0); + bgColor = iconBackgrounds[bgColor % iconBackgrounds.length]; + + const payload = { + uid, + username: `${preferredUsername}@${hostname}`, + userslug: `${preferredUsername}@${hostname}`, + fullname: name, + joindate: new Date(published).getTime(), + picture, + 'icon:text': (preferredUsername[0] || '').toUpperCase(), + 'icon:bgColor': bgColor, + uploadedpicture: undefined, + 'cover:url': !image || typeof image === 'string' ? image : image.url, + 'cover:position': '50% 50%', + aboutme: summary, + aboutmeParsed: summary, + + isFollowing, + }; + + return payload; + })); + + return single ? profiles.pop() : profiles; }; ActivityPub.resolveInboxes = async ids => await Promise.all(ids.map(async (id) => { diff --git a/src/controllers/activitypub/profiles.js b/src/controllers/activitypub/profiles.js index 45a0280c66..afeab8cedb 100644 --- a/src/controllers/activitypub/profiles.js +++ b/src/controllers/activitypub/profiles.js @@ -11,6 +11,6 @@ controller.get = async function (req, res, next) { return next(); } - const payload = await mockProfile(req.uid, actor); + const payload = await mockProfile(actor, req.uid); res.render('account/profile', payload); };