diff --git a/packages/contentstack-config/src/interfaces/index.ts b/packages/contentstack-config/src/interfaces/index.ts index 2fa8115de0..9cff3cc608 100644 --- a/packages/contentstack-config/src/interfaces/index.ts +++ b/packages/contentstack-config/src/interfaces/index.ts @@ -20,19 +20,15 @@ export interface Region { launchHubUrl: string; } +export interface Limit { + value: number; + utilize: number; +} + export interface RateLimitConfig { - getLimit?: { - value: number; - utilize: number; - }; - limit?: { - value: number; - utilize: number; - }; - bulkLimit?: { - value: number; - utilize: number; - }; + getLimit?: Limit; + limit?: Limit + bulkLimit?: Limit } export interface SetRateLimitConfig { diff --git a/packages/contentstack-config/src/utils/rate-limit-handler.ts b/packages/contentstack-config/src/utils/rate-limit-handler.ts index 4593e3faba..37ee116525 100644 --- a/packages/contentstack-config/src/utils/rate-limit-handler.ts +++ b/packages/contentstack-config/src/utils/rate-limit-handler.ts @@ -1,5 +1,6 @@ import { cliux, configHandler } from '@contentstack/cli-utilities'; import { limitNamesConfig, defaultRalteLimitConfig } from '../utils/common-utilities'; +import { Limit } from '../interfaces'; let client: any; @@ -13,7 +14,7 @@ export class RateLimitHandler { rateLimit.default = { ...defaultRalteLimitConfig }; if (config.default) { - rateLimit[config.org] = { ...defaultRalteLimitConfig }; + rateLimit[config.org] = { ...rateLimit.default }; configHandler.set('rateLimit', rateLimit); cliux.success(`Rate limit reset to default for org: ${config.org}`); return; @@ -24,34 +25,46 @@ export class RateLimitHandler { } const limitNames = Array.isArray(config['limit-name']) ? config['limit-name'] : []; const utilizeValues = Array.isArray(config.utilize) ? config.utilize.map((v) => Number(v)) : []; + const unavailableLimits = []; try { const organizations = await client.organization(config.org).fetch({ include_plan: true }); const features = organizations.plan?.features || []; - const limitsToUpdate = { ...rateLimit[config.org] }; - let index = 0; + const limitsToUpdate: { [key: string]: Limit } = { ...rateLimit[config.org] }; + let utilizationMap = {}; + limitNames.forEach((name, index) => { + if (utilizeValues[index] !== undefined) { + utilizationMap[name] = utilizeValues[index]; + } + }); + limitNamesConfig.forEach((limitName) => { const feature = features.find((f: { uid: string }) => f.uid === limitName); if (feature) { - if (limitNames.includes(limitName)) { - limitsToUpdate[limitName] = { - value: feature.limit || rateLimit[config.org][limitName]?.value || rateLimit.default[limitName]?.value, - utilize: utilizeValues[index] || defaultRalteLimitConfig[limitName]?.utilize, - }; - index++; - } else { - limitsToUpdate[limitName] = { - value: feature.limit, - utilize: defaultRalteLimitConfig[limitName]?.utilize, - }; - } + limitsToUpdate[limitName] = { + value: feature.limit || rateLimit[config.org][limitName]?.value || rateLimit.default[limitName]?.value, + utilize: utilizationMap[limitName] || defaultRalteLimitConfig[limitName]?.utilize, + }; + } else { + unavailableLimits.push(limitName); } }); + if (unavailableLimits.length > 0) { + cliux.print(`You have not subscribed to these limits: ${unavailableLimits.join(', ')}`, { + color: 'yellow', + }); + } rateLimit[config.org] = limitsToUpdate; configHandler.set('rateLimit', rateLimit); cliux.success(`Rate limit has been set successfully for org: ${config.org}`); + + Object.entries(limitsToUpdate).forEach(([limit, { value, utilize }]) => { + if (!unavailableLimits.includes(limit)) { + cliux.success(`${limit}: ${value}(${utilize}%)`); + } + }); } catch (error) { throw new Error(error); }