From bcf16562fe33640f893d87a90cab3336ed7d53d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elie=20M=C3=A9lois?= Date: Tue, 26 Mar 2019 12:57:01 +0000 Subject: [PATCH] Manage multiple pages when fetching users (#15) --- src/services/gsuite-directory.service.ts | 76 ++++++++++++++---------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/src/services/gsuite-directory.service.ts b/src/services/gsuite-directory.service.ts index 4616f5a0..ce85c1dc 100644 --- a/src/services/gsuite-directory.service.ts +++ b/src/services/gsuite-directory.service.ts @@ -67,46 +67,62 @@ export class GSuiteDirectoryService extends BaseDirectoryService implements Dire private async getUsers(): Promise { const entries: UserEntry[] = []; const query = this.createDirectoryQuery(this.syncConfig.userFilter); + let nextPageToken; + let p = Object.assign({}); - this.logService.info('Querying users.'); - let p = Object.assign({ query: query }, this.authParams); - const res = await this.service.users.list(p); - if (res.status !== 200) { - throw new Error('User list API failed: ' + res.statusText); - } + while (true) { + this.logService.info('Querying users - nextPageToken:' + nextPageToken); + p = Object.assign({ query: query, pageToken: nextPageToken }, this.authParams); + const res = await this.service.users.list(p); + if (res.status !== 200) { + throw new Error('User list API failed: ' + res.statusText); + } - const filter = this.createCustomSet(this.syncConfig.userFilter); - if (res.data.users != null) { - for (const user of res.data.users) { - if (this.filterOutResult(filter, user.primaryEmail)) { - continue; - } - - const entry = this.buildUser(user, false); - if (entry != null) { - entries.push(entry); + const filter = this.createCustomSet(this.syncConfig.userFilter); + nextPageToken = res.data.nextPageToken; + if (res.data.users != null) { + for (const user of res.data.users) { + if (this.filterOutResult(filter, user.primaryEmail)) { + continue; + } + + const entry = this.buildUser(user, false); + if (entry != null) { + entries.push(entry); + } } } + if (nextPageToken == null) { + break; + } } - this.logService.info('Querying deleted users.'); - p = Object.assign({ showDeleted: true, query: query }, this.authParams); - const delRes = await this.service.users.list(p); - if (delRes.status !== 200) { - throw new Error('Deleted user list API failed: ' + delRes.statusText); - } + nextPageToken = null; - if (delRes.data.users != null) { - for (const user of delRes.data.users) { - if (this.filterOutResult(filter, user.primaryEmail)) { - continue; - } + while (true) { + this.logService.info('Querying deleted users - nextPageToken:' + nextPageToken); + p = Object.assign({ showDeleted: true, query: query, pageToken: nextPageToken }, this.authParams); + const delRes = await this.service.users.list(p); + if (delRes.status !== 200) { + throw new Error('Deleted user list API failed: ' + delRes.statusText); + } - const entry = this.buildUser(user, true); - if (entry != null) { - entries.push(entry); + nextPageToken = delRes.data.nextPageToken; + if (delRes.data.users != null) { + for (const user of delRes.data.users) { + if (this.filterOutResult(filter, user.primaryEmail)) { + continue; + } + + const entry = this.buildUser(user, true); + if (entry != null) { + entries.push(entry); + } } } + if (nextPageToken == null) { + break; + } } return entries;