Newer
Older
Thomas Steur
a validé
/*!
* Piwik - free/libre analytics platform
Thomas Steur
a validé
*
* @link http://piwik.org
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
*/
Thomas Steur
a validé
(function () {
angular.module('piwikApp.service').factory('piwikApi', piwikApiService);
Thomas Steur
a validé
piwikApiService.$inject = ['$http', '$q', '$rootScope', 'piwik', '$window'];
Thomas Steur
a validé
function piwikApiService ($http, $q, $rootScope, piwik, $window) {
var url = 'index.php';
var format = 'json';
var getParams = {};
var postParams = {};
var allRequests = [];
/**
* Adds params to the request.
* If params are given more then once, the latest given value is used for the request
*
* @param {object} params
* @return {void}
*/
function addParams (params) {
if (typeof params == 'string') {
params = piwik.broadcast.getValuesFromUrl(params);
}
Thomas Steur
a validé
Thomas Steur
a validé
for (var key in params) {
getParams[key] = params[key];
}
Thomas Steur
a validé
}
Thomas Steur
a validé
function reset () {
getParams = {};
postParams = {};
Thomas Steur
a validé
}
Thomas Steur
a validé
function isErrorResponse(response) {
return response && response.result == 'error';
}
Thomas Steur
a validé
function createResponseErrorNotification(response, options) {
diosmosis
a validé
if (response.message
&& options.createErrorNotification
) {
Thomas Steur
a validé
var UI = require('piwik/UI');
var notification = new UI.Notification();
notification.show(response.message, {
context: 'error',
type: 'toast',
id: 'ajaxHelper',
placeat: options.placeat
});
notification.scrollToNotification();
}
}
Thomas Steur
a validé
/**
* Send the request
* @return $promise
*/
function send (options) {
if (!options) {
options = {};
}
Thomas Steur
a validé
diosmosis
a validé
if (options.createErrorNotification === undefined) {
options.createErrorNotification = true;
}
function onSuccess(response)
{
response = response.data;
Thomas Steur
a validé
} else if (isErrorResponse(response)) {
Thomas Steur
a validé
Thomas Steur
a validé
createResponseErrorNotification(response, options);
return $q.reject(response.message || null);
Thomas Steur
a validé
} else {
Thomas Steur
a validé
}
}
function onError(response)
{
var message = 'Something went wrong';
if (response && (response.status === 0 || response.status === -1)) {
message = 'Request was possibly aborted';
}
return $q.reject(message);
}
var deferred = $q.defer(),
requestPromise = deferred.promise;
Thomas Steur
a validé
var headers = {
'Content-Type': 'application/x-www-form-urlencoded',
// ie 8,9,10 caches ajax requests, prevent this
'cache-control': 'no-cache'
};
Thomas Steur
a validé
Thomas Steur
a validé
var ajaxCall = {
method: 'POST',
url: url,
responseType: format,
params: _mixinDefaultGetParams(getParams),
data: $.param(getPostParams(postParams)),
timeout: requestPromise,
headers: headers
};
Thomas Steur
a validé
var promise = $http(ajaxCall).then(onSuccess, onError);
Thomas Steur
a validé
// we can't modify requestPromise directly and add an abort method since for some reason it gets
// removed after then/finally/catch is called.
var addAbortMethod = function (to, deferred) {
Thomas Steur
a validé
return {
then: function () {
return addAbortMethod(to.then.apply(to, arguments), deferred);
Thomas Steur
a validé
},
Thomas Steur
a validé
'finally': function () {
return addAbortMethod(to.finally.apply(to, arguments), deferred);
Thomas Steur
a validé
},
Thomas Steur
a validé
'catch': function () {
return addAbortMethod(to.catch.apply(to, arguments), deferred);
Thomas Steur
a validé
},
abort: function () {
Thomas Steur
a validé
return this;
}
};
};
var request = addAbortMethod(promise, deferred);
Thomas Steur
a validé
allRequests.push(request);
Thomas Steur
a validé
return request;
}
Thomas Steur
a validé
Thomas Steur
a validé
/**
* Get the parameters to send as POST
*
* @param {object} params parameter object
* @return {object}
* @private
*/
function getPostParams (params) {
params.token_auth = piwik.token_auth;
return params;
}
Thomas Steur
a validé
Thomas Steur
a validé
/**
* Mixin the default parameters to send as GET
*
* @param {object} getParamsToMixin parameter object
* @return {object}
* @private
*/
function _mixinDefaultGetParams (getParamsToMixin) {
diosmosis
a validé
var segment = piwik.broadcast.getValueFromHash('segment', $window.location.href.split('#')[1]);
// we have to decode the value manually because broadcast will not decode anything itself. if we don't,
// angular will encode it again before sending the value in an HTTP request.
segment = decodeURIComponent(segment);
Thomas Steur
a validé
var defaultParams = {
idSite: piwik.idSite || piwik.broadcast.getValueFromUrl('idSite'),
period: piwik.period || piwik.broadcast.getValueFromUrl('period'),
diosmosis
a validé
segment: segment
Thomas Steur
a validé
};
Thomas Steur
a validé
Thomas Steur
a validé
// never append token_auth to url
if (getParamsToMixin.token_auth) {
getParamsToMixin.token_auth = null;
delete getParamsToMixin.token_auth;
}
Thomas Steur
a validé
Thomas Steur
a validé
for (var key in defaultParams) {
if (!getParamsToMixin[key] && !postParams[key] && defaultParams[key]) {
getParamsToMixin[key] = defaultParams[key];
}
Thomas Steur
a validé
}
Thomas Steur
a validé
// handle default date & period if not already set
if (!getParamsToMixin.date && !postParams.date) {
getParamsToMixin.date = piwik.currentDateString || piwik.broadcast.getValueFromUrl('date');
if (getParamsToMixin.period == 'range' && piwik.currentDateString) {
getParamsToMixin.date = piwik.startDateString + ',' + getParamsToMixin.date;
}
Thomas Steur
a validé
}
Thomas Steur
a validé
return getParamsToMixin;
}
Thomas Steur
a validé
Thomas Steur
a validé
function abortAll() {
reset();
Thomas Steur
a validé
allRequests.forEach(function (request) {
request.abort();
});
Thomas Steur
a validé
allRequests = [];
Thomas Steur
a validé
function abort () {
abortAll();
Thomas Steur
a validé
/**
* Perform a reading API request.
* @param getParams
*/
function fetch (getParams, options) {
Thomas Steur
a validé
Thomas Steur
a validé
getParams.module = getParams.module || 'API';
getParams.format = 'JSON2';
Thomas Steur
a validé
Thomas Steur
a validé
addParams(getParams, 'GET');
Thomas Steur
a validé
Thomas Steur
a validé
var promise = send(options);
Thomas Steur
a validé
reset();
Thomas Steur
a validé
return promise;
Thomas Steur
a validé
function post(getParams, _postParams_, options) {
if (_postParams_) {
postParams = _postParams_;
}
Thomas Steur
a validé
return fetch(getParams, options);
Thomas Steur
a validé
/**
* Convenience method that will perform a bulk request using Piwik's API.getBulkRequest method.
* Bulk requests allow you to execute multiple Piwik requests with one HTTP request.
*
* @param {object[]} requests
* @param {object} options
* @return {HttpPromise} a promise that is resolved when the request finishes. The argument passed
* to the .then(...) callback will be an array with one element per request
* made.
*/
function bulkFetch(requests, options) {
var bulkApiRequestParams = {
urls: requests.map(function (requestObj) { return '?' + $.param(requestObj); })
};
Thomas Steur
a validé
var deferred = $q.defer(),
requestPromise = post({method: "API.getBulkRequest"}, bulkApiRequestParams, options).then(function (response) {
if (!(response instanceof Array)) {
response = [response];
}
Thomas Steur
a validé
// check for errors
for (var i = 0; i != response.length; ++i) {
var specificResponse = response[i];
Thomas Steur
a validé
if (isErrorResponse(specificResponse)) {
deferred.reject(specificResponse.message || null);
Thomas Steur
a validé
createResponseErrorNotification(specificResponse, options || {});
return;
}
}
Thomas Steur
a validé
deferred.resolve(response);
}).catch(function () {
Thomas Steur
a validé
deferred.reject.apply(deferred, arguments);
});
Thomas Steur
a validé
return deferred.promise;
Thomas Steur
a validé
return {
bulkFetch: bulkFetch,
post: post,
fetch: fetch,
/**
* @deprecated
*/
abort: abort,
diosmosis
a validé
abortAll: abortAll