UNPKG

node-red-node-web-nodes

Version:

A collection of Node-RED nodes for popular web services.

777 lines (742 loc) 31.9 kB
/** * Copyright 2015 IBM Corp. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ module.exports = function(RED) { "use strict"; var request = require('request'); var clone = require("clone"); function GooglePlusNode(n) { RED.nodes.createNode(this,n); this.google = RED.nodes.getNode(n.google); var node = this; this.on('input', function(msg){ var url, queryParams, headers, reqType, action, accessToken; reqType = n.reqType || msg.reqType; action = n.action || msg.action; var query = n.query || msg.query; var collection = n.collection || msg.collection; var userId = n.userId || msg.userId || 'me'; var activityId = n.activityId || msg.activityId; var commentId = n.commentId || msg.commentId; var language = n.language || msg.language; var maxResults = n.maxResults || msg.maxResults; var pageToken = n.pageToken || msg.pageToken; var orderBy = n.orderBy || msg.orderBy; var sortOrder = n.sortOrder || msg.sortOrder; function processInput(){ queryParams = {}; headers = { Authorization: 'Bearer ' + accessToken }; if(reqType === 'comments'){ if(action === 'list'){ commentsListRequest(function(response){ if(response){ node.send(response); } }); } else{ //id request commentsIdRequest(function(response){ if(response){ node.send(response); } }); } } else if (reqType === 'activities'){ if(action === 'search'){ activitiesSearchRequest(function(response){ if(response){ node.send(response); } }); } else if(action === 'list'){ activitiesListRequest(function(response){ if(response){ node.send(response); } }); } else{ //id request activitiesIdRequest(function(response){ if(response){ node.send(response); } }); } } else{ //people request if(action === 'search'){ peopleSearchRequest(function(response){ if(response){ node.send(response); } }); } else if(action === 'list'){ peopleListRequest(function(response){ if(response){ node.send(response); } }); } else{ //id request peopleIdRequest(function(response){ if(response){ node.send(response); } }); } } } function peopleIdRequest(cb){ url = 'https://www.googleapis.com/plus/v1/people/' + userId; sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handlePeopleIdResponse(JSON.parse(data), function(msg){ cb(msg); }); } }); } function peopleSearchRequest(cb){ url = 'https://www.googleapis.com/plus/v1/people'; if(!query){ var error = { code: 400, status: 'MISSING_VALUES', message: 'Please supply a query.' }; throwNodeError(error, msg); return; } queryParams.query = query; if(language){ queryParams.language = language; } if(maxResults){ queryParams.maxResults = maxResults; } if(pageToken){ queryParams.pageToken = pageToken; } sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handlePeopleSearchResponse(JSON.parse(data), function(msg){ cb(msg); }); } }); } function peopleListRequest(cb){ if(!collection){ var error = { code: 400, status: 'MISSING_VALUES', message: 'Please supply a collection.' }; throwNodeError(error, msg); return; } url = 'https://www.googleapis.com/plus/v1/people/' + userId + '/people' + '/' + collection; if(maxResults){ queryParams.maxResults = maxResults; } if(pageToken){ queryParams.pageToken = pageToken; } if(orderBy){ queryParams.orderBy = orderBy; } sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handlePeopleListResponse(JSON.parse(data), function(msg){ cb(msg); }); } }); } function activitiesIdRequest(cb){ if(!activityId){ var error = { code: 400, status: 'MISSING_VALUES', message: 'Please supply an activityId.' }; throwNodeError(error, msg); return; } url = 'https://www.googleapis.com/plus/v1/activities/' + activityId; sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handleActivitiesIdRequest(JSON.parse(data), function(msg){ cb(msg); }); } }); } function activitiesSearchRequest(cb){ if(!query){ var error = { code: 400, status: 'MISSING_VALUES', message: 'Please supply a query.' }; throwNodeError(error, msg); return; } url = 'https://www.googleapis.com/plus/v1/activities'; queryParams.query = query; if(language){ queryParams.language = language; } if(maxResults){ queryParams.maxResults = maxResults; } if(pageToken){ queryParams.pageToken = pageToken; } if(orderBy){ queryParams.orderBy = orderBy; } sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handleActivitiesSearchRequest(JSON.parse(data), function(msg){ cb(msg); }); } }); } function activitiesListRequest(cb){ if(!collection){ var error = { code: 400, status: 'MISSING_VALUES', message: 'Please supply a collection.' }; throwNodeError(error, msg); return; } url = 'https://www.googleapis.com/plus/v1/people/' + userId + '/activities/' + collection; if(maxResults){ queryParams.maxResults = maxResults; } if(pageToken){ queryParams.pageToken = pageToken; } sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handleActivitiesListRequest(JSON.parse(data), function(msg){ cb(msg); }); } }); } function commentsIdRequest(cb){ if(!commentId){ var error = { code: 400, status: 'MISSING_VALUES', message: 'Please supply a commentId.' }; throwNodeError(error, msg); return; } url = 'https://www.googleapis.com/plus/v1/comments/' + commentId; sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handleCommentsIdRequest(JSON.parse(data), function(msg){ cb(msg); }); } }); } function commentsListRequest(cb){ if(!activityId){ var error = { code: 400, status: 'MISSING_VALUES', message: 'Please supply an activityId.' }; throwNodeError(error, msg); return; } url = 'https://www.googleapis.com/plus/v1/activities/' + activityId + '/comments'; if(maxResults){ queryParams.maxResults = maxResults; } if(pageToken){ queryParams.pageToken = pageToken; } if(sortOrder){ queryParams.sortOrder = sortOrder; } sendReqToGoogle(function(err, data){ if(err){ throwNodeError({ code: 500, status: err, message: err }, msg); return; } else{ handleCommentsListRequest(JSON.parse(data), function(msg){ cb(msg); }); } }); } function handlePeopleIdResponse(data, cb){ if(data.hasOwnProperty('error')){ var err = { code: data.error.code, status: data.error.errors[0].reason, message: data.error.message }; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = data.displayName; newMsg.description = data.displayName; newMsg.data = data; newMsg.userid = data.id; newMsg.payload = { displayName: data.displayName, name: data.name, gender: data.gender, birthday: data.birthday, nickname: data.nickname, occupation: data.occupation, skills: data.skills, url: data.url, aboutMe: data.aboutMe, relationshipStatus: data.relationshipStatus, urls: data.urls, organizations: data.organizations, placesLived: data.placesLived, tagline: data.tagline, emails: data.emails, image: data.image.url, isPlusUser: data.isPlusUser, status: 'OK' }; cb(newMsg); } } function handlePeopleSearchResponse(data, cb){ if(data.hasOwnProperty('error')){ var err = { code: data.error.code, status: data.error.errors[0].reason, message: data.error.message }; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = data.title; newMsg.description = data.items.length + ' results returned'; newMsg.data = data; newMsg.payload = { results: [], nextPageToken: data.nextPageToken, status: 'OK' }; newMsg.nextPageToken = data.nextPageToken; for(var i = 0; i < data.items.length; i++){ newMsg.payload.results.push({ id: data.items[i].id, displayName: data.items[i].displayName, url: data.items[i].url, image: data.items[i].image.url }); } cb(newMsg); } } function handlePeopleListResponse(data, cb){ if(data.hasOwnProperty('error')){ var err = { code: data.error.code, status: data.error.errors[0].reason, message: data.error.message }; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = data.title; newMsg.description = data.items.length + ' results returned'; newMsg.data = data; newMsg.payload = { results: [], nextPageToken: data.nextPageToken, status: 'OK' }; newMsg.nextPageToken = data.nextPageToken; for(var i = 0; i < data.items.length; i++){ newMsg.payload.results.push({ id: data.items[i].id, displayName: data.items[i].displayName, url: data.items[i].url, image: data.items[i].image.url }); } cb(newMsg); } } function handleActivitiesIdRequest(data, cb){ if(data.hasOwnProperty('error')){ var err = { code: data.error.code, status: data.error.errors[0].reason, message: data.error.message }; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = data.title; newMsg.payload = { id: data.id, url: data.url, actor: { id: data.actor.id, displayName: data.actor.displayName }, verb: data.verb, published: data.published, updated: data.updated, object: { objectType: data.object.objectType, id: data.object.id, actor: data.object.actor, content: data.object.content, originalContent: data.object.originalContent, url: data.object.url, replies: data.object.replies.totalItems, plusoners: data.object.plusoners.totalItems, }, location: { geocode: data.geocode, address: data.address, radius: data.radius, placeId: data.placeId, placeName: data.placeName }, status: 'OK' }; newMsg.description = newMsg.payload.actor.displayName + ', ' + newMsg.payload.verb + ', ' + newMsg.payload.object.id; newMsg.activityId = data.id; cb(newMsg); } } function handleActivitiesSearchRequest(data, cb){ if(data.hasOwnProperty('error')){ var err = { code: data.error.code, status: data.error.errors[0].reason, message: data.error.message }; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = data.title; newMsg.payload = { results: [], nextPageToken: data.nextPageToken, status: 'OK' }; newMsg.nextPageToken = data.nextPageToken; for(var i = 0; i < data.items.length; i++){ newMsg.payload.results.push({ id: data.items[i].id, url: data.items[i].url, actor: { id: data.items[i].actor.id, displayName: data.items[i].actor.displayName }, verb: data.items[i].verb, published: data.items[i].published, updated: data.items[i].updated, object: { objectType: data.items[i].object.objectType, id: data.items[i].object.id, actor: data.items[i].object.actor, content: data.items[i].object.content, originalContent: data.items[i].object.originalContent, url: data.items[i].object.url, replies: data.items[i].object.replies.totalItems, plusoners: data.items[i].object.plusoners.totalItems, }, location: { geocode: data.items[i].geocode, address: data.items[i].address, radius: data.items[i].radius, placeId: data.items[i].placeId, placeName: data.items[i].placeName } }); } cb(newMsg); } } function handleActivitiesListRequest(data, cb){ if(data.hasOwnProperty('error')){ var err = { code: data.error.code, status: data.error.errors[0].reason, message: data.error.message }; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = data.title; newMsg.payload = { results: [], nextPageToken: data.nextPageToken, status: 'OK' }; newMsg.nextPageToken = data.nextPageToken; for(var i = 0; i < data.items.length; i++){ newMsg.payload.results.push({ id: data.items[i].id, url: data.items[i].url, actor: { id: data.items[i].actor.id, displayName: data.items[i].actor.displayName }, verb: data.items[i].verb, published: data.items[i].published, updated: data.items[i].updated, object: { objectType: data.items[i].object.objectType, id: data.items[i].object.id, actor: data.items[i].object.actor, content: data.items[i].object.content, originalContent: data.items[i].object.originalContent, url: data.items[i].object.url, replies: data.items[i].object.replies.totalItems, plusoners: data.items[i].object.plusoners.totalItems, }, location: { geocode: data.items[i].geocode, address: data.items[i].address, radius: data.items[i].radius, placeId: data.items[i].placeId, placeName: data.items[i].placeName } }); } cb(newMsg); } } function handleCommentsIdRequest(data, cb){ if(data.hasOwnProperty('error')){ var err = { code: data.error.code, status: data.error.errors[0].reason, message: data.error.message }; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = 'Comment ' + data.id; newMsg.payload = { id: data.id, actor: { id: data.actor.id, displayName: data.actor.displayName }, verb: data.verb, object: { objectType: data.object.objectType, content: data.object.content, originalContent: data.object.originalContent }, published: data.published, updated: data.updated, inReplyTo: data.inReplyTo, plusoners: data.plusoners.totalItems, status: 'OK' }; newMsg.description = data.object.originalContent; newMsg.commentId = data.id; cb(newMsg); } } function handleCommentsListRequest(data, cb){ if(data.hasOwnProperty('error')){ var err = {}; err.message = data.error.message; err.code = data.error.code; err.status = data.error.errors[0].reason; throwNodeError(err, msg); return; }else{ var newMsg = cloneMsg(msg); //quick clone msg newMsg.data = data; newMsg.title = data.title; newMsg.payload = { results: [], nextPageToken: data.nextPageToken, status: 'OK' }; newMsg.nextPageToken = data.nextPageToken; for(var i = 0; i < data.items.length; i++){ newMsg.payload.results.push({ id: data.items[i].id, actor: { id: data.items[i].actor.id, displayName: data.items[i].actor.displayName }, verb: data.items[i].verb, object: { objectType: data.items[i].object.objectType, content: data.items[i].object.content, originalContent: data.items[i].object.originalContent }, published: data.items[i].published, updated: data.items[i].updated, inReplyTo: data.items[i].inReplyTo, plusoners: data.items[i].plusoners.totalItems }); } cb(newMsg); } } function sendReqToGoogle(cb){ request.get({ url: url, headers: headers, qs: queryParams, method: "GET" }, function(err, resp, body){ cb(err, body); }); } var curTime = new Date().getTime() / 1000; if(node.google && node.google.credentials){ var expireTime = node.google.credentials.expireTime; var expired = (curTime > expireTime); if(expired){ console.log('expired token'); node.google.refreshToken(function(){ console.log("refreshed"); accessToken = node.google.credentials.accessToken; processInput(); }); } else{ accessToken = node.google.credentials.accessToken; processInput(); } } else if(msg.credentials && msg.credentials.hasOwnProperty('accessToken')){ /*if(msg.credentials.hasOwnProperty('refreshToken') && msg.credentials.hasOwnProperty('expireTime')){ } else if (msg.credentials.hasOwnProperty('refreshToken')){ } else{ */ accessToken = msg.credentials.accessToken; //} } else if(msg.accessToken){ accessToken = msg.accessToken; } else{ throwNodeError({ code: 400, status: 'MISSING_VALUES', message: 'Please provide an accessToken.' }, msg); return; } }); function throwNodeError(err, msg){ node.status({fill:"red",shape:"ring",text:"failed"}); msg.error = err; node.error(err, msg); return; } } RED.nodes.registerType("google plus", GooglePlusNode); function cloneMsg(msg){ var req = msg.req; var res = msg.res; delete msg.req; delete msg.res; var m = clone(msg); if (req) { m.req = req; msg.req = req; } if (res) { m.res = res; msg.res = res; } return m; } };