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

View File

@@ -73,7 +73,15 @@ module.exports = function (User) {
if (parseInt(uid, 10) <= 0) { if (parseInt(uid, 10) <= 0) {
return []; 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}`, { const data = await plugins.hooks.fire(`filter:user.${type}`, {
uids: uids, uids: uids,
uid: uid, uid: uid,