Blame view

app/lib/index.js 12.1 KB
f6a4415a   Apichat.Tum   start smart-rms-c...
1
2
3
'use strict';

const google = require('googleapis');
d360cefc   TUM.Apichat   move save google ...
4
const plus = google.plus('v1');
f6a4415a   Apichat.Tum   start smart-rms-c...
5
6
const googleAuth = require('google-auth-library');
const calendar = google.calendar('v3');
f6a4415a   Apichat.Tum   start smart-rms-c...
7
const fs = require('fs');
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
8
9
10
const path = require('path');
const yamlConfig = require('node-yaml-config');
const config = yamlConfig.load(path.join(__dirname, '/../../config/config.yml'));
77034810   Apichat.Tum   fix REST API
11
const moment = require('moment')
d360cefc   TUM.Apichat   move save google ...
12
13
14
const Promise = require('bluebird')
const Mongoose = Promise.promisifyAll(require('mongoose'));
const Token = Mongoose.model('Token');
fbe7f7a7   Apichat.Tum   add api google
15
16
17
18
19
20
21
22
23
const console = process.console;

/**
 * ดึงค่ามาจาก config.yml
 */
const CALENDAR_ID = config.google.calendar_id;
const REDIRECT_URL = config.google.redirect_url;
const CLIENT_ID = config.google.client_id;
const CLIENT_SECRET = config.google.client_secret;
f3f14fef   TUM.Apichat   add value config ...
24

fbe7f7a7   Apichat.Tum   add api google
25
26
27
28
29
30
31
/**
 * เรียกใช้ oauth2Client
 * @type {GoogleAuth}
 */
const auth = google.auth.OAuth2;
const oauth2Client = new auth(CLIENT_ID, CLIENT_SECRET, REDIRECT_URL);

f6a4415a   Apichat.Tum   start smart-rms-c...
32
const SCOPES = ['https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/userinfo.email'];
d360cefc   TUM.Apichat   move save google ...
33
const TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE) + '/.credentials/';
f6a4415a   Apichat.Tum   start smart-rms-c...
34
35
36
const TOKEN_PATH = TOKEN_DIR + 'calendar-nodejs-quickstart.json';

function hasTimezone(timezone) {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
37
38
39
40
41
42
43
44
    if (timezone) {
        return timezone
    } else {
        return 'Asia/Bangkok'
    }
}

function getNewToken(oauth2Client, callback) {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    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) {
d360cefc   TUM.Apichat   move save google ...
66
67
68
    var tokendb;
    token.email = emails[0].value
    try {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
69
        // ** new
d360cefc   TUM.Apichat   move save google ...
70
71
72
73
        tokendb = new Token(token);
        // -- old
        // fs.mkdirSync(TOKEN_DIR);
    } catch (err) {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
74
        throw err;
d360cefc   TUM.Apichat   move save google ...
75
    }
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
76
    // ** new
d360cefc   TUM.Apichat   move save google ...
77
    Promise.try(function () {})
48a9a246   Apichat.Tum   fix auth
78
        .then(function () {
d360cefc   TUM.Apichat   move save google ...
79
80
81
82
83
84
85
86
87
88
89
90
91
            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);
}
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
92
93

module.exports = {
f6a4415a   Apichat.Tum   start smart-rms-c...
94
    authorize: (callback) => {
f6a4415a   Apichat.Tum   start smart-rms-c...
95
        var setToken = {} // set token from callback
fbe7f7a7   Apichat.Tum   add api google
96
97
        Token.findOne({
            email: 'zentoriono@gmail.com'
f3f14fef   TUM.Apichat   add value config ...
98
        }, function (err, token) {
fbe7f7a7   Apichat.Tum   add api google
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
            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));
            }
        });
f6a4415a   Apichat.Tum   start smart-rms-c...
115

a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
116
    },
f6a4415a   Apichat.Tum   start smart-rms-c...
117
118

    setNewToken: (code, callback) => {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
119
        Token.findOne({
fbe7f7a7   Apichat.Tum   add api google
120
            email: 'zentoriono@gmail.com'
f3f14fef   TUM.Apichat   add value config ...
121
        }, function (err, token) {
fbe7f7a7   Apichat.Tum   add api google
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
            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);
                    }

48a9a246   Apichat.Tum   fix auth
149
                })
fbe7f7a7   Apichat.Tum   add api google
150
151
152
153
            }
        });
    },

48a9a246   Apichat.Tum   fix auth
154
    listCalendar: (auth, callback) => {
fbe7f7a7   Apichat.Tum   add api google
155
156
157
158
159
160
        calendar.calendarList.list({
            auth: auth,
            minAccessRole: 'owner'
        }, (err, response) => {
            if (err) return callback(err);

48a9a246   Apichat.Tum   fix auth
161
            return callback(null, response);
fbe7f7a7   Apichat.Tum   add api google
162
        });
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
163
164
165
    },

    listEvents: (auth, callback) => {
f6a4415a   Apichat.Tum   start smart-rms-c...
166
167
168
        calendar.events.list({
            auth: auth,
            calendarId: CALENDAR_ID || 'primary', //CALENDAR_ID || 'primary'
fbe7f7a7   Apichat.Tum   add api google
169
            maxResults: 50,
f6a4415a   Apichat.Tum   start smart-rms-c...
170
171
172
173
            singleEvents: true,
            orderBy: 'startTime'
        }, (err, response) => {
            if (err) return callback(err);
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
174
175

            return callback(null, response);
f6a4415a   Apichat.Tum   start smart-rms-c...
176
177
178
179
        });
    },

    createEvent: (options, callback) => {
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
180
        calendar.events.insert({
f6a4415a   Apichat.Tum   start smart-rms-c...
181
            auth: options.auth,
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
            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);
        });
f6a4415a   Apichat.Tum   start smart-rms-c...
201
    },
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
202
203

    updateEvent: (options, callback) => {
77034810   Apichat.Tum   fix REST API
204
205
206
207
        calendar.events.update({
            auth: options.auth,
            calendarId: CALENDAR_ID || 'primary',
            eventId: options.eventId,
7598c58f   Apichat.Tum   add eventTypeID /...
208
209
            resource: options
        }, (err, response) => {
77034810   Apichat.Tum   fix REST API
210
211
212
213
214
215
216
            if (err) return callback(err);

            return callback(null, response);
        });
    },

    eventBuilder: (payload) => {
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
217
        var buildPayload = {}
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
218
219
        try {
            buildPayload.summary = payload.Title
77034810   Apichat.Tum   fix REST API
220
221
            buildPayload.description = payload.Description
            buildPayload.start = {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
222
                dateTime: new Date(payload.Start),
21a1ff19   Apichat.Tum   fix follow smartr...
223
                timezone: hasTimezone(payload.StartTimezone)
77034810   Apichat.Tum   fix REST API
224
            }
77034810   Apichat.Tum   fix REST API
225
226
            buildPayload.end = {
                dateTime: new Date(payload.End),
21a1ff19   Apichat.Tum   fix follow smartr...
227
                timeZone: hasTimezone(payload.EndTimezone)
77034810   Apichat.Tum   fix REST API
228
229
230
            }
            if (payload.email) {
                buildPayload.attendees = [{
21a1ff19   Apichat.Tum   fix follow smartr...
231
232
233
                    email: payload.email
                }]
            }
77034810   Apichat.Tum   fix REST API
234
235
236
237
            if (payload.reminders) {
                buildPayload.reminders = {
                    useDefault: false,
                    overrides: [{
21a1ff19   Apichat.Tum   fix follow smartr...
238
239
240
241
                        method: 'email',
                        minutes: 24 * 60
                    }]
                }
77034810   Apichat.Tum   fix REST API
242
243
            }
            if (payload.EventTypeID) {
7598c58f   Apichat.Tum   add eventTypeID /...
244
245
246
247
248
249
                buildPayload.extendedProperties = {
                    "private": {
                        "eventTypeID": payload.EventTypeID
                    }
                }
            }
77034810   Apichat.Tum   fix REST API
250
            if (payload.PropertyID) {
1244ae71   Apichat.Tum   new response
251
252
253
                buildPayload.extendedProperties.private.propertyID = payload.PropertyID;
            }
        } catch (error) {
77034810   Apichat.Tum   fix REST API
254
255
256
257
258
259
            console.error(error.message)
        } finally {
            return buildPayload
        }
    },

cf86e9a3   Apichat.Tum   - ui with oauth2 ...
260
    deleteBuilder: (payload) => {
77034810   Apichat.Tum   fix REST API
261
262
263
264
265
266
267
268
269
270
271
272
        var buildPayload = {}
        try {
            buildPayload.calendarId = CALENDAR_ID
            buildPayload.eventId = payload.TaskID
        } catch (error) {
            console.error(error.message)
        } finally {
            return buildPayload
        }
    },

    /**
fbe7f7a7   Apichat.Tum   add api google
273
274
275
276
277
     * สร้าง JSON สำหรับส่งไปอัพเดตข้อมูล event ปฏิทิน
     * @param payload
     * @returns {{}}
     */
    updateBuilder: (payload) => {
77034810   Apichat.Tum   fix REST API
278
        var buildPayload = {};
fbe7f7a7   Apichat.Tum   add api google
279
        try {
77034810   Apichat.Tum   fix REST API
280
            buildPayload.calendarId = CALENDAR_ID;
fbe7f7a7   Apichat.Tum   add api google
281
282
283
284
            buildPayload.eventId = payload.TaskID;
            buildPayload.summary = payload.Title;
            buildPayload.description = payload.Description;
            buildPayload.start = {
77034810   Apichat.Tum   fix REST API
285
286
287
                dateTime: moment(payload.Start).format("YYYY-MM-DDTHH:mm:ssZ"),
                timeZone: hasTimezone(payload.StartTimezone)
            };
fbe7f7a7   Apichat.Tum   add api google
288
            buildPayload.end = {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
289
                dateTime: moment(payload.End).format("YYYY-MM-DDTHH:mm:ssZ"),
77034810   Apichat.Tum   fix REST API
290
291
                timeZone: hasTimezone(payload.EndTimezone)
            };
fbe7f7a7   Apichat.Tum   add api google
292
            if (payload.email) {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
293
                buildPayload.attendees = [{
21a1ff19   Apichat.Tum   fix follow smartr...
294
295
296
                    email: payload.email
                }]
            }
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
297
298
299
300
            if (payload.reminders) {
                buildPayload.reminders = {
                    useDefault: false,
                    overrides: [{
21a1ff19   Apichat.Tum   fix follow smartr...
301
302
303
304
                        method: 'email',
                        minutes: 24 * 60
                    }]
                }
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
305
306
            }
            if (payload.EventTypeID) {
7598c58f   Apichat.Tum   add eventTypeID /...
307
308
309
310
311
312
313
                buildPayload.extendedProperties = {
                    "private": {
                        "eventTypeID": payload.EventTypeID
                    }
                }
            }
            if (payload.PropertyID) {
1244ae71   Apichat.Tum   new response
314
315
316
                buildPayload.extendedProperties.private.propertyID = payload.PropertyID;
            }
            if (payload.extendedProperties) {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
317
318
                buildPayload.extendedProperties = payload.extendedProperties
            }
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
319
        } catch (error) {
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
320
321
322
323
            console.error(error.message)
        } finally {
            return buildPayload
        }
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
324
    },
fbe7f7a7   Apichat.Tum   add api google
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379

    /**
     * API สร้างปฏิทิน อิงตาม summary(จะกลายเป็นชื่อของปฏิทิน) ที่มาจาก request
     * @googleAPI https://developers.google.com/apis-explorer/#p/calendar/v3/calendar.calendars.insert
     * @param options
     * @param callback
     */
    createCalendar: (options, callback) => {
        calendar.calendars.insert({
            auth: options.auth,
            resource: options
        }, (err, response) => {
            if (err) return callback(err);

            return callback(null, response);
        });

    },

    /**
     * API เรียกข้อมูลปฏิทิน อิงตาม id ที่มาจาก request
     * @googleAPI https://developers.google.com/apis-explorer/#p/calendar/v3/calendar.calendarList.get
     * @param auth
     * @param callback
     */
    getCalendar: (auth, callback) => {
        calendar.calendars.get({
            auth: auth,
            calendarId: CALENDAR_ID || 'primary'
        }, (err, response) => {
            if (err) return callback(err);

            return callback(null, response);
        });
    },

    /**
     * API ลบปฏิทินโดย อิงตาม id ที่มาจาก request
     * @googleAPI https://developers.google.com/apis-explorer/#p/calendar/v3/calendar.calendars.delete
     * @param options
     * @param callback
     */
    deleteCalendar: (options, callback) => {
        calendar.calendars.delete({
            auth: options.auth,
            calendarId: options.calendarId
        }, (err, response) => {
            if (err) return callback(err);

            return callback(null, response);
        });
    },

    refreshToken: (options, callback) => {
        oauth2Client.setCredentials(options.auth);
f3f14fef   TUM.Apichat   add value config ...
380
        oauth2Client.refreshAccessToken(function(err, tokens) {
fbe7f7a7   Apichat.Tum   add api google
381
382
383
384
385
386
387
            // your access_token is now refreshed and stored in oauth2Client
            // store these new tokens in a safe place (e.g. database)
            if (err) return callback(err);

            return callback(null, tokens);
        });
    }
f6a4415a   Apichat.Tum   start smart-rms-c...
388

fbe7f7a7   Apichat.Tum   add api google
389
390

};