UNPKG

@cto.ai/ops

Version:

šŸ’» CTO.ai - The CLI built for Teams šŸš€

117 lines (116 loc) • 5.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SecretService = void 0; const tslib_1 = require("tslib"); const fuzzy_1 = tslib_1.__importDefault(require("fuzzy")); const debug_1 = tslib_1.__importDefault(require("debug")); const cli_sdk_1 = require("@cto.ai/cli-sdk"); const utils_1 = require("./../utils"); const CustomErrors_1 = require("./../errors/CustomErrors"); const debug = (0, debug_1.default)('ops:SecretService'); const { bold, callOutCyan, multiBlue, reset, whiteBright } = cli_sdk_1.ux.colors; class SecretService { constructor() { this.secrets = []; this.getApiSecretsList = async (inputs) => { const { team, tokens } = inputs.config; try { const { api } = inputs; const { data } = await api.find(`/private/teams/${team.name}/secrets`, { headers: { Authorization: tokens.accessToken, }, }); let { secrets, storageEngine } = data[0]; return Object.assign(Object.assign({}, inputs), { secrets, storageEngine }); } catch (err) { debug('error: %O', err); switch (err.error[0].code) { case 204: throw new CustomErrors_1.NoSecretsOnTeam(err); case 400: throw new CustomErrors_1.InvalidSecretVault(err); case 401: throw new CustomErrors_1.TeamUnauthorized('Team not authorized when fetching the secrets list'); case 403: if (err.error[0].message.includes('invalid secret token')) { throw new CustomErrors_1.InvalidSecretToken(err); } else { throw new CustomErrors_1.NoSecretsProviderFound(err); } case 404: throw new CustomErrors_1.NoTeamFound(team.name); default: throw new CustomErrors_1.NoSecretsProviderFound(err); } } }; this.checkDataList = async (inputs) => { if (inputs.secrets.length !== 0) return inputs; const { config: { team: { name }, }, storageEngine, } = inputs; console.log(whiteBright(`\nšŸ˜ž No secrets found for team ${multiBlue(name)} stored with ${multiBlue(storageEngine)}.\n Try again or run ${(0, utils_1.terminalText)('ops team:switch')} to switch your current team. \n`)); process.exit(); }; this.secretKeyListSelectorPrompt = async (inputs) => { const { config: { team }, storageEngine, } = inputs; console.log(bold(callOutCyan(` Listing all secrets for team ${multiBlue(team.name)} stored with ${multiBlue(storageEngine)} ${reset.green('→')}`))); // Mantaining this one because of the Fuzzy filter, that I was not able to make it work with params this.secrets = inputs.secrets; const { selectedSecret } = await cli_sdk_1.ux.prompt({ type: 'autocomplete', name: 'selectedSecret', pageSize: 5, message: cli_sdk_1.ux.colors.reset.dim('šŸ” Search:'), source: this._autocompleteSearchList.bind(this), }); return Object.assign(Object.assign({}, inputs), { selectedSecret }); }; this.checkForSecretProviderErrors = async (api, config) => { try { await this.getApiSecretsList({ api, config, secrets: [], selectedSecret: '', }); } catch (err) { return err; } return undefined; }; this._autocompleteSearchList = async (_, searchQuery = '') => { const { list, options } = this.fuzzyFilterParamsList(); const fuzzyResult = fuzzy_1.default.filter(searchQuery, list, options); return fuzzyResult.map(result => result.original); }; this.fuzzyFilterParamsList = () => { const list = this.secrets.map(secret => { return { name: secret, value: secret, }; }); const options = { extract: el => el.name }; return { list, options }; }; } async runListPipeline(config, api) { try { const secretsListPipeline = (0, utils_1.asyncPipe)(this.getApiSecretsList, this.checkDataList, this.secretKeyListSelectorPrompt); const results = await secretsListPipeline({ config, api, }); return results; } catch (err) { debug('%O', err); throw err; } } } exports.SecretService = SecretService;