fix: Suspended users showing in group and collection member management (#1302)
* fix: Suspended users showing in group and collection member management * test
This commit is contained in:
@ -40,6 +40,10 @@ class People extends React.Component<Props> {
|
||||
this.inviteModalOpen = false;
|
||||
};
|
||||
|
||||
fetchPage = params => {
|
||||
return this.props.users.fetchPage({ ...params, includeSuspended: true });
|
||||
};
|
||||
|
||||
render() {
|
||||
const { auth, policies, match } = this.props;
|
||||
const { filter } = match.params;
|
||||
@ -110,7 +114,7 @@ class People extends React.Component<Props> {
|
||||
<PaginatedList
|
||||
items={users}
|
||||
empty={<Empty>No people to see here.</Empty>}
|
||||
fetch={this.props.users.fetchPage}
|
||||
fetch={this.fetchPage}
|
||||
renderItem={item => (
|
||||
<UserListItem
|
||||
key={item.id}
|
||||
|
@ -25,6 +25,11 @@ export default class UsersStore extends BaseStore<User> {
|
||||
return filter(this.orderedData, user => user.isSuspended);
|
||||
}
|
||||
|
||||
@computed
|
||||
get activeOrInvited(): User[] {
|
||||
return filter(this.orderedData, user => !user.isSuspended);
|
||||
}
|
||||
|
||||
@computed
|
||||
get invited(): User[] {
|
||||
return filter(this.orderedData, user => !user.lastActiveAt);
|
||||
@ -81,7 +86,10 @@ export default class UsersStore extends BaseStore<User> {
|
||||
member => member.collectionId === collectionId
|
||||
);
|
||||
const userIds = memberships.map(member => member.userId);
|
||||
const users = filter(this.orderedData, user => !userIds.includes(user.id));
|
||||
const users = filter(
|
||||
this.activeOrInvited,
|
||||
user => !userIds.includes(user.id)
|
||||
);
|
||||
|
||||
if (!query) return users;
|
||||
return queriedUsers(users, query);
|
||||
@ -93,7 +101,9 @@ export default class UsersStore extends BaseStore<User> {
|
||||
member => member.collectionId === collectionId
|
||||
);
|
||||
const userIds = memberships.map(member => member.userId);
|
||||
const users = filter(this.orderedData, user => userIds.includes(user.id));
|
||||
const users = filter(this.activeOrInvited, user =>
|
||||
userIds.includes(user.id)
|
||||
);
|
||||
|
||||
if (!query) return users;
|
||||
return queriedUsers(users, query);
|
||||
@ -105,7 +115,10 @@ export default class UsersStore extends BaseStore<User> {
|
||||
member => member.groupId === groupId
|
||||
);
|
||||
const userIds = memberships.map(member => member.userId);
|
||||
const users = filter(this.orderedData, user => !userIds.includes(user.id));
|
||||
const users = filter(
|
||||
this.activeOrInvited,
|
||||
user => !userIds.includes(user.id)
|
||||
);
|
||||
|
||||
if (!query) return users;
|
||||
return queriedUsers(users, query);
|
||||
@ -117,7 +130,9 @@ export default class UsersStore extends BaseStore<User> {
|
||||
member => member.groupId === groupId
|
||||
);
|
||||
const userIds = groupMemberships.map(member => member.userId);
|
||||
const users = filter(this.orderedData, user => userIds.includes(user.id));
|
||||
const users = filter(this.activeOrInvited, user =>
|
||||
userIds.includes(user.id)
|
||||
);
|
||||
|
||||
if (!query) return users;
|
||||
return queriedUsers(users, query);
|
||||
|
@ -21,13 +21,22 @@ const { authorize } = policy;
|
||||
const router = new Router();
|
||||
|
||||
router.post('users.list', auth(), pagination(), async ctx => {
|
||||
const { query } = ctx.body;
|
||||
const { query, includeSuspended = false } = ctx.body;
|
||||
const user = ctx.state.user;
|
||||
|
||||
let where = {
|
||||
teamId: user.teamId,
|
||||
};
|
||||
|
||||
if (!includeSuspended) {
|
||||
where = {
|
||||
...where,
|
||||
suspendedAt: {
|
||||
[Op.eq]: null,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if (query) {
|
||||
where = {
|
||||
...where,
|
||||
|
@ -14,6 +14,13 @@ describe('#users.list', async () => {
|
||||
it('should allow filtering by user name', async () => {
|
||||
const user = await buildUser({ name: 'Tester' });
|
||||
|
||||
// suspended user should not be returned
|
||||
await buildUser({
|
||||
name: 'Tester',
|
||||
teamId: user.teamId,
|
||||
suspendedAt: new Date(),
|
||||
});
|
||||
|
||||
const res = await server.post('/api/users.list', {
|
||||
body: {
|
||||
query: 'test',
|
||||
@ -27,6 +34,27 @@ describe('#users.list', async () => {
|
||||
expect(body.data[0].id).toEqual(user.id);
|
||||
});
|
||||
|
||||
it('should allow including suspended', async () => {
|
||||
const user = await buildUser({ name: 'Tester' });
|
||||
await buildUser({
|
||||
name: 'Tester',
|
||||
teamId: user.teamId,
|
||||
suspendedAt: new Date(),
|
||||
});
|
||||
|
||||
const res = await server.post('/api/users.list', {
|
||||
body: {
|
||||
query: 'test',
|
||||
includeSuspended: true,
|
||||
token: user.getJwtToken(),
|
||||
},
|
||||
});
|
||||
const body = await res.json();
|
||||
|
||||
expect(res.status).toEqual(200);
|
||||
expect(body.data.length).toEqual(2);
|
||||
});
|
||||
|
||||
it('should return teams paginated user list', async () => {
|
||||
const { admin, user } = await seed();
|
||||
|
||||
|
Reference in New Issue
Block a user