diff --git a/src/activitypub/actors.js b/src/activitypub/actors.js index 1962294a24..c6894b7c3b 100644 --- a/src/activitypub/actors.js +++ b/src/activitypub/actors.js @@ -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 = { diff --git a/test/activitypub/actors.js b/test/activitypub/actors.js index 7106dced69..2e2375e2ce 100644 --- a/test/activitypub/actors.js +++ b/test/activitypub/actors.js @@ -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', () => {