UNPKG

vtex

Version:

The platform for e-commerce apps

89 lines (88 loc) 3.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const axios_1 = tslib_1.__importDefault(require("axios")); const chalk_1 = tslib_1.__importDefault(require("chalk")); const enquirer_1 = tslib_1.__importDefault(require("enquirer")); const jsonwebtoken_1 = tslib_1.__importDefault(require("jsonwebtoken")); const ramda_1 = require("ramda"); const env = tslib_1.__importStar(require("../../api/env")); const Headers_1 = require("../../lib/constants/Headers"); const SessionManager_1 = require("../../api/session/SessionManager"); const logger_1 = tslib_1.__importDefault(require("../../api/logger")); const getAvailableRoles = async (token, supportedAccount) => { const { account, workspace } = SessionManager_1.SessionManager.getSingleton(); const response = await axios_1.default.get(`https://app.io.vtex.com/vtex.support-authority/v0/${account}/${workspace}/${supportedAccount}/roles`, { headers: { Authorization: token, [Headers_1.Headers.VTEX_ORIGINAL_CREDENTIAL]: token, ...(env.cluster() ? { [Headers_1.Headers.VTEX_UPSTREAM_TARGET]: env.cluster() } : null), }, }); return response.data; }; const promptRoles = async (roles) => { const cancel = 'Cancel'; const chosen = ramda_1.prop('role', await enquirer_1.default.prompt({ name: 'role', message: 'Which role do you want to assume?', type: 'select', choices: [...roles, cancel], })); if (chosen === cancel) { logger_1.default.info('Bye! o/'); return process.exit(); } return chosen; }; const loginAsRole = async (token, supportedAccount, role) => { const { account, workspace } = SessionManager_1.SessionManager.getSingleton(); const response = await axios_1.default.get(`https://app.io.vtex.com/vtex.support-authority/v0/${account}/${workspace}/${supportedAccount}/login/${role}`, { headers: { Authorization: token, [Headers_1.Headers.VTEX_ORIGINAL_CREDENTIAL]: token, ...(env.cluster() ? { [Headers_1.Headers.VTEX_UPSTREAM_TARGET]: env.cluster() } : null), }, }); return response.data; }; const assertToken = (raw) => { if (!jsonwebtoken_1.default.decode(raw)) { throw Error(`Could not validate new token! token = '${raw}'`); } }; const saveSupportCredentials = (account, token) => { const session = SessionManager_1.SessionManager.getSingleton(); session.DEPRECATEDchangeAccount(account); session.workspaceSwitch({ targetWorkspace: 'master' }); session.DEPRECATEDchangeToken(token); }; exports.default = async (account) => { if (!account) { logger_1.default.error(`Please specify the account that will receive support. type vtex --help for more information.`); return; } const actualToken = SessionManager_1.SessionManager.getSingleton().token; try { const roles = await getAvailableRoles(actualToken, account); if (roles.length === 0) { logger_1.default.error('No support roles available for this account.'); return; } const role = await promptRoles(roles); const newToken = await loginAsRole(actualToken, account, role); assertToken(newToken); saveSupportCredentials(account, newToken); logger_1.default.info(`Logged into ${chalk_1.default.blue(account)} with role ${role}!`); } catch (err) { if (err.message) { logger_1.default.error(err.message); if (err.response && err.response.status === 404) { logger_1.default.info('Make sure vtex.support-authority is installed in your workspace.'); } return; } logger_1.default.error(err); } };