From 91c8f05a404edb5db5f213438b01ab8296d75a2f Mon Sep 17 00:00:00 2001 From: petruki <31597636+petruki@users.noreply.github.com> Date: Sun, 12 May 2024 18:57:46 -0700 Subject: [PATCH] Bump switcher-client@4.1.0 --- package.json | 6 +- src/exceptions/index.js | 4 +- src/external/switcher-api-facade.js | 122 +++++++++++--------- tests/slack.test.js | 4 +- tests/unit-test/client/relay.test.js | 4 +- tests/unit-test/switcher-api-facade.test.js | 50 ++++---- 6 files changed, 99 insertions(+), 91 deletions(-) diff --git a/package.json b/package.json index 74289eb..8fd3edb 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,8 @@ "pino": "^9.0.0", "pino-pretty": "^11.0.0", "swagger-ui-express": "^5.0.0", - "switcher-client": "^4.0.3", - "validator": "^13.11.0" + "switcher-client": "^4.1.0", + "validator": "^13.12.0" }, "devDependencies": { "env-cmd": "^10.1.0", @@ -64,7 +64,7 @@ "jest-sonar-reporter": "^2.0.0", "node-notifier": "^10.0.1", "nodemon": "^3.1.0", - "sinon": "^17.0.1", + "sinon": "^17.0.2", "supertest": "^7.0.0" }, "overrides": { diff --git a/src/exceptions/index.js b/src/exceptions/index.js index 6766614..a7ab6c9 100644 --- a/src/exceptions/index.js +++ b/src/exceptions/index.js @@ -1,4 +1,4 @@ -import { Switcher } from 'switcher-client'; +import { Client } from 'switcher-client'; import Logger from '../helpers/logger.js'; export class NotFoundError extends Error { @@ -38,7 +38,7 @@ export class FeatureUnavailableError extends Error { export function responseException(res, err, code, feature = undefined) { if (feature) { - Logger.info(`Feature [${feature}]`, { log: Switcher.getLogger(feature) }); + Logger.info(`Feature [${feature}]`, { log: Client.getLogger(feature) }); } responseExceptionSilent(res, err, code, err.message); diff --git a/src/external/switcher-api-facade.js b/src/external/switcher-api-facade.js index 47fe685..02f9db3 100644 --- a/src/external/switcher-api-facade.js +++ b/src/external/switcher-api-facade.js @@ -1,4 +1,4 @@ -import { Switcher, checkValue, checkPayload, checkRegex } from 'switcher-client'; +import { Client } from 'switcher-client'; import { EnvType } from '../models/environment.js'; import { FeatureUnavailableError } from '../exceptions/index.js'; import { getDomainById, getTotalDomainsByOwner } from '../services/domain.js'; @@ -18,7 +18,7 @@ const throttle = process.env.SWITCHER_API_THROTTLE; const certPath = process.env.SSL_CERT; const component = 'switcherapi'; -Switcher.buildContext({ url, apiKey, domain: domainName, component, environment }, { logger, certPath }); +Client.buildContext({ url, apiKey, domain: domainName, component, environment }, { logger, certPath }); export const SwitcherKeys = Object.freeze({ ELEMENT_CREATION: 'ELEMENT_CREATION', @@ -36,14 +36,14 @@ function switcherFlagResult(response, message) { } } -async function checkFeature(feature, params) { - const switcher = Switcher.factory(); +function getFeatureFlag(feature) { + const switcher = Client.getSwitcher(feature); if (throttle) { switcher.throttle(throttle); } - return switcher.detail().isItOn(feature, params); + return switcher.detail(); } export async function checkDomain(req) { @@ -51,13 +51,14 @@ export async function checkDomain(req) { return; const total = await getTotalDomainsByOwner(req.admin._id); - switcherFlagResult(await checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + const featureFlag = await getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'domain', owner: req.admin._id, total - })) - ]), 'Domain limit has been reached.'); + })).isItOn(); + + switcherFlagResult(featureFlag, 'Domain limit has been reached.'); } export async function checkGroup(domain) { @@ -65,13 +66,14 @@ export async function checkGroup(domain) { return; const total = await getTotalGroupsByDomainId(domain._id); - switcherFlagResult(await checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + const featureFlag = await getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'group', owner: domain.owner, total - })) - ]), 'Group limit has been reached.'); + })).isItOn(); + + switcherFlagResult(featureFlag, 'Group limit has been reached.'); } export async function checkSwitcher(group) { @@ -80,13 +82,14 @@ export async function checkSwitcher(group) { const total = await getTotalConfigsByDomainId(group.domain); const { owner } = await getDomainById(group.domain); - switcherFlagResult(await checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + const featureFlag = await getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'switcher', owner, total - })) - ]), 'Switcher limit has been reached.'); + })).isItOn(); + + switcherFlagResult(featureFlag, 'Switcher limit has been reached.'); } export async function checkComponent(domain) { @@ -95,13 +98,14 @@ export async function checkComponent(domain) { const total = await getTotalComponentsByDomainId(domain); const { owner } = await getDomainById(domain); - switcherFlagResult(await checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + const featureFlag = await getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'component', owner, total - })) - ]), 'Component limit has been reached.'); + })).isItOn(); + + switcherFlagResult(featureFlag, 'Component limit has been reached.'); } export async function checkEnvironment(domain) { @@ -110,13 +114,14 @@ export async function checkEnvironment(domain) { const total = await getTotalEnvByDomainId(domain); const { owner } = await getDomainById(domain); - switcherFlagResult(await checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + const featureFlag = await getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'environment', owner, total - })) - ]), 'Environment limit has been reached.'); + })).isItOn(); + + switcherFlagResult(featureFlag, 'Environment limit has been reached.'); } export async function checkTeam(domain) { @@ -125,13 +130,14 @@ export async function checkTeam(domain) { const total = await getTotalTeamsByDomainId(domain); const { owner } = await getDomainById(domain); - switcherFlagResult(await checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + const featureFlag = await getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'team', owner, total - })) - ]), 'Team limit has been reached.'); + })).isItOn(); + + switcherFlagResult(featureFlag, 'Team limit has been reached.'); } export async function checkMetrics(config) { @@ -139,12 +145,11 @@ export async function checkMetrics(config) { return true; const { owner } = await getDomainById(config.domain); - const response = await checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + const response = await getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'metrics', owner - })) - ]); + })).isItOn(); if (!response.result) { if (!config.disable_metrics) { @@ -163,61 +168,62 @@ export async function checkHistory(domain) { return true; const { owner } = await getDomainById(domain); - return checkFeature(SwitcherKeys.ELEMENT_CREATION, [ - checkPayload(JSON.stringify({ + return getFeatureFlag(SwitcherKeys.ELEMENT_CREATION) + .checkPayload(JSON.stringify({ feature: 'history', owner - })) - ]); + })).isItOn(); } export async function checkAdmin(login) { if (process.env.SWITCHER_API_ENABLE != 'true') return; - switcherFlagResult( - await checkFeature(SwitcherKeys.ACCOUNT_CREATION, [ - checkValue(login) - ]), 'Account not released to use the API.'); + const featureFlag = await getFeatureFlag(SwitcherKeys.ACCOUNT_CREATION) + .checkValue(login) + .isItOn(); + + switcherFlagResult(featureFlag, 'Account not released to use the API.'); } export async function checkSlackIntegration(value) { if (process.env.SWITCHER_API_ENABLE != 'true') return; - switcherFlagResult( - await checkFeature(SwitcherKeys.SLACK_INTEGRATION, [ - checkValue(value) - ]), 'Slack Integration is not available.'); + const featureFlag = await getFeatureFlag(SwitcherKeys.SLACK_INTEGRATION) + .checkValue(value) + .isItOn(); + + switcherFlagResult(featureFlag, 'Slack Integration is not available.'); } export function notifyAcCreation(adminid) { if (process.env.SWITCHER_API_ENABLE != 'true') return; - const switcher = Switcher.factory(); - switcher.isItOn(SwitcherKeys.ACCOUNT_IN_NOTIFY, [ - checkValue(adminid)]); + Client.getSwitcher(SwitcherKeys.ACCOUNT_IN_NOTIFY) + .checkValue(adminid) + .isItOn(); } export function notifyAcDeletion(adminid) { if (process.env.SWITCHER_API_ENABLE != 'true') return; - const switcher = Switcher.factory(); - switcher.isItOn(SwitcherKeys.ACCOUNT_OUT_NOTIFY, [ - checkValue(adminid)]); + Client.getSwitcher(SwitcherKeys.ACCOUNT_OUT_NOTIFY) + .checkValue(adminid) + .isItOn(); } export async function getRateLimit(key, component) { if (process.env.SWITCHER_API_ENABLE === 'true' && key !== process.env.SWITCHER_API_KEY) { const domain = await getDomainById(component.domain); - const response = await checkFeature(SwitcherKeys.RATE_LIMIT, [ - checkValue(String(domain.owner)) - ]); + const featureFlag = await getFeatureFlag(SwitcherKeys.RATE_LIMIT) + .checkValue(String(domain.owner)) + .isItOn(); - if (response.result) { - return response.metadata.rate_limit; + if (featureFlag.result) { + return featureFlag.metadata.rate_limit; } } @@ -228,5 +234,7 @@ export async function checkHttpsAgent(value) { if (process.env.SWITCHER_API_ENABLE != 'true') return; - return checkFeature(SwitcherKeys.HTTPS_AGENT, [checkRegex(value)]); + return getFeatureFlag(SwitcherKeys.HTTPS_AGENT) + .checkRegex(value) + .isItOn(); } \ No newline at end of file diff --git a/tests/slack.test.js b/tests/slack.test.js index 33bf2b7..7557122 100644 --- a/tests/slack.test.js +++ b/tests/slack.test.js @@ -1,4 +1,4 @@ -import { Switcher } from 'switcher-client'; +import { Client } from 'switcher-client'; import mongoose from 'mongoose'; import request from 'supertest'; import jwt from 'jsonwebtoken'; @@ -79,7 +79,7 @@ describe('Slack Installation', () => { test('SLACK_SUITE - Should NOT save installation - Slack unavailable', async () => { //given process.env.SWITCHER_API_ENABLE = true; - Switcher.assume('SLACK_INTEGRATION').false(); + Client.assume('SLACK_INTEGRATION').false(); //test const response = await request(app) diff --git a/tests/unit-test/client/relay.test.js b/tests/unit-test/client/relay.test.js index 69d122a..961c729 100644 --- a/tests/unit-test/client/relay.test.js +++ b/tests/unit-test/client/relay.test.js @@ -4,7 +4,7 @@ import axios from 'axios'; import { RelayMethods } from '../../../src/models/config'; import { StrategiesType } from '../../../src/models/config-strategy'; import { EnvType } from '../../../src/models/environment'; -import { Switcher } from 'switcher-client'; +import { Client } from 'switcher-client'; describe('Testing Client Relay', () => { @@ -21,7 +21,7 @@ describe('Testing Client Relay', () => { // Given const mockRelayService = { data: { result: true, reason: 'Success' } }; axiosStub.returns(Promise.resolve(mockRelayService)); - Switcher.assume('HTTPS_AGENT').true(); + Client.assume('HTTPS_AGENT').true(); const relay = { endpoint: { diff --git a/tests/unit-test/switcher-api-facade.test.js b/tests/unit-test/switcher-api-facade.test.js index e12e28d..b682d37 100644 --- a/tests/unit-test/switcher-api-facade.test.js +++ b/tests/unit-test/switcher-api-facade.test.js @@ -27,7 +27,7 @@ import { component1, component1Key } from '../fixtures/db_api'; -import { Switcher } from 'switcher-client'; +import { Client } from 'switcher-client'; afterAll(async () => { await new Promise(resolve => setTimeout(resolve, 1000)); @@ -48,7 +48,7 @@ describe('Testing Switcher API Facade', () => { }; const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); await checkDomain(req); }; @@ -61,7 +61,7 @@ describe('Testing Switcher API Facade', () => { }; const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); await checkDomain(req); }; @@ -70,7 +70,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - Create Group', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); await checkGroup(domainDocument); }; @@ -79,7 +79,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Create Group', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); await checkGroup(domainDocument); }; @@ -88,7 +88,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - Create Switcher', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); await checkSwitcher(groupConfigDocument); }; @@ -97,7 +97,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Create Switcher', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); await checkSwitcher(groupConfigDocument); }; @@ -106,7 +106,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - Create Component', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); await checkComponent(domainId); }; @@ -115,7 +115,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Create Component', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); await checkComponent(domainId); }; @@ -124,7 +124,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - Create Environment', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); await checkEnvironment(domainId); }; @@ -133,7 +133,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Create Environment', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); await checkEnvironment(domainId); }; @@ -142,7 +142,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - Create Team', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); await checkTeam(domainId); }; @@ -151,7 +151,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Create Team', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); await checkTeam(domainId); }; @@ -160,7 +160,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - Metrics', async () => { //given - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); await checkMetrics(config1Document); //test @@ -169,7 +169,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Metrics', async () => { //given - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); await checkMetrics(config1Document); //test @@ -178,7 +178,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - History', async () => { //given - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).true(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).true(); const response = await checkHistory(domainId); //test @@ -187,7 +187,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - History', async () => { //given - Switcher.assume(SwitcherKeys.ELEMENT_CREATION).false(); + Client.assume(SwitcherKeys.ELEMENT_CREATION).false(); const response = await checkHistory(domainId); //test @@ -196,7 +196,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should enable feature - Sign up new Account', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ACCOUNT_CREATION).true(); + Client.assume(SwitcherKeys.ACCOUNT_CREATION).true(); await checkAdmin('mail@mail.com'); }; @@ -205,7 +205,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Sign up new Account', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.ACCOUNT_CREATION).false(); + Client.assume(SwitcherKeys.ACCOUNT_CREATION).false(); await checkAdmin('dev@dev.com'); }; @@ -213,18 +213,18 @@ describe('Testing Switcher API Facade', () => { }); test('UNIT_API_FACADE - Should notify external service - Account being registered', async () => { - Switcher.assume(SwitcherKeys.ACCOUNT_IN_NOTIFY).true(); + Client.assume(SwitcherKeys.ACCOUNT_IN_NOTIFY).true(); expect(notifyAcCreation(adminAccountId)).toBe(undefined); }); test('UNIT_API_FACADE - Should notify external service - Account being unregistered', async () => { - Switcher.assume(SwitcherKeys.ACCOUNT_OUT_NOTIFY).true(); + Client.assume(SwitcherKeys.ACCOUNT_OUT_NOTIFY).true(); expect(notifyAcDeletion(adminAccountId)).toBe(undefined); }); test('UNIT_API_FACADE - Should enable feature - Slack Integration', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.SLACK_INTEGRATION).true(); + Client.assume(SwitcherKeys.SLACK_INTEGRATION).true(); await checkSlackIntegration('admin_id'); }; @@ -233,7 +233,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT enable feature - Slack Integration', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.SLACK_INTEGRATION).false(); + Client.assume(SwitcherKeys.SLACK_INTEGRATION).false(); await checkSlackIntegration('admin_id'); }; @@ -242,7 +242,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should read rate limit - 100 Request Per Minute', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.RATE_LIMIT).true().withMetadata({ rate_limit: 100 }); + Client.assume(SwitcherKeys.RATE_LIMIT).true().withMetadata({ rate_limit: 100 }); return getRateLimit(component1Key, component1); }; @@ -251,7 +251,7 @@ describe('Testing Switcher API Facade', () => { test('UNIT_API_FACADE - Should NOT read rate limit - Default Request Per Minute', async () => { const call = async () => { - Switcher.assume(SwitcherKeys.RATE_LIMIT).false(); + Client.assume(SwitcherKeys.RATE_LIMIT).false(); return getRateLimit(component1Key, component1); };