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
JavaScript
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)
});
}
);
},
};