diff --git a/app/controllers/home.controller.js b/app/controllers/home.controller.js index 4b92f12..a99276c 100644 --- a/app/controllers/home.controller.js +++ b/app/controllers/home.controller.js @@ -15,6 +15,17 @@ const lib = require('../lib') const url = config.server.url const port = config.server.port +function responseJSON(code, description, data, status) { + return { + "code": code, + "description": description, + "result": { + "data": data, + "status": status + } + } +} + function strToTime(date) { var strDate = new Date(date) return strDate.getTime() @@ -25,7 +36,7 @@ function ggToKendo(data) { try { for (var n = 0; n < data.items.length; n++) { dataToArr.push({ - "TaskID": data.items[n].etag, + "TaskID": data.items[n].id, "OwnerID": 2, "Title": data.items[n].summary, "Description": data.items[n].description, @@ -51,22 +62,27 @@ function home(req, res) { } function index(req, res) { + console.log(req.body) lib.getNewToken((err, authUrl) => { if (err) { - console.error(err.message) + console.error(err) } else { + console.info(authUrl) res.send(authUrl) } }) } function setToken(req, res) { + console.log(req.body) var code = req.body.code lib.setNewToken(code, (err, token) => { if (err) { + console.error(err) res.send(err) res.end() } else { + console.info(token) res.send(token) res.end() } @@ -74,28 +90,40 @@ function setToken(req, res) { } function events(req, res) { + // console.log(req.body) lib.authorize((err, auth, authUrl) => { if (err) { + console.error(err) res.send(err) - } else if (authUrl) { - console.info(authUrl) - res.send(authUrl) - res.end() } else { lib.listEvents(auth, (err, response) => { if (err) { - res.send(err) + if (authUrl) { + console.info(authUrl) + res.json(responseJSON(res.code, "redirect to get auth code", authUrl, "redirect")) + res.end() + } else { + console.error(err) + res.json(responseJSON(res.code, "response error", err.message, "failed")) + res.end() + } } else { + // console.info(response) res.jsonp(ggToKendo(response)) + res.end } }) } - }) } -function create(req, res) { +function eventCreate(req, res) { + console.log(req.body) let payload = req.body + if (typeof payload.models == "string") { + payload.models = JSON.parse(req.body.models) + payload = payload.models[0] + } let summary = payload.summary let description = payload.description @@ -119,13 +147,90 @@ function create(req, res) { res.send(err) } else { res.send(result) + res.end() } }) }) } +function oauth2callback(req, res) { + var code = req.query.code + lib.setNewToken(code, (err, token) => { + if (err) { + res.send(err) + res.end() + } else { + res.redirect('/home') + } + }) +} + +function eventDelete(req, res) { + console.log(req.body) + let payload = req.body + if (typeof payload.models == "string") { + payload.models = JSON.parse(req.body.models) + payload = payload.models[0] + } + lib.authorize((err, auth) => { + let options = lib.deleteBuilder(payload) + if (err) { + console.error(err.message) + res.send(err) + } else { + console.info(auth) + options.auth = auth + } + + lib.deleteEvent(options, (err, result) => { + if (err) { + console.error(err.message) + res.send(err) + } else { + console.info(result) + res.send(result) + res.end() + } + }) + }) +} + +function eventUpdate(req, res) { + console.log(req.body) + let payload = req.body + if (typeof payload.models == "string") { + payload.models = JSON.parse(req.body.models) + payload = payload.models[0] + } + lib.authorize((err, auth) => { + let options = lib.updateBuilder(payload) + if (err) { + console.error(err.message) + res.send(err) + } else { + console.info(auth) + options.auth = auth + } + + lib.updateEvent(options, (err, result) => { + if (err) { + console.error(err) + res.send(err) + } else { + console.info(result) + res.send(result) + res.end() + } + }) + }) +} + + module.exports.index = index module.exports.events = events -module.exports.create = create +module.exports.eventCreate = eventCreate +module.exports.eventUpdate = eventUpdate +module.exports.eventDelete = eventDelete module.exports.home = home module.exports.setToken = setToken +module.exports.oauth2callback = oauth2callback diff --git a/app/lib/index.js b/app/lib/index.js index 5c9b503..0118d61 100644 --- a/app/lib/index.js +++ b/app/lib/index.js @@ -7,7 +7,10 @@ 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 CALENDAR_ID = config.calendarID +const moment = require('moment') +const CALENDAR_ID = config.ggapi.calendarID +const REDIRECTURL = config.ggapi.redirectUrl + const SCOPES = ['https://www.googleapis.com/auth/calendar']; const TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE) + '/.credentials/'; @@ -63,9 +66,9 @@ module.exports = { let credentials = JSON.parse(content); var clientSecret = credentials.installed.client_secret; var clientId = credentials.installed.client_id; - var redirectUrl = credentials.installed.redirect_uris[0]; + var redirectUrl = credentials.installed.redirect_uris[1]; var auth = new googleAuth(); - var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); + var oauth2Client = new auth.OAuth2(clientId, clientSecret, REDIRECTURL); fs.readFile(TOKEN_PATH, (err, token) => { if (err) { @@ -86,9 +89,9 @@ module.exports = { let credentials = JSON.parse(content); var clientSecret = credentials.installed.client_secret; var clientId = credentials.installed.client_id; - var redirectUrl = credentials.installed.redirect_uris[0]; + var redirectUrl = credentials.installed.redirect_uris[1]; var auth = new googleAuth(); - var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl); + var oauth2Client = new auth.OAuth2(clientId, clientSecret, REDIRECTURL); fs.readFile(TOKEN_PATH, (err, token) => { if (err) { @@ -115,7 +118,6 @@ module.exports = { calendar.events.list({ auth: auth, calendarId: CALENDAR_ID || 'primary', - timeMin: (new Date()).toISOString(), maxResults: 50, singleEvents: true, orderBy: 'startTime' @@ -150,19 +152,82 @@ module.exports = { }); }, + updateEvent: (options, callback) => { + calendar.events.update({ + auth: options.auth, + calendarId: CALENDAR_ID || 'primary', + eventId: options.eventId + }, (err, response) => { + if (err) return callback(err); + + return callback(null, response); + }); + }, + eventBuilder: (payload) => { var buildPayload = {} try { - buildPayload.summary = payload.summary - buildPayload.description = payload.description + buildPayload.summary = payload.Title + buildPayload.description = payload.Description buildPayload.start = { - dateTime: payload.startDate, - timezone: hasTimezone(payload.startTimeZone) + dateTime: payload.Start, + timezone: hasTimezone(payload.StartTimezone) + + } + buildPayload.end = { + dateTime: 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.extendedProperties) { + buildPayload.extendedProperties = payload.extendedProperties + } + } 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: payload.endDate, - timeZone: hasTimezone(payload.endTimeZone) + dateTime: moment(payload.End).format("YYYY-MM-DDTHH:mm:ssZ"), + timeZone: hasTimezone(payload.EndTimezone) } if (payload.email) { buildPayload.attendees = [{ email: payload.email }] diff --git a/app/routes/home.routes.js b/app/routes/home.routes.js index 860186e..375b830 100644 --- a/app/routes/home.routes.js +++ b/app/routes/home.routes.js @@ -7,7 +7,10 @@ router.get('/', home.index) router.get('/home', home.home) router.get('/events', home.events) -router.post('/events', home.create) +router.post('/events', home.eventCreate) +router.put('/events', home.eventUpdate) +router.delete('/events', home.eventDelete) router.post('/setToken', home.setToken) +router.get('/oauth2callback', home.oauth2callback) module.exports = router \ No newline at end of file diff --git a/config/config.yml b/config/config.yml index b5e64bf..4dc1b50 100644 --- a/config/config.yml +++ b/config/config.yml @@ -15,4 +15,6 @@ localhost: pass: timerecheck: '10000' #millisecond apitimeout: 3000 #millisecond - calendarID: 'rvmbg3kg7uqninf7n3au1ku4mc@group.calendar.google.com' \ No newline at end of file + ggapi: + calendarID: 'rvmbg3kg7uqninf7n3au1ku4mc@group.calendar.google.com' + redirectUrl: 'http://localhost:3001/oauth2callback' \ No newline at end of file diff --git a/public/js/controllers/kendo.js b/public/js/controllers/kendo.js index 21cb801..53a7e68 100644 --- a/public/js/controllers/kendo.js +++ b/public/js/controllers/kendo.js @@ -1,29 +1,32 @@ angular.module("KendoDemos", ["kendo.directives"]) .controller("MyCtrl", function ($scope, $http) { + $scope.update = function () { + console.log("update") + } + + $scope.create = function () { + console.log("create") + } function getAuthURL() { $http({ method: 'get', url: '/events' }).then(function successCallback(response) { - window.open(response.data, '_blank') - }, function errorCallback(response) { - console.error(response) - }); - } - getAuthURL() + var res = response.data + if (res.result) { + if (res.result.status == "redirect") { + window.open(res.result.data, '_self') + } + } else { + console.info(response) + schedulerStart() + } - $scope.submitNewToken = function (valid) { - $http({ - method: 'post', - url: '/setToken', - data: { "code": $scope.clientToken } - }).then(function successCallback(response) { - console.log(response.data) - schedulerStart() }, function errorCallback(response) { console.error(response) }); } + getAuthURL() function schedulerStart() { $scope.schedulerOptions = { @@ -36,25 +39,29 @@ angular.module("KendoDemos", ["kendo.directives"]) "week", "month", ], - timezone: "Etc/UTC", + timezone: "Asia/Bangkok", dataSource: { batch: true, transport: { read: { url: "//localhost:3001/events", - dataType: "jsonp" + dataType: "jsonp", + type: "GET" }, update: { - url: "//demos.telerik.com/kendo-ui/service/tasks/update", - dataType: "jsonp" + url: "//localhost:3001/events", + dataType: "jsonp", + type: "PUT" }, create: { - url: "//demos.telerik.com/kendo-ui/service/tasks/create", - dataType: "jsonp" + url: "//localhost:3001/events", + dataType: "jsonp", + type: "POST" }, destroy: { - url: "//demos.telerik.com/kendo-ui/service/tasks/destroy", - dataType: "jsonp" + url: "//localhost:3001/events", + dataType: "jsonp", + type: "DELETE" }, parameterMap: function (options, operation) { if (operation !== "read" && options.models) { @@ -68,10 +75,10 @@ angular.module("KendoDemos", ["kendo.directives"]) fields: { taskId: { from: "TaskID" }, title: { from: "Title", defaultValue: "No title", validation: { required: true } }, - start: { type: "date", from: "Start" }, - end: { type: "date", from: "End" }, - startTimezone: { from: "StartTimezone" }, - endTimezone: { from: "EndTimezone" }, + start: { type: "datetime", from: "Start" }, + end: { type: "datetime", from: "End" }, + startTimezone: { from: "StartTimezone", defaultValue: "Asia/Bangkok" }, + endTimezone: { from: "EndTimezone", defaultValue: "Asia/Bangkok" }, description: { from: "Description" }, recurrenceId: { from: "RecurrenceID" }, recurrenceRule: { from: "RecurrenceRule" }, @@ -89,6 +96,7 @@ angular.module("KendoDemos", ["kendo.directives"]) ] } }, + editable: true, resources: [ { field: "ownerId", diff --git a/public/views/index.html b/public/views/index.html index 4478c83..3495715 100644 --- a/public/views/index.html +++ b/public/views/index.html @@ -7,7 +7,7 @@ - + @@ -27,22 +27,8 @@ - Back -
-
-
    -
  • -

    Put key here

    - - -
  • -
-
- -
-
{{dataItem.title}}
{{dataItem.title}}
-- libgit2 0.21.2