cabdriver
Version:
Helps you to fill in your hours with taxi
192 lines (163 loc) • 6.04 kB
JavaScript
;
const {google} = require('googleapis');
var Moment = require('moment-timezone');
var Promise = require('bluebird');
var Async = require('promise-async');
var _ = require('lodash');
var helper = require('../helper');
var Source = require('./source');
class GoogleMail extends Source {
constructor(options, auth) {
super(options, auth);
this.type = 'mail';
}
// eslint-disable-next-line max-lines-per-function
generateEntries(auth, config) {
var me = this;
config = config || {};
var mailConfig = me.getMailConfig(config);
var mailArgs = {
userId: 'me'
};
mailArgs['maxResults'] = me.options.count || 10;
mailArgs['q'] = mailConfig.query;
_.each(mailConfig.include, function(label, index) {
if (index === 0) {
mailArgs['q'] += ' (label:' + label;
} else {
mailArgs['q'] += ' OR label:' + label;
}
if (index === mailConfig.include.length - 1) {
mailArgs['q'] += ')';
}
});
_.each(mailConfig.exclude, function(label) {
mailArgs['q'] += ' -label:' + label;
});
var afterDate = Moment.tz(me.options.startDate, 'Europe/Zurich') || Moment().tz('Europe/Zurich');
mailArgs['q'] += ' after:' + afterDate.subtract(1, 'd').endOf('day').format('X');
if (me.options.endDate) {
var timestamp = Moment.tz(me.options.endDate, 'Europe/Zurich')
.add(1, 'd')
.startOf('day')
.format('X');
mailArgs['q'] += ' before:' + timestamp;
}
helper.logVerbose('Fetching mails: ' + mailArgs['q'], me.options.verbose);
return me.getAllMessages(mailArgs, auth)
.then(function(allMessages) {
return Async.mapLimit(
allMessages,
5,
function(msg, callback) {
helper.printVerbose('=', me.options.verbose);
return me.handleMessage(auth, msg, callback);
});
})
.then(function(results) {
helper.printVerbose(']\n', me.options.verbose);
return results.reverse();
})
.catch(function(err) {
throw new Error('The Google Mail API returned an error: ' + err);
});
}
getAllMessages(mailArgs, auth) {
var me = this;
var allMessages = [];
const mail = google.gmail({
version: 'v1',
auth: auth
});
function pager(res) {
helper.printVerbose('.', me.options.verbose);
if (res.data.messages) {
allMessages = allMessages.concat(res.data.messages);
}
if (res.data.nextPageToken) {
mailArgs['pageToken'] = res.data.nextPageToken;
return mail.users.messages.list(_.clone(mailArgs)).then(pager);
}
return allMessages;
}
helper.printVerbose('[', me.options.verbose);
return mail.users.messages.list(_.clone(mailArgs)).then(pager);
}
handleMessage(auth, msg, callback) {
var me = this;
me.getMessage(auth, msg)
.then(function(response) {
var msgDate = Moment(response.internalDate, 'x').tz('Europe/Zurich');
var subject = _.find(response.payload.headers, function(header) {
return header.name === 'Subject';
}).value;
if (subject.length > 80) {
subject = subject.substring(0,50).trim() + '...';
}
var from = me.buildFromName(response);
var msg = {
'project': 'xxx',
'time': '1',
'text': subject + ' (' + from + ', ' + msgDate.format('HH:mm') + ')',
'timestamp': msgDate.startOf('day').format('X'),
'type': 'mail',
'comment': false
};
callback(null, msg);
})
.catch(function(err) {
callback(err);
});
}
buildFromName(response) {
var from = _.find(response.payload.headers, function(header) {
return header.name === 'From';
}).value;
var displayName = from.match(/(.*) <(.*@.*)>/);
if (displayName) {
from = displayName[1];
}
return from;
}
getMailConfig(config) {
var template = {
'include': [],
'exclude': [],
'query': ''
};
var fromFile = config.mail || {};
var mailConfig = _.assignIn(template, fromFile);
if (! _.isArray(mailConfig.include) || ! _.isArray(mailConfig.exclude) || ! _.isString(mailConfig.query)) {
throw new Error(
'YAML config of mail is malformated' +
' (include/exclude must be a list, query must be a string)'
);
}
return mailConfig;
}
getMessage(auth, msg) {
var me = this;
var cacheResult = me.options.cache.getSync('gmail-msg-' + msg.id);
if (cacheResult) {
helper.printVerbose('c', me.options.verbose);
return Promise.resolve(cacheResult);
}
const mail = google.gmail({
version: 'v1',
auth: auth
});
var mailOpts = {
auth: auth,
userId: 'me',
id: msg.id,
format: 'metadata',
metadataHeaders: ['From', 'Subject']
};
return mail.users.messages.get(mailOpts)
.then(function(response) {
me.options.cache.putSync('gmail-msg-' + msg.id, response.data);
return response.data;
});
}
}
module.exports = GoogleMail;