From 5d3fa0a0d2d355fdc87e2d89f883c20bbfe5f215 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 11 Jun 2021 11:10:29 -0500 Subject: [PATCH] Improve okta group performance (#132) * Avoid unnecessary API calls to Okta Filter excluded/included groups as early as possible to avoid using up API calls and long waits * Remove console timing calls --- src/services/okta-directory.service.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/services/okta-directory.service.ts b/src/services/okta-directory.service.ts index f6a79aaf..4f80d6f5 100644 --- a/src/services/okta-directory.service.ts +++ b/src/services/okta-directory.service.ts @@ -14,9 +14,12 @@ import { LogService } from 'jslib-common/abstractions/log.service'; import * as https from 'https'; +const DelayBetweenBuildGroupCallsInMilliseconds = 500; + export class OktaDirectoryService extends BaseDirectoryService implements IDirectoryService { private dirConfig: OktaConfiguration; private syncConfig: SyncConfiguration; + private lastBuildGroupCall: number; constructor(private configurationService: ConfigurationService, private logService: LogService, private i18nService: I18nService) { @@ -116,13 +119,11 @@ export class OktaDirectoryService extends BaseDirectoryService implements IDirec this.logService.info('Querying groups.'); await this.apiGetMany('groups?filter=' + this.encodeUrlParameter(oktaFilter)).then(async (groups: any[]) => { - for (const group of groups) { + for (const group of groups.filter(g => !this.filterOutResult(setFilter, g.profile.name))) { const entry = await this.buildGroup(group); - if (entry != null && !this.filterOutResult(setFilter, entry.name)) { + if (entry != null) { entries.push(entry); } - // throttle some to avoid rate limiting - await new Promise(resolve => setTimeout(resolve, 500)); } }); return entries; @@ -134,6 +135,14 @@ export class OktaDirectoryService extends BaseDirectoryService implements IDirec entry.referenceId = group.id; entry.name = group.profile.name; + // throttle some to avoid rate limiting + const neededDelay = DelayBetweenBuildGroupCallsInMilliseconds - (Date.now() - this.lastBuildGroupCall); + if (neededDelay > 0) { + await new Promise(resolve => + setTimeout(resolve, neededDelay)); + } + this.lastBuildGroupCall = Date.now(); + await this.apiGetMany('groups/' + group.id + '/users').then((users: any[]) => { for (const user of users) { entry.userMemberExternalIds.add(user.id);