UNPKG

jive-sdk

Version:

Node.js SDK for Jive Software to assist with the development of add-ons

347 lines (301 loc) 12 kB
var jive = require("jive-sdk"); var url = require('url'); var util = require('util'); var sampleOauth = require('./routes/oauth/sampleOauth'); var q = require('q'); var querier = require('./query'); var metadataCollection = "basecampActivityMetadata"; var metadataStore = jive.service.persistence(); exports.getLastTimePulled = getLastTimePulled; exports.getMetadataByInstance = getMetadataByInstance; exports.pullActivity = pullActivity; exports.pullComments = pullComments; exports.updateLastTimePulled = updateLastTimePulled; exports.recordSyncFromJive = recordSyncFromJive; function extractActivity( parent, rawActivityEntry ) { var data = rawActivityEntry['data']; var description = data['rich_value'] || data['text'] || data['value']; var actor = { 'name' : rawActivityEntry['created_by']['name'], 'email' : '' }; var parentTitle = parent['title'] || parent['name'] || parent['text']; var parentType = parent['type']; var type = rawActivityEntry['type']; var title = ( type.charAt(0).toUpperCase() + type.slice(1) ) + ' by ' + actor['name']; if ( parent != rawActivityEntry ) { title += " @ " + parentTitle; } var object = { 'url' : rawActivityEntry['link'] || parent['link'], 'description' : description, 'title' : title }; var timestamp = rawActivityEntry['created_on']; var externalID = rawActivityEntry['type'] + '-' + (data[rawActivityEntry['type'] + '_id'] || data['item_id']); var parentData = parent['data']; var parentExternalID = parent['type'] + '-' + (parentData[parent['type'] + '_id'] || parentData['item_id']); var jiveID = undefined; if ( type == 'comment' ) { // try to find its jiveID, scan through parent object comments to try and find it var podioCommentID = data['comment_id']; var parentComments = parent['comments']; if ( parentComments ) { parentComments.forEach( function(comment) { if ( comment['comment_id'] == podioCommentID ) { jiveID = comment['external_id'] && comment['external_id'].indexOf('jive-') > - 1 ? comment['external_id'] : undefined; } }); } } var activity = { 'type' : rawActivityEntry['type'], 'description' : description, 'actor' : actor, 'object' : object, 'externalID' : externalID, 'parentExternalID' : parentExternalID, 'timestamp' : timestamp, 'jiveID' : jiveID }; // console.log(JSON.stringify(activity, null, 4)); return activity; } function getAllActivity(extstreamInstance, converter, activityType) { return getLastTimePulled(extstreamInstance, activityType).then(function (lastTimePulled) { var date = new Date(lastTimePulled); var query = "/stream/"; var config = extstreamInstance['config']; if (config && config['projectID'] != undefined) { var projectID = extstreamInstance['config']['projectID'] ; if (Number(projectID)) { // we have a project ID now .. make the query more specific ... query += "item/" + projectID; } } return querier.doGet(query, extstreamInstance).then(function (response) { var activities = response['entity']; var activityEntries = []; var addIt = function (extractedActivity) { console.log( "activity: type=" + extractedActivity.type + " d:'" + extractedActivity.description + "' t: '" + extractedActivity.title + "'" + " " + new Date(extractedActivity['timestamp']).getTime() + " " + date.getTime()) ; if (extractedActivity && new Date(extractedActivity['timestamp']).getTime() > date.getTime()) { console.log( "activity: post it!") ; activityEntries.push(extractedActivity); } }; if (!Number(projectID)) { // processing global stream ... activities.forEach(function (object) { var objectActivity = object['activity']; if (!objectActivity || objectActivity.length < 1) { addIt(extractActivity(object, object)); } else { // its the first time objectActivity.forEach(function (rawActivityEntry) { addIt(extractActivity(object, rawActivityEntry)); }); } }); } else { // processing specific Project stream .. var objectActivity = activities['activity']; if (!objectActivity || objectActivity.length < 1) { addIt(extractActivity(activities, activities)); } else { // its the first time objectActivity.forEach(function (rawActivityEntry) { addIt(extractActivity(activities, rawActivityEntry)); }); } } return converter(activityEntries, lastTimePulled, extstreamInstance); }); }).catch(function (err) { jive.logger.error('Error querying Podio', err); }); } function pullActivity(extstreamInstance, converter) { return getAllActivity(extstreamInstance, convertToActivities, 'activity'); } function pullComments(extstreamInstance) { return getAllActivity(extstreamInstance, convertToComments, 'comment'); } function convertToActivities(entity, lastTimePulled, instance) { var records = entity; var tempActivities = records.map(function (record) { if ( record['type'] == 'comment' ) { // comments handled elsewhere return null; } record['projectName'] = instance.config['project']; var json = getActivityJSON(record); if (!isNaN(json['podioCreatedDate'])) { lastTimePulled = Math.max(lastTimePulled, json['podioCreatedDate']); return json; } else { return null; } }); // now get rid of NULL entries in the array (these will be the comments ...) var numActivities = tempActivities.length; var activities = []; var activityCounter=0; if (numActivities > 0) { for (var i=(numActivities-1); i >= 0; i--) if (tempActivities[i] != null) activities[activityCounter++] = tempActivities[i]; } return updateLastTimePulled(instance, lastTimePulled, 'activity').thenResolve(activities); } function convertToComments(entity, lastTimePulled, instance) { var records = entity; var comments = []; var promise = q.resolve(null); records.forEach(function (record) { if (record['type'] == "comment" && !record['jiveID'] ) { var podioCommentID = record['externalID']; record['projectName'] = instance.config['project']; promise = promise.thenResolve( wasSynced(instance, podioCommentID).then(function (wasItSynced) { if (wasItSynced) { return; } var json = getCommentJSON(record); if (!isNaN(json['podioCreatedDate'])) { lastTimePulled = Math.max(lastTimePulled, json['podioCreatedDate']); } comments.push(json); })); } }); return promise.then(function() { return updateLastTimePulled(instance, lastTimePulled, 'comment').thenResolve(comments); }); } function getActivityJSON(record) { var createdDate = new Date(record['timestamp']).getTime(); return { "podioCreatedDate" : createdDate, "activity" : { "action":{ "name":"posted", "description": "New Activity" }, "actor": record['actor'], "object":{ "type":"website", "image" : "http://www.theappchamp.com/wp-content/uploads/2013/05/podioApp1.jpg", "url": record['object']['url'], "title": record['object']['title'], "description":record['object']['description'] }, "externalID" : record['externalID'] } } }; function getCommentJSON(record) { var createdDate = new Date(record['timestamp']).getTime(); var gName=""; var fName=""; var names = record['actor'] ['name'].split(" ") ; var email = record['actor']['email'] || ""; if (names.length) { gName=names[0]; fName = names[names.length - 1] ; } return { "podioCreatedDate" : createdDate, "author" : { name: { "givenName" : gName , "familyName" : fName } , "email" : email }, "content" : {"type" : "text/html", "text" : "<p>" + record['object']['description'] +"</p>"}, "type" : "comment", "externalID": '' + record['externalID'], "externalActivityID" : '' + record['parentExternalID'] } } function getMetadataByInstance(instance) { return metadataStore.find(metadataCollection, {'instanceID': instance['id']}).then(function (results) { if (results.length <= 0) { return null; } return results[0]; }); } function getLastTimePulled(instance, type) { return getMetadataByInstance(instance).then(function (metadata) { var lastTimePulled = metadata && metadata.lastTimePulled && metadata.lastTimePulled[type]; if (!lastTimePulled) { // set to something way before we were born! lastTimePulled = new Date("2013-08-05T16:26:53.664Z").getTime(); return updateLastTimePulled(instance, lastTimePulled, type).thenResolve(lastTimePulled); } return lastTimePulled; }); } function updateLastTimePulled(instance, lastTimePulled, type) { return getMetadataByInstance(instance).then(function (metadata) { var changed = false; if (!metadata) { metadata = { "instanceID": instance['id'] }; } if (!metadata.lastTimePulled) { metadata.lastTimePulled = {}; } if (!metadata.lastTimePulled[type]) { metadata.lastTimePulled[type] = lastTimePulled; changed = true; } else { if (metadata.lastTimePulled[type] < lastTimePulled) { changed = true; metadata.lastTimePulled[type] = lastTimePulled; } } if (changed) { return metadataStore.save(metadataCollection, instance['id'], metadata); } return metadata; }); } function recordSyncFromJive(instance, podioCommentID) { return getMetadataByInstance(instance).then(function (metadata) { if (!metadata) { metadata = {"instanceID": instance['id'], "syncs": []}; } if (!metadata.syncs) { metadata.syncs = []; } var changed = false; if (metadata.syncs.indexOf(podioCommentID) < 0) { metadata.syncs.push(podioCommentID); changed = true; } if (changed) { console.log( "Jive comment sync id='" + podioCommentID + "'") ; return metadataStore.save(metadataCollection, instance['id'], metadata); } return metadata; }); } function wasSynced(instance, podioCommentID) { return getMetadataByInstance(instance).then(function (metadata) { if (metadata && metadata.syncs && metadata.syncs.indexOf(podioCommentID) >= 0) { return true; } return false; }); }