@onboardbase/cli
Version:
[](https://www.npmjs.com/package/@onboardbase/cli) [](https://www.npmjs.com/package/@onboardbase/cli) [ • 5.35 kB
JavaScript
;
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;