feat: utility functions to get local followers/counts given a remote actor uri, plumb cid into notes.assert via inbox.announce if a local cid is following the sending actor

This commit is contained in:
Julian Lam
2024-04-16 14:00:01 -04:00
parent 1253ded7d5
commit 452cb0a9aa
3 changed files with 48 additions and 10 deletions

View File

@@ -163,3 +163,34 @@ Actors.assert = async (ids, options = {}) => {
return actors; return actors;
}; };
Actors.getLocalFollowers = async (id) => {
const response = {
uids: new Set(),
cids: new Set(),
};
if (!activitypub.helpers.isUri(id)) {
return response;
}
const members = await db.getSortedSetMembers(`followersRemote:${id}`);
members.forEach((id) => {
if (utils.isNumber(id)) {
response.uids.add(parseInt(id, 10));
} else if (id.startsWith('cid|') && utils.isNumber(id.slice(4))) {
response.cids.add(parseInt(id.slice(4), 10));
}
});
return response;
};
Actors.getLocalFollowersCount = async (id) => {
if (!activitypub.helpers.isUri(id)) {
return false;
}
return await db.sortedSetCard(`followersRemote:${id}`);
};

View File

@@ -122,8 +122,8 @@ inbox.announce = async (req) => {
socketHelpers.sendNotificationToPostOwner(pid, actor, 'announce', 'notifications:activitypub.announce'); socketHelpers.sendNotificationToPostOwner(pid, actor, 'announce', 'notifications:activitypub.announce');
} else { } else {
// Remote object // Remote object
const isFollowed = await db.sortedSetCard(`followersRemote:${actor}`); const numFollowers = await activitypub.actors.getLocalFollowersCount(actor);
if (!isFollowed) { if (!numFollowers) {
winston.info(`[activitypub/inbox.announce] Rejecting ${object.id} via ${actor} due to no followers`); winston.info(`[activitypub/inbox.announce] Rejecting ${object.id} via ${actor} due to no followers`);
reject('Announce', object, actor); reject('Announce', object, actor);
return; return;
@@ -135,7 +135,13 @@ inbox.announce = async (req) => {
return; return;
} }
({ tid } = await activitypub.notes.assert(0, pid, { skipChecks: true })); // checks skipped; done above. const { cids } = await activitypub.actors.getLocalFollowers(actor);
let cid = null;
if (cids.size > 0) {
cid = Array.from(cids)[0];
}
({ tid } = await activitypub.notes.assert(0, pid, { cid, skipChecks: true })); // checks skipped; done above.
if (!tid) { if (!tid) {
return; return;
} }

View File

@@ -65,7 +65,7 @@ Notes.assert = async (uid, input, options = { skipChecks: false }) => {
({ cid, mainPid } = await topics.getTopicFields(tid, ['tid', 'cid', 'mainPid'])); ({ cid, mainPid } = await topics.getTopicFields(tid, ['tid', 'cid', 'mainPid']));
} else { } else {
// mainPid ok to leave as-is // mainPid ok to leave as-is
cid = -1; cid = options.cid || -1;
title = name || utils.decodeHTMLEntities(utils.stripHTMLTags(content)); title = name || utils.decodeHTMLEntities(utils.stripHTMLTags(content));
if (title.length > meta.config.maximumTitleLength) { if (title.length > meta.config.maximumTitleLength) {
title = `${title.slice(0, meta.config.maximumTitleLength - 3)}...`; title = `${title.slice(0, meta.config.maximumTitleLength - 3)}...`;
@@ -179,7 +179,7 @@ async function assertRelation(post) {
*/ */
// Is followed by at least one local user // Is followed by at least one local user
const isFollowed = await db.sortedSetCard(`followersRemote:${post.uid}`); const numFollowers = await activitypub.actors.getLocalFollowersCount(post.uid);
// Local user is mentioned // Local user is mentioned
const { tag } = post._activitypub; const { tag } = post._activitypub;
@@ -199,7 +199,7 @@ async function assertRelation(post) {
uids = uids.filter(Boolean); uids = uids.filter(Boolean);
} }
return isFollowed || uids.length; return numFollowers > 0 || uids.length;
} }
Notes.updateLocalRecipients = async (id, { to, cc }) => { Notes.updateLocalRecipients = async (id, { to, cc }) => {
@@ -214,11 +214,12 @@ Notes.updateLocalRecipients = async (id, { to, cc }) => {
const followedUid = await db.getObjectField('followersUrl:uid', recipient); const followedUid = await db.getObjectField('followersUrl:uid', recipient);
if (followedUid) { if (followedUid) {
const followers = await db.getSortedSetMembers(`followersRemote:${followedUid}`); const { uids: followers } = await activitypub.actors.getLocalFollowers(followedUid);
if (followers.length) { if (followers.size > 0) {
uids.add(...followers.map(uid => parseInt(uid, 10))); followers.forEach((uid) => {
uids.add(uid);
});
} }
// return;
} }
})); }));