UNPKG

@cto.ai/ops

Version:

💻 CTO.ai - The CLI built for Teams 🚀

154 lines (153 loc) • 6.97 kB
"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(), }, ];