From 7d55b7f69bf7fcdbfa8ec9de1f21b801d8d90499 Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Thu, 28 May 2020 08:21:22 -0700 Subject: [PATCH] fix: Server error when listing memberships for group with deleted user (#1288) * fix: Server error when listing memberships for group with deleted user * PR feedback: Filter before slice --- server/api/groups.js | 6 +++++- server/api/groups.test.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/server/api/groups.js b/server/api/groups.js index 82944a6b..d3217e98 100644 --- a/server/api/groups.js +++ b/server/api/groups.js @@ -40,7 +40,11 @@ router.post('groups.list', auth(), pagination(), async ctx => { data: { groups: groups.map(presentGroup), groupMemberships: groups - .map(g => g.groupMemberships.slice(0, MAX_AVATAR_DISPLAY)) + .map(g => + g.groupMemberships + .filter(membership => !!membership.user) + .slice(0, MAX_AVATAR_DISPLAY) + ) .flat() .map(presentGroupMembership), }, diff --git a/server/api/groups.test.js b/server/api/groups.test.js index 6070eefc..9381721b 100644 --- a/server/api/groups.test.js +++ b/server/api/groups.test.js @@ -144,6 +144,33 @@ describe('#groups.list', async () => { expect(body.policies.length).toEqual(1); expect(body.policies[0].abilities.read).toEqual(true); }); + + it('should return groups when membership user is deleted', async () => { + const me = await buildUser(); + const user = await buildUser({ teamId: me.teamId }); + const group = await buildGroup({ teamId: user.teamId }); + + await group.addUser(user, { through: { createdById: me.id } }); + await group.addUser(me, { through: { createdById: me.id } }); + await user.destroy(); + + const res = await server.post('/api/groups.list', { + body: { token: me.getJwtToken() }, + }); + const body = await res.json(); + + expect(res.status).toEqual(200); + + expect(body.data['groups'].length).toEqual(1); + expect(body.data['groups'][0].id).toEqual(group.id); + + expect(body.data['groupMemberships'].length).toEqual(1); + expect(body.data['groupMemberships'][0].groupId).toEqual(group.id); + expect(body.data['groupMemberships'][0].user.id).toEqual(me.id); + + expect(body.policies.length).toEqual(1); + expect(body.policies[0].abilities.read).toEqual(true); + }); }); describe('#groups.info', async () => { @@ -273,10 +300,14 @@ describe('#groups.memberships', async () => { it('should allow filtering members in group by name', async () => { const user = await buildUser(); const user2 = await buildUser({ name: "Won't find" }); + const user3 = await buildUser({ teamId: user.teamId, name: 'Deleted' }); const group = await buildGroup({ teamId: user.teamId }); await group.addUser(user, { through: { createdById: user.id } }); await group.addUser(user2, { through: { createdById: user.id } }); + await group.addUser(user3, { through: { createdById: user.id } }); + + await user3.destroy(); const res = await server.post('/api/groups.memberships', { body: {