'use strict'; const google = require('googleapis'); const plus = google.plus('v1'); const googleAuth = require('google-auth-library'); const calendar = google.calendar('v3'); const fs = require('fs'); const path = require('path'); const yamlConfig = require('node-yaml-config'); const config = yamlConfig.load(path.join(__dirname, '/../../config/config.yml')); const moment = require('moment') const Promise = require('bluebird') const Mongoose = Promise.promisifyAll(require('mongoose')); const Token = Mongoose.model('Token'); const CALENDAR_ID = config.ggapi.calendarID const REDIRECTURL = config.ggapi.redirectUrl const SCOPES = ['https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/userinfo.email']; const TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE) + '/.credentials/'; const TOKEN_PATH = TOKEN_DIR + 'calendar-nodejs-quickstart.json'; function hasTimezone(timezone) { if (timezone) { return timezone } else { return 'Asia/Bangkok' } } function getNewToken(oauth2Client, callback) { var authUrl = oauth2Client.generateAuthUrl({ access_type: 'offline', scope: SCOPES }); // console.log('Authorize this app by visiting this url: ', authUrl); return authUrl; } function setNewToken(code) { oauth2Client.getToken(code, function (err, token) { if (err) { console.log('Error while trying to retrieve access token', err); return; } oauth2Client.credentials = token; storeToken(token); callback(oauth2Client); }) } function storeToken(token, emails) { var tokendb; token.email = emails[0].value try { // ** new tokendb = new Token(token); // -- old // fs.mkdirSync(TOKEN_DIR); } catch (err) { throw err; } // ** new Promise.try(function () {}) .then(function () { tokendb.save(function (err, result) { if (err) { console.error(err) } else { console.log(result); } }); }); // -- old // fs.writeFile(TOKEN_PATH, JSON.stringify(token)); // console.log('Token stored to ' + TOKEN_PATH); } module.exports = { authorize: (callback) => { fs.readFile('client_secret.json', (err, content) => { if (err) return callback(err); let credentials = JSON.parse(content); var clientSecret = credentials.installed.client_secret; var clientId = credentials.installed.client_id; var redirectUrl = credentials.installed.redirect_uris[1]; var auth = new googleAuth(); var oauth2Client = new auth.OAuth2(clientId, clientSecret, REDIRECTURL); var setToken = {} // set token from callback Token.findOne({ email: 'tzbattleboy@gmail.com' }, function (err, token) { if (err) { return callback(null, null, getNewToken(oauth2Client, callback)); } else if (token) { setToken = { access_token: token.access_token, refresh_token: token.refresh_token, token_type: token.token_type, expiry_date: token.expiry_date } // console.log(setToken) oauth2Client.credentials = setToken; return callback(null, oauth2Client); } else { return callback(null, null, getNewToken(oauth2Client, callback)); } }); // fs.readFile(TOKEN_PATH, (err, token) => { // }); }); }, setNewToken: (code, callback) => { fs.readFile('client_secret.json', (err, content) => { if (err) return callback(err); let credentials = JSON.parse(content); var clientSecret = credentials.installed.client_secret; var clientId = credentials.installed.client_id; var redirectUrl = credentials.installed.redirect_uris[1]; var auth = new googleAuth(); var oauth2Client = new auth.OAuth2(clientId, clientSecret, REDIRECTURL); Token.findOne({ email: 'tzbattleboy@gmail.com' }, function (err, token) { if (token) { oauth2Client.credentials = JSON.parse(token); return callback(null, oauth2Client); } else { oauth2Client.getToken(code, function (err, token) { if (err) { console.log('Error while trying to retrieve access token', err); return; } else { oauth2Client.credentials = token; var params = { userId: 'me', fields: 'emails', auth: oauth2Client }; plus.people.get(params, function (err, response) { if (err) { console.error(err) } else { storeToken(token, response.emails); } }); return callback(null, oauth2Client); } }) } }); // fs.readFile(TOKEN_PATH, (err, token) => { // if (err) { // } else { // } // }); }); }, listEvents: (auth, callback) => { calendar.events.list({ auth: auth, calendarId: CALENDAR_ID || 'primary', maxResults: 50, singleEvents: true, orderBy: 'startTime' }, (err, response) => { if (err) return callback(err); return callback(null, response); }); }, createEvent: (options, callback) => { calendar.events.insert({ auth: options.auth, calendarId: CALENDAR_ID || 'primary', resource: options }, (err, response) => { if (err) return callback(err); return callback(null, response); }); }, deleteEvent: (options, callback) => { calendar.events.delete({ auth: options.auth, calendarId: CALENDAR_ID || 'primary', eventId: options.eventId }, (err, response) => { if (err) return callback(err); return callback(null, response); }); }, updateEvent: (options, callback) => { calendar.events.update({ auth: options.auth, calendarId: CALENDAR_ID || 'primary', eventId: options.eventId, resource: options }, (err, response) => { if (err) return callback(err); return callback(null, response); }); }, eventBuilder: (payload) => { var buildPayload = {} try { buildPayload.summary = payload.Title buildPayload.description = payload.Description buildPayload.start = { dateTime: new Date(payload.Start), timezone: hasTimezone(payload.StartTimezone) } buildPayload.end = { dateTime: new Date(payload.End), timeZone: hasTimezone(payload.EndTimezone) } if (payload.email) { buildPayload.attendees = [{ email: payload.email }] } if (payload.reminders) { buildPayload.reminders = { useDefault: false, overrides: [{ method: 'email', minutes: 24 * 60 }] } } if (payload.EventTypeID) { buildPayload.extendedProperties = { "private": { "eventTypeID": payload.EventTypeID } } } } catch (error) { console.error(error.message) } finally { return buildPayload } }, deleteBuilder: (payload) => { var buildPayload = {} try { buildPayload.calendarId = CALENDAR_ID buildPayload.eventId = payload.TaskID } catch (error) { console.error(error.message) } finally { return buildPayload } }, updateBuilder: (payload) => { var buildPayload = {} try { buildPayload.calendarId = CALENDAR_ID buildPayload.eventId = payload.TaskID buildPayload.summary = payload.Title buildPayload.description = payload.Description buildPayload.start = { dateTime: moment(payload.Start).format("YYYY-MM-DDTHH:mm:ssZ"), timeZone: hasTimezone(payload.StartTimezone) } buildPayload.end = { dateTime: moment(payload.End).format("YYYY-MM-DDTHH:mm:ssZ"), timeZone: hasTimezone(payload.EndTimezone) } if (payload.email) { buildPayload.attendees = [{ email: payload.email }] } if (payload.reminders) { buildPayload.reminders = { useDefault: false, overrides: [{ method: 'email', minutes: 24 * 60 }] } } if (payload.EventTypeID) { buildPayload.extendedProperties = { "private": { "eventTypeID": payload.EventTypeID } } } if (payload.extendedProperties) { buildPayload.extendedProperties = payload.extendedProperties } } catch (error) { console.error(error.message) } finally { return buildPayload } } }