feat: show remote followers/following in user profile pages

This commit is contained in:
Julian Lam
2024-01-04 16:26:35 -05:00
parent 672c70146a
commit 739b05481c
2 changed files with 30 additions and 7 deletions

View File

@@ -50,13 +50,22 @@ module.exports = function (User) {
return [];
}
uids = uids.map(uid => (isNaN(uid) ? 0 : parseInt(uid, 10)));
uids = uids.map((uid) => {
if (isFinite(uid)) {
return parseInt(uid, 10);
} else if (activitypub.helpers.isUri(uid)) {
return uid;
}
return 0;
});
const fieldsToRemove = [];
fields = fields.slice();
ensureRequiredFields(fields, fieldsToRemove);
const uniqueUids = _.uniq(uids).filter(uid => uid > 0);
const uniqueUids = _.uniq(uids).filter(uid => isFinite(uid) && uid > 0);
const remoteIds = _.uniq(uids).filter(uid => !isFinite(uid));
const results = await plugins.hooks.fire('filter:user.whitelistFields', {
uids: uids,
@@ -69,7 +78,10 @@ module.exports = function (User) {
fields = fields.filter(value => value !== 'password');
}
const users = await db.getObjectsFields(uniqueUids.map(uid => `user:${uid}`), fields);
const users = [
...await db.getObjectsFields(uniqueUids.map(uid => `user:${uid}`), fields),
...await activitypub.mockProfile(remoteIds, 0, fields),
];
const result = await plugins.hooks.fire('filter:user.getFields', {
uids: uniqueUids,
users: users,
@@ -81,7 +93,7 @@ module.exports = function (User) {
}
});
await modifyUserData(result.users, fields, fieldsToRemove);
return uidsToUsers(uids, uniqueUids, result.users);
return uidsToUsers(uids, [...uniqueUids, ...remoteIds], result.users);
};
function ensureRequiredFields(fields, fieldsToRemove) {
@@ -117,7 +129,7 @@ module.exports = function (User) {
const uidToUser = _.zipObject(uniqueUids, usersData);
const users = uids.map((uid) => {
const user = uidToUser[uid] || { ...User.guestData };
if (!parseInt(user.uid, 10)) {
if (!parseInt(user.uid, 10) && !activitypub.helpers.isUri(user.uid)) {
user.username = (user.hasOwnProperty('oldUid') && parseInt(user.oldUid, 10)) ? '[[global:former-user]]' : '[[global:guest]]';
user.displayname = user.username;
}
@@ -192,6 +204,9 @@ module.exports = function (User) {
return;
}
if (activitypub.helpers.isUri(String(user.uid))) {
intFields.splice(intFields.indexOf('uid'), 1);
}
db.parseIntFields(user, intFields, requestedFields);
if (user.hasOwnProperty('username')) {
@@ -203,7 +218,7 @@ module.exports = function (User) {
user.email = validator.escape(user.email ? user.email.toString() : '');
}
if (!parseInt(user.uid, 10)) {
if (!parseInt(user.uid, 10) && !activitypub.helpers.isUri(user.uid)) {
for (const [key, value] of Object.entries(User.guestData)) {
user[key] = value;
}

View File

@@ -73,7 +73,15 @@ module.exports = function (User) {
if (parseInt(uid, 10) <= 0) {
return [];
}
const uids = await db.getSortedSetRevRange(`${type}:${uid}`, start, stop);
const uids = await db.getSortedSetRevUnion({
sets: [
`${type}:${uid}`,
`${type}Remote:${uid}`,
],
start,
stop,
});
const data = await plugins.hooks.fire(`filter:user.${type}`, {
uids: uids,
uid: uid,