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
const EMAIL = config.email;
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

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

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

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

d360cefc   TUM.Apichat   move save google ...
66
67
68
function storeToken(token, emails) {
    var tokendb;
    token.email = emails[0].value
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
69
    try {
d360cefc   TUM.Apichat   move save google ...
70
71
72
73
        // ** new
        tokendb = new Token(token);
        // -- old
        // fs.mkdirSync(TOKEN_DIR);
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
74
    } catch (err) {
d360cefc   TUM.Apichat   move save google ...
75
        throw err;
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
76
    }
d360cefc   TUM.Apichat   move save google ...
77
    // ** new
48a9a246   Apichat.Tum   fix auth
78
    Promise.try(function () {})
d360cefc   TUM.Apichat   move save google ...
79
80
81
82
83
84
85
86
87
88
89
90
91
        .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);
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
92
93
}

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

f6a4415a   Apichat.Tum   start smart-rms-c...
117
118
    },

cf86e9a3   Apichat.Tum   - ui with oauth2 ...
119
    setNewToken: (code, callback) => {
fbe7f7a7   Apichat.Tum   add api google
120
        Token.findOne({
f3f14fef   TUM.Apichat   add value config ...
121
            email: EMAIL
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
        }, 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);
                    }
48a9a246   Apichat.Tum   fix auth
149

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

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

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

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

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

a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
180
    createEvent: (options, callback) => {
f6a4415a   Apichat.Tum   start smart-rms-c...
181
        calendar.events.insert({
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
            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);
f6a4415a   Apichat.Tum   start smart-rms-c...
201
        });
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
202
203
    },

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

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

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

77034810   Apichat.Tum   fix REST API
261
262
263
264
265
266
267
268
269
270
271
272
    deleteBuilder: (payload) => {
        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 {{}}
     */
77034810   Apichat.Tum   fix REST API
278
    updateBuilder: (payload) => {
fbe7f7a7   Apichat.Tum   add api google
279
        var buildPayload = {};
77034810   Apichat.Tum   fix REST API
280
        try {
fbe7f7a7   Apichat.Tum   add api google
281
282
283
284
            buildPayload.calendarId = CALENDAR_ID;
            buildPayload.eventId = payload.TaskID;
            buildPayload.summary = payload.Title;
            buildPayload.description = payload.Description;
77034810   Apichat.Tum   fix REST API
285
286
287
            buildPayload.start = {
                dateTime: moment(payload.Start).format("YYYY-MM-DDTHH:mm:ssZ"),
                timeZone: hasTimezone(payload.StartTimezone)
fbe7f7a7   Apichat.Tum   add api google
288
            };
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
289
            buildPayload.end = {
77034810   Apichat.Tum   fix REST API
290
291
                dateTime: moment(payload.End).format("YYYY-MM-DDTHH:mm:ssZ"),
                timeZone: hasTimezone(payload.EndTimezone)
fbe7f7a7   Apichat.Tum   add api google
292
            };
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
293
            if (payload.email) {
21a1ff19   Apichat.Tum   fix follow smartr...
294
295
296
                buildPayload.attendees = [{
                    email: payload.email
                }]
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
297
298
299
300
            }
            if (payload.reminders) {
                buildPayload.reminders = {
                    useDefault: false,
21a1ff19   Apichat.Tum   fix follow smartr...
301
302
303
304
                    overrides: [{
                        method: 'email',
                        minutes: 24 * 60
                    }]
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
305
306
                }
            }
7598c58f   Apichat.Tum   add eventTypeID /...
307
308
309
310
311
312
313
            if (payload.EventTypeID) {
                buildPayload.extendedProperties = {
                    "private": {
                        "eventTypeID": payload.EventTypeID
                    }
                }
            }
1244ae71   Apichat.Tum   new response
314
315
316
            if (payload.PropertyID) {
                buildPayload.extendedProperties.private.propertyID = payload.PropertyID;
            }
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
317
318
            if (payload.extendedProperties) {
                buildPayload.extendedProperties = payload.extendedProperties
a54f2679   DESKTOP-RBJDHSM\ADMIN   fix API
319
            }
cf86e9a3   Apichat.Tum   - ui with oauth2 ...
320
321
322
323
        } catch (error) {
            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) => {
f3f14fef   TUM.Apichat   add value config ...
380
        // oauth2Client.setCredentials(options.auth);
fbe7f7a7   Apichat.Tum   add api google
381
382
383
384
385
386
387
        oauth2Client.refreshAccessToken(function(err, tokens) {
            // 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
391


};