@cto.ai/ops
Version:
š» CTO.ai Ops - The CLI built for Teams š
116 lines (115 loc) ⢠5.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const fuzzy_1 = tslib_1.__importDefault(require("fuzzy"));
const debug_1 = tslib_1.__importDefault(require("debug"));
const sdk_1 = require("@cto.ai/sdk");
const utils_1 = require("../utils");
const CustomErrors_1 = require("../errors/CustomErrors");
const debug = debug_1.default('ops:SecretService');
const { bold, callOutCyan, multiBlue, reset, whiteBright } = 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 ${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 sdk_1.ux.prompt({
type: 'autocomplete',
name: 'selectedSecret',
pageSize: 5,
message: 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 = 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;