aping-plugin-facebook
Version:
Facebook plugin for apiNG
705 lines (581 loc) • 29.9 kB
JavaScript
/**
@name: aping-plugin-facebook
@version: 0.7.8 (28-01-2016)
@author: Jonathan Hornung
@url: https://github.com/JohnnyTheTank/apiNG-plugin-facebook
@license: MIT
*/
"use strict";
angular.module("jtt_aping_facebook", ['jtt_facebook'])
.directive('apingFacebook', ['apingFacebookHelper', 'apingUtilityHelper', 'facebookFactory', 'facebookPagesImages', function (apingFacebookHelper, apingUtilityHelper, facebookFactory, facebookPagesImages) {
return {
require: '?aping',
restrict: 'A',
replace: 'false',
link: function (scope, element, attrs, apingController) {
var appSettings = apingController.getAppSettings();
var requests = apingUtilityHelper.parseJsonFromAttributes(attrs.apingFacebook, apingFacebookHelper.getThisPlatformString(), appSettings);
requests.forEach(function (request) {
//create helperObject for helper function call
var helperObject = {
model: appSettings.model,
showAvatar: request.showAvatar || false,
};
if (typeof appSettings.getNativeData !== "undefined") {
helperObject.getNativeData = appSettings.getNativeData;
} else {
helperObject.getNativeData = false;
}
//create requestObject for api request call
var requestObject = {
page: request.page,
access_token: apingUtilityHelper.getApiCredentials(apingFacebookHelper.getThisPlatformString(), "access_token"),
};
if (typeof request.items !== "undefined") {
requestObject.limit = request.items;
} else {
requestObject.limit = appSettings.items;
}
if (requestObject.limit === 0 || requestObject.limit === '0') {
return false;
}
// -1 is "no explicit limit". same for NaN value
if (requestObject.limit < 0 || isNaN(requestObject.limit)) {
requestObject.limit = undefined;
}
// the api has a limit of 100 items per request
if (requestObject.limit > 100) {
requestObject.limit = 100;
}
if (request.page) { //search for page id
switch (appSettings.model) {
case "social":
if (helperObject.showAvatar === true || helperObject.showAvatar === "true") {
facebookFactory.getPageById({
page: requestObject.page,
access_token: requestObject.access_token
}).then(function (_pageData) {
if (_pageData && _pageData.data && _pageData.data.id && _pageData.data.cover && _pageData.data.cover.source) {
facebookPagesImages[_pageData.data.id] = _pageData.data.cover.source;
}
facebookFactory.getPostsFromPageById(requestObject)
.then(function (_data) {
if (_data) {
apingController.concatToResults(apingFacebookHelper.getObjectByJsonData(_data, appSettings));
}
});
});
} else {
facebookFactory.getPostsFromPageById(requestObject)
.then(function (_data) {
if (_data) {
apingController.concatToResults(apingFacebookHelper.getObjectByJsonData(_data, appSettings));
}
});
}
break;
case "video":
if (helperObject.showAvatar === true || helperObject.showAvatar === "true") {
facebookFactory.getPageById({
page: requestObject.page,
access_token: requestObject.access_token
}).then(function (_pageData) {
if (_pageData && _pageData.data && _pageData.data.id && _pageData.data.cover && _pageData.data.cover.source) {
facebookPagesImages[_pageData.data.id] = _pageData.data.cover.source;
}
facebookFactory.getVideosFromPageById(requestObject)
.then(function (_data) {
if (_data) {
apingController.concatToResults(apingFacebookHelper.getObjectByJsonData(_data, appSettings));
}
});
});
} else {
facebookFactory.getVideosFromPageById(requestObject)
.then(function (_data) {
if (_data) {
apingController.concatToResults(apingFacebookHelper.getObjectByJsonData(_data, appSettings));
}
});
}
break;
case "image":
facebookFactory.getPhotosFromPageById(requestObject)
.then(function (_data) {
if (_data) {
apingController.concatToResults(apingFacebookHelper.getObjectByJsonData(_data, appSettings));
}
});
break;
case "event":
if (helperObject.showAvatar === true || helperObject.showAvatar === "true") {
facebookFactory.getPageById({
page: requestObject.page,
access_token: requestObject.access_token
}).then(function (_pageData) {
if (_pageData && _pageData.data && _pageData.data.id && _pageData.data.cover && _pageData.data.cover.source) {
facebookPagesImages[_pageData.data.id] = _pageData.data.cover.source;
}
facebookFactory.getEventsFromPageById(requestObject)
.then(function (_data) {
if (_data) {
apingController.concatToResults(apingFacebookHelper.getObjectByJsonData(_data, appSettings));
}
});
});
} else {
facebookFactory.getEventsFromPageById(requestObject)
.then(function (_data) {
if (_data) {
apingController.concatToResults(apingFacebookHelper.getObjectByJsonData(_data, appSettings));
}
});
}
break;
}
}
});
}
}
}]);;"use strict";
angular.module("jtt_aping_facebook")
.service('apingFacebookHelper', ['apingModels', 'apingTimeHelper', 'apingUtilityHelper', 'facebookPagesImages', function (apingModels, apingTimeHelper, apingUtilityHelper, facebookPagesImages) {
this.getThisPlatformString = function () {
return "facebook";
};
this.getThisPlatformLink = function () {
return "https://facebook.com/";
};
/**
* returns object with attributes "width" and "height" of video
*
* @param _format {Object}
* @returns {Object}
*/
this.getRatioFromFormatObject = function (_format) {
var ratio = {
width: undefined,
height: undefined,
};
if (typeof _format !== "undefined" && _format.constructor === Array) {
angular.forEach(_format, function (value, key) {
if (typeof value.filter !== "undefined") {
if (value.filter === "native") {
if (typeof value.width !== "undefined") {
ratio.width = value.width;
}
if (typeof value.height !== "undefined") {
ratio.height = value.height;
}
}
}
});
return ratio;
}
};
/**
* returns the difference between two integers
*
* @param _int1 {number}
* @param _int2 {number}
* @returns {number}
*/
this.getDifference = function (_int1, _int2) {
if (_int1 > _int2) {
return _int1 - _int2;
} else {
return _int2 - _int1;
}
};
/**
* returns an object with images urls and dimensions
*
* @param _array {Array}
* @returns {Object}
*/
this.getImagesFromArray = function (_array, _imgPropertyName) {
if (angular.isUndefined(_imgPropertyName)) {
_imgPropertyName = "source";
}
var that = this;
var returnObject = {
thumb_url: undefined,
thumb_width: undefined, // best case 200px (min)
thumb_height: undefined,
img_url: undefined,
img_width: undefined, // best case 700px
img_height: undefined,
native_url: undefined,
native_width: undefined,
native_height: undefined,
};
if (_array.constructor === Array) {
angular.forEach(_array, function (value, key) {
if (angular.isDefined(value[_imgPropertyName])) {
if (angular.isUndefined(returnObject.thumb_url)) {
returnObject.thumb_url = value[_imgPropertyName];
returnObject.thumb_width = value.width;
returnObject.thumb_height = value.height;
} else {
if (
that.getDifference(returnObject.thumb_width, 200) > that.getDifference(value.width, 200)
&&
value.width >= 200
) {
returnObject.thumb_url = value[_imgPropertyName];
returnObject.thumb_width = value.width;
returnObject.thumb_height = value.height;
}
}
if (angular.isUndefined(returnObject.img_url)) {
returnObject.img_url = value[_imgPropertyName];
returnObject.img_width = value.width;
returnObject.img_height = value.height;
} else {
if (
that.getDifference(returnObject.img_width, 700) > that.getDifference(value.width, 700)
) {
returnObject.img_url = value[_imgPropertyName];
returnObject.img_width = value.width;
returnObject.img_height = value.height;
}
}
if (angular.isUndefined(returnObject.native_url)) {
returnObject.native_url = value[_imgPropertyName];
returnObject.native_width = value.width;
returnObject.native_height = value.height;
} else {
if (
value.width > returnObject.native_width
) {
returnObject.native_url = value[_imgPropertyName];
returnObject.native_width = value.width;
returnObject.native_height = value.height;
}
}
}
});
}
return returnObject;
};
this.getObjectByJsonData = function (_data, _helperObject) {
var requestResults = [];
if (_data) {
var _this = this;
if (_data.data && _data.data.data) {
angular.forEach(_data.data.data, function (value, key) {
var tempResult;
if (_helperObject.getNativeData === true || _helperObject.getNativeData === "true") {
tempResult = value;
} else {
tempResult = _this.getItemByJsonData(value, _helperObject);
}
if (tempResult) {
requestResults.push(tempResult);
}
});
}
}
return requestResults;
};
this.getItemByJsonData = function (_item, _helperObject) {
var returnObject = {};
if (_item && _helperObject.model) {
switch (_helperObject.model) {
case "social":
returnObject = this.getSocialItemByJsonData(_item, _helperObject);
break;
case "video":
returnObject = this.getVideoItemByJsonData(_item, _helperObject);
break;
case "image":
returnObject = this.getImageItemByJsonData(_item, _helperObject);
break;
case "event":
returnObject = this.getEventItemByJsonData(_item, _helperObject);
break;
default:
return false;
}
}
return returnObject;
};
this.getSocialItemByJsonData = function (_item, _helperObject) {
var socialObject = apingModels.getNew("social", this.getThisPlatformString());
angular.extend(socialObject, {
blog_name: _item.from.name,
blog_id: _item.from.id,
blog_link: this.getThisPlatformLink() + _item.from.id + "/",
intern_type: _item.type,
intern_id: _item.id,
thumb_url: _item.picture,
img_url: _item.full_picture,
native_url: _item.full_picture,
timestamp: apingTimeHelper.getTimestampFromDateString(_item.created_time, 1000, 3600 * 1000)
});
socialObject.date_time = new Date(socialObject.timestamp);
switch (_item.type) {
case 'photo':
socialObject.type = "image";
socialObject.post_url = _item.link;
socialObject.text = _item.message;
break;
case 'status':
socialObject.type = "post";
break;
case 'link':
socialObject.type = "link";
socialObject.post_url = this.getThisPlatformLink() + _item.id + "/";
socialObject.content_url = _item.link;
socialObject.caption = _item.name;
break;
case 'video':
socialObject.type = "video";
if (_item.name) {
socialObject.caption = _item.name;
}
break;
case 'event':
socialObject.type = "event";
socialObject.text = _item.description;
socialObject.caption = _item.caption || _item.name || undefined;
break;
}
if (!socialObject.text) {
socialObject.text = _item.message;
}
if (!socialObject.text) {
socialObject.text = _item.name;
}
if (!socialObject.post_url) {
if (!_item.id) {
socialObject.post_url = _item.link;
} else {
socialObject.post_url = this.getThisPlatformLink() + _item.id + "/";
}
}
if ((_helperObject.showAvatar === true || _helperObject.showAvatar === "true") && !socialObject.img_url) {
if (facebookPagesImages[_item.from.id]) {
socialObject.img_url = facebookPagesImages[_item.from.id];
}
}
return socialObject;
};
this.getVideoItemByJsonData = function (_item, _helperObject) {
var videoObject = apingModels.getNew("video", this.getThisPlatformString());
angular.extend(videoObject, {
blog_name: _item.from.name,
blog_id: _item.from.id,
blog_link: this.getThisPlatformLink() + _item.from.id + "/",
intern_id: _item.id,
post_url: _item.permalink_url,
timestamp: apingTimeHelper.getTimestampFromDateString(_item.created_time, 1000, 3600 * 1000),
text: _item.description,
markup: _item.embed_html || undefined,
source: _item.source || undefined,
});
videoObject.date_time = new Date(videoObject.timestamp);
if (typeof _item.length !== "undefined") {
videoObject.length = _item.length;
}
if (typeof _item.format !== "undefined") {
if (_item.format.length > 0) {
var tempImageArray = this.getImagesFromArray(_item.format, "picture");
tempImageArray.thumb_width = undefined;
tempImageArray.thumb_height = undefined;
tempImageArray.img_width = undefined;
tempImageArray.img_height = undefined;
tempImageArray.native_width = undefined;
tempImageArray.native_height = undefined;
angular.extend(videoObject, tempImageArray);
var ratio = this.getRatioFromFormatObject(_item.format);
if (typeof ratio.width !== "undefined") {
videoObject.width = ratio.width;
}
if (typeof ratio.height !== "undefined") {
videoObject.height = ratio.height;
}
}
}
if ((_helperObject.showAvatar === true || _helperObject.showAvatar === "true") && !videoObject.img_url) {
if (facebookPagesImages[_item.from.id]) {
videoObject.img_url = facebookPagesImages[_item.from.id];
}
}
return videoObject;
};
this.getImageItemByJsonData = function (_item, _helperObject) {
var imageObject = apingModels.getNew("image", this.getThisPlatformString());
angular.extend(imageObject, {
blog_name: _item.from.name,
blog_id: _item.from.id,
blog_link: this.getThisPlatformLink() + _item.from.id + "/",
intern_id: _item.id,
post_url: _item.link,
timestamp: apingTimeHelper.getTimestampFromDateString(_item.created_time, 1000, 3600 * 1000),
text: _item.name || undefined,
source: _item.images || undefined,
});
imageObject.date_time = new Date(imageObject.timestamp);
if (_item.images.length > 0) {
var tempImageArray = this.getImagesFromArray(_item.images, "source");
angular.extend(imageObject, tempImageArray);
}
return imageObject;
};
this.getEventItemByJsonData = function (_item, _helperObject) {
var eventObject = apingModels.getNew("event", this.getThisPlatformString());
angular.extend(eventObject, {
artist_name: _item.owner.name,
artist_id: _item.owner.id,
artist_link: this.getThisPlatformLink() + _item.owner.id + "/",
intern_id: _item.id,
event_url: this.getThisPlatformLink() + _item.owner.id + "_" + _item.id + "/",
ticket_url: _item.ticket_uri || undefined,
start_timestamp: apingTimeHelper.getTimestampFromDateString(_item.start_time, 1000, 3600 * 1000),
end_timestamp: _item.end_time ? apingTimeHelper.getTimestampFromDateString(_item.end_time, 1000, 3600 * 1000) : undefined,
caption: _item.name || undefined,
text: _item.description || undefined,
img_url: _item.cover ? _item.cover.source : undefined,
});
if (eventObject.start_timestamp) {
eventObject.start_date_time = new Date(eventObject.start_timestamp);
}
if (eventObject.end_timestamp) {
eventObject.end_date_time = new Date(eventObject.end_timestamp);
}
if (_item.place) {
eventObject.place_name = _item.place.name || undefined;
if (_item.place.location) {
eventObject.city = _item.place.location.city || undefined;
eventObject.country = _item.place.location.country || undefined;
eventObject.latitude = _item.place.location.latitude || undefined;
eventObject.longitude = _item.place.location.longitude || undefined;
eventObject.street = _item.place.location.street || undefined;
eventObject.zip = _item.place.location.zip || undefined;
}
}
if ((_helperObject.showAvatar === true || _helperObject.showAvatar === "true") && !eventObject.img_url) {
if (facebookPagesImages[_item.from.id]) {
eventObject.img_url = facebookPagesImages[_item.from.id];
}
}
return eventObject;
};
}]);;"use strict";
angular.module("jtt_aping_facebook")
.config(['$provide', function ($provide) {
$provide.value("facebookPagesImages", {});
}]);
;"use strict";
angular.module("jtt_facebook", [])
.factory('facebookFactory', ['$http', 'facebookSearchDataService', function ($http, facebookSearchDataService) {
var facebookFactory = {};
facebookFactory.getPostsFromPageById = function (_params) {
var facebookSearchData = facebookSearchDataService.getNew("postsFromPageById", _params);
return $http({
method: 'GET',
url: facebookSearchData.url,
params: facebookSearchData.object,
});
};
facebookFactory.getPhotosFromPageById = function (_params) {
var facebookSearchData = facebookSearchDataService.getNew("photosFromPageById", _params);
return $http({
method: 'GET',
url: facebookSearchData.url,
params: facebookSearchData.object,
});
};
facebookFactory.getVideosFromPageById = function (_params) {
var facebookSearchData = facebookSearchDataService.getNew("videosFromPageById", _params);
return $http({
method: 'GET',
url: facebookSearchData.url,
params: facebookSearchData.object,
});
};
facebookFactory.getEventsFromPageById = function (_params) {
var facebookSearchData = facebookSearchDataService.getNew("eventsFromPageById", _params);
return $http({
method: 'GET',
url: facebookSearchData.url,
params: facebookSearchData.object,
});
};
facebookFactory.getPageById = function (_params) {
var facebookSearchData = facebookSearchDataService.getNew("pageById", _params);
return $http({
method: 'GET',
url: facebookSearchData.url,
params: facebookSearchData.object,
});
};
return facebookFactory;
}])
.service('facebookSearchDataService', function () {
this.getApiBaseUrl = function (_params) {
var version;
if(_params && typeof _params.version !== "undefined") {
version = _params.version+"/";
} else {
version = "v2.5/";
}
return "https://graph.facebook.com/"+version;
};
this.fillDataInObjectByList = function(_object, _params, _list) {
angular.forEach(_list, function (value, key) {
if(typeof _params[value] !== "undefined") {
_object.object[value] = _params[value];
}
});
return _object;
};
this.getNew = function (_type, _params) {
var facebookSearchData = {
object: {
access_token:_params.access_token || undefined,
},
url: "",
};
if (typeof _params.limit !== "undefined") {
facebookSearchData.object.limit = _params.limit;
}
switch (_type) {
case "postsFromPageById":
facebookSearchData.object.fields = "id,message,story,created_time,full_picture,from,link,description,type,shares,source,picture,object_id";
facebookSearchData = this.fillDataInObjectByList(facebookSearchData, _params, [
'__paging_token', 'until', 'since', '__previous'
]);
facebookSearchData.url = this.getApiBaseUrl()+_params.page+"/posts?";
break;
case "photosFromPageById":
facebookSearchData.object.fields = "id,created_time,from,link,picture,album,name,images,width,height";
facebookSearchData = this.fillDataInObjectByList(facebookSearchData, _params, [
'before', 'after'
]);
facebookSearchData.url = this.getApiBaseUrl()+_params.page+"/photos?";
break;
case "videosFromPageById":
facebookSearchData.object.fields = "id,created_time,from,description,source,picture,format,title,embed_html,permalink_url,length";
facebookSearchData = this.fillDataInObjectByList(facebookSearchData, _params, [
'before', 'after'
]);
facebookSearchData.url = this.getApiBaseUrl()+_params.page+"/videos?";
break;
case "eventsFromPageById":
facebookSearchData.object.fields = "id,owner,description,picture{url},end_time,name,cover,category,place,start_time,ticket_uri";
facebookSearchData = this.fillDataInObjectByList(facebookSearchData, _params, [
'before', 'after'
]);
facebookSearchData.url = this.getApiBaseUrl()+_params.page+"/events?";
break;
case "pageById":
facebookSearchData.object.fields = "cover,link,picture{url},username,name";
facebookSearchData.object.limit = undefined;
facebookSearchData.url = this.getApiBaseUrl()+_params.page+"/";
break;
}
return facebookSearchData;
};
});