@cto.ai/ops
Version:
š» CTO.ai Ops - The CLI built for Teams š
99 lines (98 loc) ⢠4.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const sdk_1 = require("@cto.ai/sdk");
const base_1 = tslib_1.__importDefault(require("../../base"));
const utils_1 = require("../../utils");
const CustomErrors_1 = require("../../errors/CustomErrors");
const { white, reset } = sdk_1.ux.colors;
class SecretsRegister extends base_1.default {
constructor() {
super(...arguments);
this.validateRegisterInput = async (input) => {
try {
if (!input) {
return `š Sorry, the value cannot be empty`;
}
return true;
}
catch (err) {
throw new CustomErrors_1.InvalidTeamNameFormat(err);
}
};
this.promptForSecretsProviderCredentials = async (team) => {
const { url, token } = await sdk_1.ux.prompt([
{
type: 'input',
name: 'url',
message: `\nš Register your secret storage to share secrets and passwords with team ${reset.blueBright(`${team.name}`)} \n${reset.grey('Enter your secret storage')} ${reset.blue('url')} ${reset.grey('and')} ${reset.blue('access token.')}\n${reset.grey(`Run ${utils_1.terminalText('ops team:switch')}`)} ${reset.grey('to change the team for')} ${reset.grey('the secret storage registration.')}\n${white('Link your secret storage to your team')} ${reset.green('ā')}`,
afterMessage: `${reset.green('ā')} URL `,
validate: this.validateRegisterInput.bind(this),
},
{
type: 'password',
name: 'token',
message: `\nš Register secret storage access token ${reset.green('ā')} \n${white('Enter access token:')} `,
afterMessage: `${reset.green('ā')} TOKEN ${reset.grey('********')} \nš Secrets registration complete!`,
validate: this.validateRegisterInput.bind(this),
},
]);
return { activeTeam: team, url, token };
};
this.registerSecretsProvider = async (inputs) => {
try {
await this.services.api.create(`/private/teams/${inputs.activeTeam.name}/secrets/register`, {
token: inputs.token,
url: inputs.url,
}, {
headers: {
Authorization: this.accessToken,
},
});
return inputs;
}
catch (err) {
this.debug('%O', err);
switch (err.error[0].code) {
case 400:
throw new CustomErrors_1.InvalidSecretVault(err);
case 401:
throw new CustomErrors_1.UserUnauthorized(err);
case 403:
throw new CustomErrors_1.InvalidSecretToken(err);
case 404:
throw new CustomErrors_1.NoTeamFound(inputs.activeTeam.name);
default:
throw new CustomErrors_1.RegisterSecretsProvider(err);
}
}
};
this.sendAnalytics = (state) => async () => {
const { team } = state.config;
const { email, username } = state.config.user;
this.services.analytics.track({
userId: email,
teamId: team.id,
cliEvent: 'Ops CLI Register Secrets Provider',
event: 'Ops CLI Register Secrets Provider',
properties: {
email,
username,
},
}, this.accessToken);
};
}
async run() {
try {
await this.isLoggedIn();
const switchPipeline = utils_1.asyncPipe(this.promptForSecretsProviderCredentials, this.registerSecretsProvider, this.sendAnalytics(this.state));
await switchPipeline(this.state.config.team);
}
catch (err) {
this.debug('%O', err);
this.config.runHook('error', { err, accessToken: this.accessToken });
}
}
}
exports.default = SecretsRegister;
SecretsRegister.description = 'Register a secrets provider for a team';