diff --git a/src/models/__tests__/base.model.test.js b/src/models/__tests__/base.model.test.js index 7e61e9313123b8b311f4bac329483e2b36b50940..e87e855d60f1dfb10d48e4a2de2e29c0fed1b795 100644 --- a/src/models/__tests__/base.model.test.js +++ b/src/models/__tests__/base.model.test.js @@ -335,7 +335,7 @@ describe('Base model', () => { const newEntity2 = await Fake.insert({}) const affectedRows = await Fake.deleteByIds([newEntity1.id, newEntity2.id]) const { result } = await Fake.find({}) - expect(affectedRows).toEqual(2) + expect(affectedRows).toEqual([newEntity1.id, newEntity2.id]) expect(result).toHaveLength(0) }) diff --git a/src/models/__tests__/user.controller.test.js b/src/models/__tests__/user.controller.test.js index 7a9973f93d2158e169aa73f341c8f3d4dd4a6a99..dbfc3a2b9d1ff1d12f22f136a39915eabb4b3d82 100644 --- a/src/models/__tests__/user.controller.test.js +++ b/src/models/__tests__/user.controller.test.js @@ -1,7 +1,8 @@ -const { User } = require('../index') +const { User, Identity } = require('../index') const { createUser, + createUserAndDefaultIdentity, createUserWithPasswordAndIdentities, createUserWithPasswordAndDefaultIdentity, } = require('./helpers/users') @@ -94,20 +95,44 @@ describe('User Controller', () => { }) it('can delete an existing user', async () => { - const user = await createUser() + const { user } = await createUserAndDefaultIdentity() await deleteUser(user.id) const { result: fetchedUsers } = await getUsers() expect(fetchedUsers).toHaveLength(0) }) it('can delete multiple users', async () => { - const user1 = await createUser() - const user2 = await createUser() + const { user: user1 } = await createUserAndDefaultIdentity() + const { user: user2 } = await createUserAndDefaultIdentity() await deleteUsers([user1.id, user2.id]) const { result: fetchedUsers } = await getUsers() expect(fetchedUsers).toHaveLength(0) }) + it('can delete user identities when deleting a user', async () => { + const { user } = await createUserAndDefaultIdentity() + await deleteUser(user.id) + const { result: userIdentities } = await Identity.find({ userId: user.id }) + expect(userIdentities).toHaveLength(0) + }) + + it("can delete users' identities when deleting multiple users", async () => { + const { user: user1 } = await createUserAndDefaultIdentity() + const { user: user2 } = await createUserAndDefaultIdentity() + await deleteUsers([user1.id, user2.id]) + + const { result: identitiesUser1 } = await Identity.find({ + userId: user1.id, + }) + + const { result: identitiesUser2 } = await Identity.find({ + userId: user2.id, + }) + + expect(identitiesUser1).toHaveLength(0) + expect(identitiesUser2).toHaveLength(0) + }) + it('can update user current password', async () => { const { user } = await createUserWithPasswordAndDefaultIdentity('password1') await updatePassword(user.id, 'password1', 'password2') diff --git a/src/models/base.model.js b/src/models/base.model.js index 99d6c82493e0c41bca9dca55cbf0b808d4581137..d3a920c0e0f41ae1169fb207df4c4916a0768c84 100644 --- a/src/models/base.model.js +++ b/src/models/base.model.js @@ -298,7 +298,7 @@ class BaseModel extends PubsweetBaseModel { throw new Error(`id ${delta} not found`) } - return result.length + return result.map(u => u.id) }, { trx, diff --git a/src/models/user/user.controller.js b/src/models/user/user.controller.js index 79914d24c9e8053fe9efede230a4283061f3cb42..854bbcc71eef1d6e4a20a5e8c92e46155f7586b9 100644 --- a/src/models/user/user.controller.js +++ b/src/models/user/user.controller.js @@ -109,6 +109,12 @@ const deleteUser = async (id, options = {}) => { logger.info( `${USER_CONTROLLER} deleteUser: removing user with id ${id}`, ) + // find all identities for user + const identities = await Identity.find({ userId: id }, { trx: tr }) + const ids = identities.result.map(identity => identity.id) + // delete identities by the ids we found above + await Identity.deleteByIds(ids, { trx: tr }) + // then delete user return User.deleteById(id, { trx: tr }) }, { trx, passedTrxOnly: true }, @@ -127,6 +133,16 @@ const deleteUsers = async (ids, options = {}) => { logger.info( `${USER_CONTROLLER} deleteUser: removing users with ids ${ids}`, ) + // for each user id in ids, find related identities and delete them + await Promise.all( + ids.map(async userId => { + const identities = await Identity.find({ userId }, { trx: tr }) + + const identityIds = identities.result.map(({ id }) => id) + await Identity.deleteByIds(identityIds, { trx: tr }) + }), + ) + // then delete the users return User.deleteByIds(ids, { trx: tr }) }, { trx, passedTrxOnly: true },