mite-cli
Version:
command line tool for time tracking service mite.de
141 lines (123 loc) • 4.12 kB
JavaScript
;
const program = require('commander');
const pkg = require('./../package.json');
const config = require('./config');
const DataOutput = require('./lib/data-output');
const usersCommand = require('./lib/commands/users');
const commandOptions = require('./lib/options');
const { handleError } = require('./lib/errors');
program
.version(pkg.version)
.description(`Shows a list of user accounts which can be filtered, searched, \
sorted.
Note that users with the role time-tracker will not be able to list users!
`)
.option.apply(program, commandOptions.toArgs(
commandOptions.archived,
'filter for archived or unarchived customers only',
'all'
))
.option.apply(program, commandOptions.toArgs(
commandOptions.columns,
commandOptions.columns.description(usersCommand.columns.options),
config.get().usersColumns
))
.option(
'--name <query>',
'Optional case-sensitive query for names'
)
.option(
'--email <query>',
'Optional case-sensitive search for users emails'
)
.option.apply(program, commandOptions.toArgs(commandOptions.json))
.option(
'--role <role>',
'Optional user role to filter, multiple arguments comma-separated',
((val) => {
if (typeof val === 'string') {
return val.split(/\s*,\s*/);
}
return val;
})
)
.option(
'--search <regexp>',
'Optional cient-side regexp searching in user name, email and note.'
)
.option.apply(program, commandOptions.toArgs(commandOptions.plain))
.option.apply(program, commandOptions.toArgs(commandOptions.pretty))
.option.apply(program, commandOptions.toArgs(
commandOptions.sort,
commandOptions.sort.description(usersCommand.sort.options),
usersCommand.sort.default
))
.addHelpText('after', `
Examples:
list all users
mite users
search for a specific user that exactly matches
mite users --search "^marc$"
search for a users that somewhat match the regexp
mite users --search "steph"
show all time tracking users from a company (all have a ephigenia.de email address)
mite users --role time_tracker --email ephigenia.de
show all users while using all columns
mite users --columns all
export all users to json
mite users --columns id,role,name,email,archived,language --json > users.json
`);
/**
* Filter function for matching a user against a search query which searches
* in email, name and note
*
* @param {String} query
* @param {Object} user
* @param {String} user.email
* @param {String} user.name
* @param {String} user.note
* @return {Boolean}
*/
function filterUsersByQuery(query, user) {
// no query given pass all projects as there’s probably no "search"
// argument given to the CLI
if (!query) {
return true;
}
const regexp = new RegExp(program.search, 'i');
const target = [user.name, user.email, user.note].join('');
return target.match(regexp);
}
async function main() {
const opts = program.opts();
const miteApi = require('./lib/mite-api')(config.get());
const options = {
limit: 1000,
offset: 0,
...(opts.email && { email: opts.email }),
...(opts.search && { query: opts.search }),
};
return miteApi.getUsers(options)
.then((users) => users
.filter(({ archived }) => opts.archived === 'all' && true || archived === opts.archived)
.filter(({ role }) => !opts.role && true || opts.role.indexOf(role) > -1)
.filter(filterUsersByQuery.bind(this, opts.search))
)
.then(items => miteApi.sort(
items,
commandOptions.sort.resolve(opts.sort, usersCommand.sort.options),
))
.then((items) => {
const format = DataOutput.getFormatFromOptions(opts, config);
const columns = commandOptions.columns.resolve(opts.columns, usersCommand.columns.options);
const tableData = DataOutput.compileTableData(items, columns, format);
process.stdout.write(DataOutput.formatData(tableData, format, columns) + '\n');
})
.catch(handleError);
} // main
try {
program.action(main).parse();
} catch (err) {
handleError(err);
}