forest-cli
Version:
The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.
123 lines • 11.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("@oclif/core");
const abstract_authenticated_command_1 = __importDefault(require("../../abstract-authenticated-command"));
const invitation_manager_1 = __importDefault(require("../../services/invitation-manager"));
const role_manager_1 = __importDefault(require("../../services/role-manager"));
const team_manager_1 = __importDefault(require("../../services/team-manager"));
const with_current_project_1 = __importDefault(require("../../services/with-current-project"));
const PERMISSION_LEVELS = ['admin', 'editor', 'user', 'developer', 'manager'];
class UsersInviteCommand extends abstract_authenticated_command_1.default {
constructor(argv, config, plan) {
super(argv, config, plan);
const { assertPresent, env, inquirer } = this.context;
assertPresent({ env, inquirer });
this.env = env;
this.inquirer = inquirer;
}
// Resolve a team/role by name (headless when passed as a flag), with the
// same UX as project selection: auto-pick when there is only one, prompt
// when several and none provided, clear error listing the valid names.
async resolveByName(entities, providedName, label, emptyHint) {
if (providedName) {
const match = entities.find(entity => entity.name === providedName);
if (match)
return match;
const available = entities.map(entity => entity.name).join(', ') || '(none)';
this.logger.error(`${label} "${providedName}" not found in this project. Available: ${available}.`);
return this.exit(1);
}
if (!entities.length) {
this.logger.error(`No ${label} found in this project.${emptyHint ? ` ${emptyHint}` : ''}`);
return this.exit(1);
}
if (entities.length === 1)
return entities[0];
const { choice } = await this.inquirer.prompt([
{
name: 'choice',
message: `Select a ${label}:`,
type: 'list',
choices: entities.map(entity => ({ name: entity.name, value: entity.id })),
},
]);
return entities.find(entity => entity.id === choice);
}
async runAuthenticated() {
const { flags } = await this.parse(UsersInviteCommand);
const config = await (0, with_current_project_1.default)({ ...this.env, projectId: flags.projectId });
try {
const teams = await new team_manager_1.default(config).listForProject();
const team = await this.resolveByName(teams, flags.team, 'team');
const roles = await new role_manager_1.default(config).listForProject();
const role = await this.resolveByName(roles, flags.role, 'role', "Deploy a production environment first (it creates the project's first role), or create one via the API.");
const invitations = flags.email.map((email) => ({
email,
teamId: team.id,
roleId: role.id,
permissionLevel: flags['permission-level'],
}));
const result = await new invitation_manager_1.default(config).inviteUsers(invitations);
if (flags.format === 'json') {
this.logger.info(JSON.stringify(result, null, 2));
return;
}
this.logger.info(`Invited ${invitations.length} user(s) to team "${team.name}" (${flags['permission-level']}) on project ${config.projectId}: ${flags.email.join(', ')}.`);
}
catch (error) {
const { response, status } = error;
if (response && status !== 403 && response.text) {
let detail;
try {
detail = JSON.parse(response.text)?.errors?.[0]?.detail;
}
catch {
// Non-JSON error body: fall through and rethrow the original error.
}
if (detail) {
this.logger.error(detail);
this.exit(1);
}
}
throw error;
}
}
}
exports.default = UsersInviteCommand;
UsersInviteCommand.description = 'Invite users to a project.';
UsersInviteCommand.flags = {
email: core_1.Flags.string({
char: 'e',
description: 'Email of the user to invite (repeat the flag to invite several users).',
required: true,
multiple: true,
}),
team: core_1.Flags.string({
char: 't',
description: 'Team name to add the invited users to (prompted if omitted and several exist).',
}),
role: core_1.Flags.string({
char: 'r',
description: 'Role name to assign (prompted if omitted and several exist).',
}),
'permission-level': core_1.Flags.string({
char: 'l',
description: 'Permission level of the invited users.',
options: PERMISSION_LEVELS,
required: true,
}),
projectId: core_1.Flags.integer({
char: 'p',
description: 'Forest project ID.',
}),
format: core_1.Flags.string({
char: 'f',
description: 'Output format.',
options: ['table', 'json'],
default: 'table',
}),
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW52aXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3VzZXJzL2ludml0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUVBLHNDQUFvQztBQUVwQywwR0FBZ0Y7QUFDaEYsMkZBQWtFO0FBQ2xFLCtFQUFzRDtBQUN0RCwrRUFBc0Q7QUFDdEQsK0ZBQXFFO0FBRXJFLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFJOUUsTUFBcUIsa0JBQW1CLFNBQVEsd0NBQTRCO0lBd0MxRSxZQUFZLElBQWMsRUFBRSxNQUFjLEVBQUUsSUFBSztRQUMvQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixNQUFNLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3RELGFBQWEsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVELHlFQUF5RTtJQUN6RSx5RUFBeUU7SUFDekUsdUVBQXVFO0lBQy9ELEtBQUssQ0FBQyxhQUFhLENBQ3pCLFFBQXVCLEVBQ3ZCLFlBQWdDLEVBQ2hDLEtBQWEsRUFDYixTQUFrQjtRQUVsQixJQUFJLFlBQVksRUFBRTtZQUNoQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQztZQUNwRSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxLQUFLLENBQUM7WUFDeEIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFD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