UNPKG

@onboardbase/cli

Version:

[![Version](https://img.shields.io/npm/v/@onboardbase/cli.svg)](https://www.npmjs.com/package/@onboardbase/cli) [![Downloads/week](https://img.shields.io/npm/dw/@onboardbase/cli.svg)](https://www.npmjs.com/package/@onboardbase/cli) [![License](https://img

106 lines (105 loc) 5.35 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ShareCommandService = void 0; const chalk = require("chalk"); const inquirer = require("inquirer"); const base_service_1 = require("../common/base.service"); const secrets_1 = require("./secrets"); const socket_service_1 = require("./socket.service"); const access_manager_1 = require("./access-manager"); const errors_1 = require("../common/errors"); const unauthorized_error_1 = require("../common/errors/unauthorized.error"); const crypto_1 = require("../common/utils/crypto"); class ShareCommandService extends base_service_1.BaseService { constructor(configManager) { super(configManager); this.secretService = new secrets_1.SecretsService(configManager); this.socketService = new socket_service_1.SocketService(configManager); this.accessManager = new access_manager_1.AccessManager(configManager); } async initialize({ args, flags }) { const { project } = flags; const localSecrets = this.secretService.generateEnvs({}); if (!Object.keys(localSecrets).length || Object.keys(localSecrets).length === 0) { throw new errors_1.BadConfigError("You dont have any local secret to share"); } const currentProject = project !== null && project !== void 0 ? project : this.configManager.getFromProject("project"); const currentEnvironment = this.configManager.getFromProject("environment") || "development"; if (!currentProject) throw new errors_1.BadConfigError("Please specify a project to share to"); const { accessToken, user: currentUser } = await this.accessManager.getAuthInfoFromDeviceToken(this.getConfigForCurrentScope("token")); const user = await this.httpInstance.getCurrentUser(accessToken); const paymentTier = user.defaultTeam.paymentTier; if (paymentTier.tier === "FREE" || paymentTier.tier === "STARTUP") { throw new unauthorized_error_1.UnauthorizedError("You cannot share secrets between teammates. Please upgrade to a higher tier or contact an admin."); } const teammates = await this.httpInstance.fetchProjectTeammates(currentProject, accessToken); const teamMateExist = teammates.generalProjects.list[0].team.users.list.filter((user) => user.user.email !== currentUser.email); if (!teamMateExist.length) { throw new errors_1.BadInputError("You dont have any teammate to share secrets with. Visit app.onboardbase.com to create a teammate now"); } const { selectedLocalSecrets } = await inquirer.prompt([ { name: "selectedLocalSecrets", type: "checkbox", message: "Select a secret to share", choices: Object.keys(localSecrets).map((key) => `${key}/${localSecrets[key]}`), }, ]); const { userEmail } = await inquirer.prompt([ { name: "userEmail", type: "list", message: "Select a team mate to share with", choices: teammates.generalProjects.list[0].team.users.list .filter((user) => user.user.email !== currentUser.email) .map((user) => { return `${user.user.name} => ${user.user.email}`; }), }, ]); const userStringArray = userEmail.split(" "); const receiverEmail = userStringArray[userStringArray.length - 1]; const receiverInfo = teammates.generalProjects.list[0].team.users.list.find(({ user }) => user.email === receiverEmail); const stringifiedSecrets = await Promise.all(selectedLocalSecrets.map(async (localSecret) => { const secret = { key: localSecret.split("/")[0].trim(), value: localSecret.split("/")[1].trim(), }; secret.key = await (0, crypto_1.encryptPlainText)({ plainText: secret.key, passphrase: currentUser.email, }); secret.value = await (0, crypto_1.encryptPlainText)({ plainText: secret.value, passphrase: currentUser.email, }); return secret; })); await this.httpInstance.createShareLogs({ receiverEmail: receiverInfo.user.email, receiverId: receiverInfo.user.id, senderEmail: currentUser.email, senderId: currentUser.id, secrets: stringifiedSecrets, accessToken, }); const socket = this.socketService.createSocketInstance({ project: currentProject, environment: currentEnvironment, userEmail: currentUser.email, }); // Share secret to user on their unique share channel socket.emit(`SHARE_LOCAL`, { project: currentProject, environment: currentEnvironment, email: currentUser.email, secrets: stringifiedSecrets, }); console.log(`${chalk.green("√")} You just shared ${chalk.bold(chalk.green(`${selectedLocalSecrets.join(", ")} with ${userEmail}`))}`); socket.disconnect(); socket.close(); } } exports.ShareCommandService = ShareCommandService;