mirror of
https://github.com/NodeBB/NodeBB.git
synced 2026-01-21 15:03:12 +01:00
fix: remove old remote user to remote category migration logic + tests
This commit is contained in:
@@ -411,7 +411,6 @@ Actors.assertGroup = async (ids, options = {}) => {
|
||||
db.sortedSetAdd('usersRemote:lastCrawled', groups.map(() => now), groups.map(p => p.id)),
|
||||
db.sortedSetAddBulk(queries.searchAdd),
|
||||
db.setObject('handle:cid', queries.handleAdd),
|
||||
_migratePersonToGroup(categoryObjs),
|
||||
db.setsAdd(masksAdd, 'topics:create'),
|
||||
db.setsRemove(masksRemove, 'topics:create'),
|
||||
]);
|
||||
@@ -419,41 +418,6 @@ Actors.assertGroup = async (ids, options = {}) => {
|
||||
return categoryObjs;
|
||||
};
|
||||
|
||||
async function _migratePersonToGroup(categoryObjs) {
|
||||
// 4.0.0-4.1.x asserted as:Group as users. This moves relevant stuff over and deletes the now-duplicate user.
|
||||
let ids = categoryObjs.map(category => category.cid);
|
||||
const slugs = categoryObjs.map(category => category.slug);
|
||||
const isUser = await db.isObjectFields('handle:uid', slugs);
|
||||
ids = ids.filter((id, idx) => isUser[idx]);
|
||||
if (!ids.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
await Promise.all(ids.map(async (id) => {
|
||||
const shares = await db.getSortedSetMembers(`uid:${id}:shares`);
|
||||
let cids = await topics.getTopicsFields(shares, ['cid']);
|
||||
cids = cids.map(o => o.cid);
|
||||
await Promise.all(shares.map(async (share, idx) => {
|
||||
const cid = cids[idx];
|
||||
if (cid === -1) {
|
||||
await topics.tools.move(share, {
|
||||
cid: id,
|
||||
uid: 'system',
|
||||
});
|
||||
}
|
||||
}));
|
||||
|
||||
const followers = await db.getSortedSetMembersWithScores(`followersRemote:${id}`);
|
||||
await db.sortedSetAdd(
|
||||
`cid:${id}:uid:watch:state`,
|
||||
followers.map(() => categories.watchStates.tracking),
|
||||
followers.map(({ value }) => value),
|
||||
);
|
||||
await user.deleteAccount(id);
|
||||
}));
|
||||
await categories.onTopicsMoved(ids);
|
||||
}
|
||||
|
||||
Actors.getLocalFollowers = async (id) => {
|
||||
// Returns local uids and cids that follow a remote actor (by id)
|
||||
const response = {
|
||||
|
||||
@@ -76,105 +76,6 @@ describe('Actor asserton', () => {
|
||||
assert.strictEqual(assertion.length, 1);
|
||||
assert.strictEqual(assertion[0].cid, actor.id);
|
||||
});
|
||||
|
||||
describe('remote user to remote category migration', () => {
|
||||
it('should not migrate a user to a category if .assert is called', async () => {
|
||||
// ... because the user isn't due for an update and so is filtered out during qualification
|
||||
const { id } = helpers.mocks.person();
|
||||
await activitypub.actors.assert([id]);
|
||||
|
||||
const { actor } = helpers.mocks.group({ id });
|
||||
const assertion = await activitypub.actors.assertGroup([id]);
|
||||
|
||||
assert(assertion.length, 0);
|
||||
|
||||
const exists = await user.exists(id);
|
||||
assert.strictEqual(exists, false);
|
||||
});
|
||||
|
||||
it('should migrate a user to a category if on re-assertion it identifies as an as:Group', async () => {
|
||||
// This is to handle previous behaviour that saved all as:Group actors as NodeBB users.
|
||||
const { id } = helpers.mocks.person();
|
||||
await activitypub.actors.assert([id]);
|
||||
|
||||
helpers.mocks.group({ id });
|
||||
const assertion = await activitypub.actors.assertGroup([id]);
|
||||
|
||||
assert(assertion && Array.isArray(assertion) && assertion.length === 1);
|
||||
|
||||
const exists = await user.exists(id);
|
||||
assert.strictEqual(exists, false);
|
||||
});
|
||||
|
||||
it('should migrate any shares by that user, into topics in the category', async () => {
|
||||
const { id } = helpers.mocks.person();
|
||||
await activitypub.actors.assert([id]);
|
||||
|
||||
// Two shares
|
||||
for (let x = 0; x < 2; x++) {
|
||||
const { id: pid } = helpers.mocks.note();
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const { tid } = await activitypub.notes.assert(0, pid, { skipChecks: 1 });
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await db.sortedSetAdd(`uid:${id}:shares`, Date.now(), tid);
|
||||
}
|
||||
|
||||
helpers.mocks.group({ id });
|
||||
await activitypub.actors.assertGroup([id]);
|
||||
|
||||
const { topic_count, post_count } = await categories.getCategoryData(id);
|
||||
assert.strictEqual(topic_count, 2);
|
||||
assert.strictEqual(post_count, 2);
|
||||
});
|
||||
|
||||
it('should not migrate shares by that user that already belong to a local category', async () => {
|
||||
const { id } = helpers.mocks.person();
|
||||
await activitypub.actors.assert([id]);
|
||||
|
||||
const { cid } = await categories.create({ name: utils.generateUUID() });
|
||||
|
||||
// Two shares, one moved to local cid
|
||||
for (let x = 0; x < 2; x++) {
|
||||
const { id: pid } = helpers.mocks.note();
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
const { tid } = await activitypub.notes.assert(0, pid, { skipChecks: 1 });
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await db.sortedSetAdd(`uid:${id}:shares`, Date.now(), tid);
|
||||
|
||||
if (!x) {
|
||||
// eslint-disable-next-line no-await-in-loop
|
||||
await topics.tools.move(tid, {
|
||||
cid,
|
||||
uid: 'system',
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
helpers.mocks.group({ id });
|
||||
await activitypub.actors.assertGroup([id]);
|
||||
|
||||
const { topic_count, post_count } = await categories.getCategoryData(id);
|
||||
assert.strictEqual(topic_count, 1);
|
||||
assert.strictEqual(post_count, 1);
|
||||
});
|
||||
|
||||
it('should migrate any local followers into category watches', async () => {
|
||||
const { id } = helpers.mocks.person();
|
||||
await activitypub.actors.assert([id]);
|
||||
|
||||
const followerUid = await user.create({ username: utils.generateUUID() });
|
||||
await Promise.all([
|
||||
db.sortedSetAdd(`followingRemote:${followerUid}`, Date.now(), id),
|
||||
db.sortedSetAdd(`followersRemote:${id}`, Date.now(), followerUid),
|
||||
]);
|
||||
|
||||
helpers.mocks.group({ id });
|
||||
await activitypub.actors.assertGroup([id]);
|
||||
|
||||
const states = await categories.getWatchState([id], followerUid);
|
||||
assert.strictEqual(states[0], categories.watchStates.tracking);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('less happy paths', () => {
|
||||
|
||||
Reference in New Issue
Block a user