var _recommendationInner = {
baseAjaxPromise: function (theData, url) {
return new Promise(function (resolve, reject) {
$.ajax({
type: 'POST',
url: url,
data: JSON.stringify(theData),
contentType: 'text/plain',
xhrFields: {
withCredentials: false
},
dataType: "json",
success: function(data) {
resolve(data);
},
failure: function(errorMsg) {
console.error('Error ' + errorMsg);
reject();
}
})
.done(function(data) {
resolve(data);
})
.fail(function(jqXHR, textStatus) {
console.error("error : " + textStatus);
console.error("error status text: " + jqXHR.statusText);
console.error("error status: " + jqXHR.status);
reject();
});
});
}
};
var Recommendations = new function() {
this.set = function(accessKey, eventsUrl, queriesUrl) {
Recommendations.eventsUrl = eventsUrl + '/events.json?accessKey=' + accessKey;
Recommendations.queriesUrl = queriesUrl + '/queries.json?accessKey=' + accessKey;
};
/** Events **/
var viewProductPromise = function(user,product) {
var data = {
"event": 'view',
"entityType": "user",
"entityId": user,
"targetEntityType": "item",
"targetEntityId": product,
"eventTime" : new Date().toISOString()
};
return _recommendationInner.baseAjaxPromise(data, Recommendations.eventsUrl);
};
var purchaseProductPromise = function (user,product) {
var data = {
"event": "purchase",
"entityType": "user",
"entityId": user,
"targetEntityType": "item",
"targetEntityId": product,
"eventTime" : new Date().toISOString()
};
return _recommendationInner.baseAjaxPromise(data, Recommendations.eventsUrl);
};
/** Queries **/
var getGeneralRecommendationsPromise = function (number) {
var data = {
"num" : number
};
return _recommendationInner.baseAjaxPromise(data, Recommendations.queriesUrl);
};
var getRecommendationsForUserPromise = function (user) {
var data = {
"user" : user
};
return _recommendationInner.baseAjaxPromise(data, Recommendations.queriesUrl);
};
var getRecommendationsPromise = function (user,contextProduct,category) {
var fields = [];
if (category) {
fields.push({
"name": "category",
"values": [category],
"bias": -1
});
}
var data = {
"user" : user,
"item" : contextProduct,
"fields" : fields
};
return _recommendationInner.baseAjaxPromise(data, Recommendations.queriesUrl);
};
/** Events **/
this.purchase = function (user,product,quantity,amount) {
return purchaseProductPromise(user,product,quantity,amount)
.then(nil => { return nil; })
.catch(error => { throw error; });
};
this.viewProduct = function (user,product, isStrong = false) {
return viewProductPromise(user, product, isStrong);
};
/** Queries **/
this.getGeneralRecommendations = function (number) {
return getGeneralRecommendationsPromise(number);
};
this.getRecommendationsForUser = function (user) {
return getRecommendationsForUserPromise(user);
};
this.getRecommendations = function (user,contextProduct,category) {
return getRecommendationsPromise(user,contextProduct,category);
};
};