serverless/lib/cli/interactive-setup/console-resolve-org.js

82 lines
2.2 KiB
JavaScript

'use strict';
const { log } = require('@serverless/utils/log');
const resolveAuthMode = require('@serverless/utils/auth/resolve-mode');
const apiRequest = require('@serverless/utils/api-request');
const promptWithHistory = require('@serverless/utils/inquirer/prompt-with-history');
const orgsChoice = async (orgs, stepHistory) =>
promptWithHistory({
message: 'What org do you want to use this service with?',
type: 'list',
name: 'orgName',
choices: [
...orgs.map((org) => ({ name: org.orgName, value: org })),
{ name: '[Skip]', value: '_skip_' },
],
stepHistory,
});
const resolveOrgs = async () => {
const { userId } = await apiRequest('/api/identity/me');
return (await apiRequest(`/api/identity/users/${userId}/orgs`)).orgs;
};
module.exports = {
async isApplicable(context) {
const { options, isConsole } = context;
if (!isConsole) {
context.inapplicabilityReasonCode = 'NON_CONSOLE_CONTEXT';
return false;
}
if (!(await resolveAuthMode())) {
context.inapplicabilityReasonCode = 'NOT_LOGGED_IN';
return false;
}
const orgs = await resolveOrgs();
const orgName = options.org;
if (!orgs.length) {
context.inapplicabilityReasonCode = 'NO_ORGS_AVAILABLE';
return false;
}
if (orgName) {
const org = orgs.find((someOrg) => someOrg.orgName === orgName);
if (org) {
context.org = org;
context.inapplicabilityReasonCode = 'RESOLVED_FROM_OPTIONS';
return false;
}
log.error(
'Passed value for "--org" doesn\'t seem to correspond to account with which ' +
"you're logged in with. Please choose applicable org"
);
return { orgs, isOrgMismatch: true };
} else if (orgs.length === 1) {
context.org = orgs[0];
context.inapplicabilityReasonCode = 'ONLY_ORG';
return false;
}
return { orgs };
},
async run(context, stepData) {
const { stepHistory } = context;
const org = await orgsChoice(stepData.orgs, stepHistory);
if (org === '_skip_') {
log.error('Console integraton aborted');
context.isConsole = false;
return;
}
context.org = org;
},
configuredQuestions: ['orgName'],
};