@cto.ai/ops
Version:
💻 CTO.ai - The CLI built for Teams 🚀
154 lines (153 loc) • 6.97 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const fuzzy_1 = tslib_1.__importDefault(require("fuzzy"));
const base_1 = tslib_1.__importStar(require("./../../base"));
const utils_1 = require("./../../utils");
const CustomErrors_1 = require("./../../errors/CustomErrors");
class TeamRemove extends base_1.default {
constructor() {
super(...arguments);
this.members = [];
this.getActiveTeamCreator = async (inputs) => {
try {
const { tokens: { accessToken }, team: { name }, } = inputs.config;
const { data: creator } = await this.services.api.find(`/private/teams/${name}/creator`, {
headers: { Authorization: accessToken },
});
return Object.assign(Object.assign({}, inputs), { creator });
}
catch (err) {
this.debug('%O', err);
throw new CustomErrors_1.APIError(err);
}
};
this.getActiveTeamMembers = async (inputs) => {
try {
const { tokens: { accessToken }, team: { name: activeTeamName }, } = inputs.config;
const { data: members } = await this.services.api.find(`/private/teams/${activeTeamName}/members`, {
headers: { Authorization: accessToken },
});
return Object.assign(Object.assign({}, inputs), { members });
}
catch (err) {
this.debug('%O', err);
throw new CustomErrors_1.APIError(err);
}
};
this.filterOutCreatorAndCurrentUser = async (inputs) => {
const { creator: { userId: creatorId }, config: { user: { id: activeUserId }, }, } = inputs;
const members = inputs.members.filter(member => {
return member.userId != creatorId && member.userId != activeUserId;
});
return Object.assign(Object.assign({}, inputs), { members });
};
this.checkForArgMember = async (inputs) => {
if (!inputs.memberArg)
return inputs;
const { members, memberArg, config: { team: { name: teamName }, }, } = inputs;
const memberToRemove = members.find(member => {
return member.username === memberArg;
});
if (memberToRemove)
return Object.assign(Object.assign({}, inputs), { memberToRemove });
throw new CustomErrors_1.NoMemberFound(memberArg, teamName);
};
this.selectMemberToRemove = async (inputs) => {
if (inputs.memberToRemove)
return inputs;
if (inputs.members.length === 0) {
throw new CustomErrors_1.NoMembersFound();
}
this.members = inputs.members;
const { team: { name: activeTeamName }, } = inputs.config;
const { memberToRemove } = await this.ux.prompt({
type: 'autocomplete',
name: 'memberToRemove',
message: `Select a member to remove from ${activeTeamName}`,
source: this._autocompleteSearch.bind(this),
});
return Object.assign(Object.assign({}, inputs), { memberToRemove });
};
this._autocompleteSearch = async (_, input = '') => {
const { list, options } = this._fuzzyFilterParams();
const fuzzyResult = fuzzy_1.default.filter(input, list, options);
return fuzzyResult.map(result => result.original);
};
this._fuzzyFilterParams = () => {
const list = this.members.map(member => {
return {
name: member.username,
value: member,
};
});
const options = { extract: el => el.name };
return { list, options };
};
this.confirmMemberRemove = async (inputs) => {
const { memberToRemove: { username }, config: { team: { name: activeTeamName }, }, } = inputs;
const { actionBlue } = this.ux.colors;
const { confirmRemove } = await this.ux.prompt({
type: 'confirm',
name: 'confirmRemove',
suffix: false,
message: `Are you sure you want to remove ${actionBlue(username)} from ${actionBlue(activeTeamName)}?`,
});
if (!confirmRemove)
process.exit();
return inputs;
};
this.removeMemberFromTeam = async (inputs) => {
const { memberToRemove: { userId, username }, config: { team: { name: activeTeamName }, tokens: { accessToken }, }, } = inputs;
try {
await this.services.api.remove(`/private/teams/${activeTeamName}/members`, userId, {
headers: { Authorization: accessToken },
});
return inputs;
}
catch (err) {
throw new CustomErrors_1.FailedToRemoveMemberFromTeam(err, username, activeTeamName);
}
};
this.successRemoveMessage = async (inputs) => {
const { memberToRemove: { username }, config: { team: { name: activeTeamName }, }, } = inputs;
const { white, callOutCyan } = this.ux.colors;
this.log(white(` 👌 ${callOutCyan(username)} was sucessfully removed from ${callOutCyan(activeTeamName)}`));
return inputs;
};
this.sendAnalytics = async (inputs) => {
const { config, memberToRemove } = inputs;
this.services.analytics.track('Ops CLI Team:Remove', {
username: config.user.username,
removedMember: memberToRemove.username,
}, config);
};
}
async run() {
const { args: { member: memberArg }, } = this.parse(TeamRemove);
const config = await this.isLoggedIn();
try {
const teamRemovePipeline = (0, utils_1.asyncPipe)(this.getActiveTeamMembers, this.getActiveTeamCreator, this.filterOutCreatorAndCurrentUser, this.checkForArgMember, this.selectMemberToRemove, this.confirmMemberRemove, this.removeMemberFromTeam, this.successRemoveMessage, this.sendAnalytics);
await teamRemovePipeline({ config, memberArg });
}
catch (err) {
this.debug('%O', err);
this.config.runHook('error', {
err,
accessToken: config.tokens.accessToken,
});
}
}
}
exports.default = TeamRemove;
TeamRemove.description = 'Remove your team members.';
TeamRemove.flags = {
help: base_1.flags.help({ char: 'h' }),
};
TeamRemove.args = [
{
name: 'member',
description: 'The username of the team member you want to remove from the team.',
parse: (input) => input.toLowerCase(),
},
];