diff --git a/packages/@n8n/db/src/repositories/user.repository.ts b/packages/@n8n/db/src/repositories/user.repository.ts index 0e44aefbe6..c2f4bb42d2 100644 --- a/packages/@n8n/db/src/repositories/user.repository.ts +++ b/packages/@n8n/db/src/repositories/user.repository.ts @@ -247,10 +247,11 @@ export class UserRepository extends Repository { for (const sort of sortBy) { const [field, order] = sort.split(':'); if (field === 'role') { - queryBuilder.addOrderBy( + queryBuilder.addSelect( "CASE WHEN user.role='global:owner' THEN 0 WHEN user.role='global:admin' THEN 1 ELSE 2 END", - order.toUpperCase() as 'ASC' | 'DESC', + 'userroleorder', ); + queryBuilder.addOrderBy('userroleorder', order.toUpperCase() as 'ASC' | 'DESC'); } else { queryBuilder.addOrderBy(`user.${field}`, order.toUpperCase() as 'ASC' | 'DESC'); } @@ -265,8 +266,8 @@ export class UserRepository extends Repository { take: number, skip: number | undefined, ): SelectQueryBuilder { - if (take >= 0) queryBuilder.limit(take); - if (skip) queryBuilder.offset(skip); + if (take >= 0) queryBuilder.take(take); + if (skip) queryBuilder.skip(skip); return queryBuilder; } diff --git a/packages/cli/test/integration/users.api.test.ts b/packages/cli/test/integration/users.api.test.ts index 11d5206092..668082e1d1 100644 --- a/packages/cli/test/integration/users.api.test.ts +++ b/packages/cli/test/integration/users.api.test.ts @@ -42,6 +42,7 @@ const testServer = utils.setupTestServer({ describe('GET /users', () => { let owner: User; let member1: User; + let member2: User; let ownerAgent: SuperAgentTest; let userRepository: UserRepository; @@ -63,7 +64,7 @@ describe('GET /users', () => { lastName: 'Member1LastName', mfaEnabled: true, }); - await createUser({ + member2 = await createUser({ role: 'global:member', email: 'member2@n8n.io', firstName: 'Member2FirstName', @@ -77,6 +78,10 @@ describe('GET /users', () => { mfaEnabled: true, }); + for (let i = 0; i < 10; i++) { + await createTeamProject(`project${i}`, member1); + } + ownerAgent = testServer.authAgentFor(owner); }); @@ -435,6 +440,18 @@ describe('GET /users', () => { response.body.data.items.forEach(validateUser); }); + test('should return all users with large enough take', async () => { + const response = await ownerAgent + .get('/users') + .query('take=5&expand[]=projectRelations&sortBy[]=role:desc') + .expect(200); + + expect(response.body.data.count).toBe(4); + expect(response.body.data.items).toHaveLength(4); + + response.body.data.items.forEach(validateUser); + }); + test('should return all users with negative take', async () => { const users: User[] = []; @@ -488,12 +505,12 @@ describe('GET /users', () => { describe('expand', () => { test('should expand on team projects', async () => { const project = await createTeamProject('Test Project'); - await linkUserToProject(member1, project, 'project:admin'); + await linkUserToProject(member2, project, 'project:admin'); const response = await ownerAgent .get('/users') .query( - `filter={ "email": "${member1.email}" }&select[]=firstName&take=1&expand[]=projectRelations&sortBy[]=role:asc`, + `filter={ "email": "${member2.email}" }&select[]=firstName&take=1&expand[]=projectRelations&sortBy[]=role:asc`, ) .expect(200);