Skip to content

Commit 5532f36

Browse files
committed
new method to enable sending personalization to stat endpoints
1 parent c2d4dc4 commit 5532f36

File tree

4 files changed

+84
-3
lines changed

4 files changed

+84
-3
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,16 @@ var events = [
358358
client.setPersonalizationEvents(events);
359359
```
360360

361+
362+
### Advanced Personalization
363+
364+
#### Set personalization token
365+
```js
366+
// Add a personalization token to the stat events
367+
client.enablePersonalization(options);
368+
```
369+
370+
361371
### Other
362372

363373
#### Set JSON Web Token (for authentication)

src/cookie.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
const setCookie = function(cookieName, cookieValue, expireDays) {
2+
const date = new Date();
3+
date.setTime(date.getTime() + (expireDays * 24 * 60 * 60 * 1000));
4+
let expires = "expires="+ date.toUTCString();
5+
document.cookie = cookieName + "=" + cookieValue + ";" + expires + ";path=/";
6+
}
7+
8+
const getCookie = function(cookieName) {
9+
let name = cookieName + "=";
10+
let decodedCookie = decodeURIComponent(document.cookie);
11+
let cookieArray = decodedCookie.split(';');
12+
for(let i = 0; i < cookieArray.length; i++) {
13+
let cookie = cookieArray[i];
14+
while (cookie.charAt(0) === ' ') {
15+
cookie = cookie.substring(1);
16+
}
17+
if (cookie.indexOf(name) === 0) {
18+
return cookie.substring(name.length, cookie.length);
19+
}
20+
}
21+
return "";
22+
}
23+
24+
const deleteCookie = function(name) {
25+
document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 2000 00:00:01 GMT;';
26+
}
27+
28+
const checkCookie = function(){
29+
var cookieEnabled = navigator.cookieEnabled;
30+
var testCookieName = 'addstestcookie';
31+
if (!cookieEnabled){
32+
setCookie(testCookieName);
33+
cookieEnabled = !!getCookie(testCookieName);
34+
deleteCookie(testCookieName);
35+
}
36+
return cookieEnabled;
37+
}
38+
39+
module.exports = {
40+
setCookie,
41+
getCookie,
42+
deleteCookie,
43+
checkCookie
44+
}

src/index.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,18 @@ var sendStats = require('./stats');
66
var Settings = require('./settings');
77
var util = require('./util');
88
var throttle = require('./throttle');
9+
var cookie = require('./cookie');
910

1011
var API_HOSTNAME = 'api.addsearch.com';
12+
var PERSONALIZATION_TOKEN_COOKIE_NAME = 'addsearchPersonalizationToken';
1113

1214
var client = function(sitekey, privatekey) {
1315
this.sitekey = sitekey;
1416
this.privatekey = privatekey;
1517
this.apiHostname = API_HOSTNAME;
1618
this.settings = new Settings();
1719
this.sessionId = ('a-' + (Math.random() * 100000000)).substring(0, 10);
20+
this.personalizationToken = null;
1821

1922
/**
2023
* Fetch search results
@@ -209,7 +212,7 @@ var client = function(sitekey, privatekey) {
209212
if (type === 'search') {
210213
let payload = {
211214
action: 'search',
212-
session: this.sessionId,
215+
session: this.personalizationToken || this.sessionId,
213216
keyword: keyword,
214217
numberOfResults: data.numberOfResults,
215218
analyticsTag: this.getSettings().analyticsTag
@@ -220,7 +223,7 @@ var client = function(sitekey, privatekey) {
220223
else if (type === 'click') {
221224
let payload = {
222225
action: 'click',
223-
session: this.sessionId,
226+
session: this.personalizationToken || this.sessionId,
224227
keyword: keyword,
225228
docid: data.documentId,
226229
position: data.position,
@@ -234,6 +237,25 @@ var client = function(sitekey, privatekey) {
234237
}
235238
}
236239

240+
this.enablePersonalization = function(options) {
241+
if (options && options.personalizationToken) {
242+
this.personalizationToken = options.personalizationToken;
243+
return;
244+
}
245+
246+
if (!cookie.checkCookie()) {
247+
return;
248+
}
249+
250+
// TODO: set cookie expires days
251+
let personalizationTokenInCookies = cookie.getCookie(PERSONALIZATION_TOKEN_COOKIE_NAME);
252+
if (!personalizationTokenInCookies) {
253+
personalizationTokenInCookies = util.generateRandomString('ps');
254+
cookie.setCookie(PERSONALIZATION_TOKEN_COOKIE_NAME, personalizationTokenInCookies);
255+
}
256+
this.personalizationToken = personalizationTokenInCookies;
257+
};
258+
237259

238260
// Deprecated
239261
this.searchResultClicked = function(documentId, position) {

src/util.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,13 @@ const validateSetPagingParams = function(page, pageSize, sortBy, sortOrder) {
3939
}
4040
}
4141

42+
const generateRandomString = function(prefix) {
43+
return (prefix + '-' + (Math.random() * 100000000)).substring(0, 10);
44+
};
45+
4246
module.exports = {
4347
isFunction,
4448
base64,
45-
validateSetPagingParams: validateSetPagingParams
49+
validateSetPagingParams: validateSetPagingParams,
50+
generateRandomString
4651
}

0 commit comments

Comments
 (0)