1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const tslib_1 = require("tslib");
|
4 | const sdk_1 = require("@cto.ai/sdk");
|
5 | const base_1 = tslib_1.__importDefault(require("../../base"));
|
6 | const utils_1 = require("../../utils");
|
7 | const CustomErrors_1 = require("../../errors/CustomErrors");
|
8 | const { white, reset } = sdk_1.ux.colors;
|
9 | class SecretsRegister extends base_1.default {
|
10 | constructor() {
|
11 | super(...arguments);
|
12 | this.validateRegisterInput = async (input) => {
|
13 | try {
|
14 | if (!input) {
|
15 | return `š Sorry, the value cannot be empty`;
|
16 | }
|
17 | return true;
|
18 | }
|
19 | catch (err) {
|
20 | throw new CustomErrors_1.InvalidTeamNameFormat(err);
|
21 | }
|
22 | };
|
23 | this.promptForSecretsProviderCredentials = async (team) => {
|
24 | const { url, token } = await sdk_1.ux.prompt([
|
25 | {
|
26 | type: 'input',
|
27 | name: 'url',
|
28 | 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('ā')}`,
|
29 | afterMessage: `${reset.green('ā')} URL `,
|
30 | validate: this.validateRegisterInput.bind(this),
|
31 | },
|
32 | {
|
33 | type: 'password',
|
34 | name: 'token',
|
35 | message: `\nš Register secret storage access token ${reset.green('ā')} \n${white('Enter access token:')} `,
|
36 | afterMessage: `${reset.green('ā')} TOKEN ${reset.grey('********')} \nš Secrets registration complete!`,
|
37 | validate: this.validateRegisterInput.bind(this),
|
38 | },
|
39 | ]);
|
40 | return { activeTeam: team, url, token };
|
41 | };
|
42 | this.registerSecretsProvider = async (inputs) => {
|
43 | try {
|
44 | await this.services.api.create(`/private/teams/${inputs.activeTeam.name}/secrets/register`, {
|
45 | token: inputs.token,
|
46 | url: inputs.url,
|
47 | }, {
|
48 | headers: {
|
49 | Authorization: this.accessToken,
|
50 | },
|
51 | });
|
52 | return inputs;
|
53 | }
|
54 | catch (err) {
|
55 | this.debug('%O', err);
|
56 | switch (err.error[0].code) {
|
57 | case 400:
|
58 | throw new CustomErrors_1.InvalidSecretVault(err);
|
59 | case 401:
|
60 | throw new CustomErrors_1.UserUnauthorized(err);
|
61 | case 403:
|
62 | throw new CustomErrors_1.InvalidSecretToken(err);
|
63 | case 404:
|
64 | throw new CustomErrors_1.NoTeamFound(inputs.activeTeam.name);
|
65 | default:
|
66 | throw new CustomErrors_1.RegisterSecretsProvider(err);
|
67 | }
|
68 | }
|
69 | };
|
70 | this.sendAnalytics = (state) => async () => {
|
71 | const { team } = state.config;
|
72 | const { email, username } = state.config.user;
|
73 | this.services.analytics.track({
|
74 | userId: email,
|
75 | teamId: team.id,
|
76 | cliEvent: 'Ops CLI Register Secrets Provider',
|
77 | event: 'Ops CLI Register Secrets Provider',
|
78 | properties: {
|
79 | email,
|
80 | username,
|
81 | },
|
82 | }, this.accessToken);
|
83 | };
|
84 | }
|
85 | async run() {
|
86 | try {
|
87 | await this.isLoggedIn();
|
88 | const switchPipeline = utils_1.asyncPipe(this.promptForSecretsProviderCredentials, this.registerSecretsProvider, this.sendAnalytics(this.state));
|
89 | await switchPipeline(this.state.config.team);
|
90 | }
|
91 | catch (err) {
|
92 | this.debug('%O', err);
|
93 | this.config.runHook('error', { err, accessToken: this.accessToken });
|
94 | }
|
95 | }
|
96 | }
|
97 | exports.default = SecretsRegister;
|
98 | SecretsRegister.description = 'Register a secrets provider for a team';
|