UNPKG

soloflow

Version:

Soloflow timetracking CLI tool - Create a user on Soloflow.io at start using our CLI to track your time.

258 lines (209 loc) 7.08 kB
const Configstore = require('configstore'); const pkg = require('../package.json'); const _ = require('lodash'); const CLI = require('clui'); const Spinner = CLI.Spinner; const chalk = require('chalk'); const moment = require('moment'); const inquirer = require('inquirer'); const request = require("request"); const conf = new Configstore(pkg.name); function convertMiliToFormat(duration) { var hours = +duration / (1000*60*60); var absoluteHours = Math.floor(hours); var h = absoluteHours > 9 ? absoluteHours : '0' + absoluteHours; //Get remainder from hours and convert to minutes var minutes = (hours - absoluteHours) * 60; var absoluteMinutes = Math.floor(minutes); var m = absoluteMinutes > 9 ? absoluteMinutes : '0' + absoluteMinutes; //Get remainder from minutes and convert to seconds var seconds = (minutes - absoluteMinutes) * 60; var absoluteSeconds = Math.floor(seconds); var s = absoluteSeconds > 9 ? absoluteSeconds : '0' + absoluteSeconds; return h + ':' + m + ':' + s; } module.exports = { getCredentialsFromConsole : async () => { const questions = [ { name: 'user_email', type: 'input', message: 'Enter your Soloflow.io e-mail address:', validate: function( value ) { if (value.length) { return true; } else { return 'Please enter your e-mail address.'; } } }, { name: 'user_password', type: 'password', message: 'Enter your password:', validate: function(value) { if (value.length) { return true; } else { return 'Please enter your password.'; } } } ]; return inquirer.prompt(questions); }, getStoredToken : async () => { return new Promise( resolve => { resolve(conf.get('soloflow.user')); } ); }, postUserLogin : async (credentials) => { console.log("🤞 Logging you in..."); return new Promise( resolve => { var postObject = { "user_email": credentials['user_email'], "user_password": credentials['user_password'] } var options = { method: 'POST', url: 'http://localhost:3000/user/login', headers: { 'Cache-Control': 'no-cache' }, 'body': postObject, json: true }; request(options, function (error, response, body) { if (body['message'] != undefined) { console.log(chalk.red("❌ Wrong code or user. Please try 'soloflow login' again")); resolve(body); return; }; console.log(chalk.green("🤙 Log in successful!")); conf.set('soloflow.user', body); resolve(body) }); } ); }, getProjects : async () => { console.log("🤞 Getting projects..."); return new Promise( resolve => { var user = conf.get('soloflow.user'); var options = { method: 'GET', url: 'http://localhost:3000/project/all', headers: { 'Cache-Control': 'no-cache', 'X-Authorization': user['user_token'] }, json: true }; request(options, function (error, response, body) { if (body['message'] != undefined) { console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); resolve(error); return; }; console.log(chalk.green("👌 Got all projects for you!")); conf.set('soloflow.projects', body); resolve(body) }); } ); }, getTrackings : async () => { console.log("🤞 Getting trackings..."); return new Promise( resolve => { var user = conf.get('soloflow.user'); var options = { method: 'GET', url: 'http://localhost:3000/tracking/last20', headers: { 'Cache-Control': 'no-cache', 'X-Authorization': user['user_token'] }, json: true }; request(options, function (error, response, body) { if (body['message'] != undefined) { console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); resolve(error); return; }; console.log(chalk.green("👌 Got trackings for you! Let me show you:")); for (let i = 0; i < body.length; i++) { const element = body[i]; var duration = moment.duration(moment.utc(body[i]['tracking_dateend']).diff(moment.utc(body[i]['tracking_datestart']))); console.log(chalk.green("👌 - Tracked '" + body[i]['tracking_work'] + "' on " + moment(body[i]['tracking_datestart']).format("DD/MM-YYYY") + " " + "for project '" + body[i]['project']['project_name'] + "' with a total of " + convertMiliToFormat(duration))); } conf.set('soloflow.trackings', body); resolve(body) }); } ); }, postTracking : async () => { var descr = conf.get('soloflow.track_descr'); var time = conf.get('soloflow.track_time'); var project = conf.get('soloflow.track_project'); if(descr == undefined) { console.log(chalk.red("✋ Couldn't find any current trackings")); return; } var duration = moment.duration(moment.utc().diff(moment.utc(time))); console.log("🤞 Posting your tracking: '" + descr + "' on project '" + project + "' - " + convertMiliToFormat(duration) + " to Soloflow..."); return new Promise( resolve => { var user = conf.get('soloflow.user'); var projects = conf.get('soloflow.projects'); var project_id = 0; for (let i = 0; i < projects.length; i++) { if(projects[i]['project_name'] == project) { project_id = projects[i]['project_id']; } } var postObject = { "tracking_work": descr, "project_id": project_id, "tracking_datestart": time, "tracking_dateend": new Date() } var options = { method: 'POST', url: 'http://localhost:3000/tracking/create', headers: { 'Cache-Control': 'no-cache', 'X-Authorization': user['user_token'] }, 'body': postObject, json: true }; request(options, function (error, response, body) { if (body['message'] != undefined) { console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); console.log(chalk.red("❌ Something happened. Maybe log in again? 'soloflow login'")); resolve(error); return; }; console.log(chalk.green("🤙 Your tracking got posted!")); conf.delete('soloflow.track_descr'); conf.delete('soloflow.track_time'); conf.delete('soloflow.track_project'); resolve(body) }); } ); }, };