Skip to content

Commit c30a7fe

Browse files
mp4symitriManan
andauthored
Initial Commit for Symitri Analytics Adapter (#12132)
Co-authored-by: Manan <[email protected]>
1 parent edb2d9d commit c30a7fe

File tree

3 files changed

+186
-0
lines changed

3 files changed

+186
-0
lines changed

modules/symitriAnalyticsAdapter.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import adapter from '../libraries/analyticsAdapter/AnalyticsAdapter.js';
2+
import adapterManager from '../src/adapterManager.js';
3+
import { EVENTS } from '../src/constants.js';
4+
import { logMessage } from '../src/utils.js';
5+
import {ajax} from '../src/ajax.js';
6+
7+
const analyticsType = 'endpoint';
8+
const url = 'https://ProdSymPrebidEventhub1.servicebus.windows.net/prebid-said-1/messages';
9+
10+
const { BID_WON } = EVENTS;
11+
12+
let initOptions;
13+
14+
let symitriAnalytics = Object.assign(adapter({url, analyticsType}), {
15+
track({ eventType, args }) {
16+
switch (eventType) {
17+
case BID_WON:
18+
logMessage('##### symitriAnalytics :: Event Triggered : ' + eventType);
19+
sendEvent(args);
20+
break;
21+
default:
22+
logMessage('##### symitriAnalytics :: Event Triggered : ' + eventType);
23+
break;
24+
}
25+
}
26+
});
27+
28+
function sendEvent(payload) {
29+
try {
30+
if (initOptions.apiAuthToken) {
31+
const body = JSON.stringify(payload);
32+
logMessage('##### symitriAnalytics :: sendEvent ', payload);
33+
let cb = {
34+
success: () => {
35+
logMessage('##### symitriAnalytics :: Bid Reported Successfully');
36+
},
37+
error: (request, error) => {
38+
logMessage('##### symitriAnalytics :: Bid Report Failed' + error);
39+
}
40+
};
41+
42+
ajax(url, cb, body, {
43+
method: 'POST',
44+
customHeaders: {'Content-Type': 'application/atom+xml;type=entry;charset=utf-8', 'Authorization': initOptions.apiAuthToken}
45+
});
46+
}
47+
} catch (err) { logMessage('##### symitriAnalytics :: error' + err) }
48+
}
49+
50+
symitriAnalytics.originEnableAnalytics = symitriAnalytics.enableAnalytics;
51+
symitriAnalytics.enableAnalytics = function (config) {
52+
initOptions = config.options;
53+
symitriAnalytics.originEnableAnalytics(config);
54+
};
55+
56+
adapterManager.registerAnalyticsAdapter({
57+
adapter: symitriAnalytics,
58+
code: 'symitri'
59+
});
60+
61+
export default symitriAnalytics;

modules/symitriAnalyticsAdapter.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
### Overview
2+
3+
Symitri Analytics Adapter.
4+
5+
### Integration
6+
7+
1) Build the symitriAnalyticsAdapter module into the Prebid.js package with:
8+
9+
```
10+
gulp build --modules=symitriAnalyticsAdapter,...
11+
```
12+
13+
2) Use `enableAnalytics` to instruct Prebid.js to initilaize the symitriAnalyticsAdapter module, as specified below.
14+
15+
### Configuration
16+
17+
```
18+
pbjs.enableAnalytics({
19+
provider: 'symitri',
20+
options: {
21+
'apiAuthToken': '<see your Symitri account rep>'
22+
}
23+
});
24+
```
25+
26+
Please reach out to your Symitri account representative([email protected]) to get provisioned on the DAP platform.
27+
28+
29+
### Testing
30+
To view an example of available segments returned by dap:
31+
```
32+
‘gulp serve --modules=rtdModule,symitriDapRtdProvider,symitriAnalyticsAdapter,appnexusBidAdapter,sovrnBidAdapter’
33+
```
34+
and then point your browser at:
35+
"http://localhost:9999/integrationExamples/gpt/symitridap_segments_example.html"
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
import symitriAnalyticsAdapter from 'modules/symitriAnalyticsAdapter.js';
2+
import { expect } from 'chai';
3+
import adapterManager from 'src/adapterManager.js';
4+
import { server } from 'test/mocks/xhr.js';
5+
import { EVENTS } from 'src/constants.js';
6+
7+
let events = require('src/events');
8+
9+
describe('symitri analytics adapter', function () {
10+
beforeEach(function () {
11+
sinon.stub(events, 'getEvents').returns([]);
12+
});
13+
14+
afterEach(function () {
15+
events.getEvents.restore();
16+
});
17+
18+
describe('track', function () {
19+
let initOptionsValid = {
20+
apiAuthToken: 'TOKEN1234'
21+
};
22+
let initOptionsInValid = {
23+
};
24+
25+
let bidWon = {
26+
'bidderCode': 'appnexus',
27+
'width': 300,
28+
'height': 250,
29+
'statusMessage': 'Bid available',
30+
'adId': '393976d8770041',
31+
'requestId': '263efc09896d0c',
32+
'mediaType': 'banner',
33+
'source': 'client',
34+
'cpm': 0.5,
35+
'creativeId': 96846035,
36+
'currency': 'USD',
37+
'netRevenue': true,
38+
'ttl': 300,
39+
'adUnitCode': 'div-gpt-ad-1460505748561-0',
40+
'originalCpm': 0.5,
41+
'originalCurrency': 'USD',
42+
'auctionId': 'db377024-d866-4a24-98ac-5e430f881313',
43+
'responseTimestamp': 1576823894050,
44+
'requestTimestamp': 1576823893838,
45+
'bidder': 'appnexus',
46+
'timeToRespond': 212,
47+
'status': 'rendered'
48+
};
49+
50+
adapterManager.registerAnalyticsAdapter({
51+
code: 'symitri',
52+
adapter: symitriAnalyticsAdapter
53+
});
54+
55+
afterEach(function () {
56+
symitriAnalyticsAdapter.disableAnalytics();
57+
});
58+
59+
it('Test with valid apiAuthToken', function () {
60+
adapterManager.enableAnalytics({
61+
provider: 'symitri',
62+
options: initOptionsValid
63+
});
64+
events.emit(EVENTS.BID_WON, bidWon);
65+
expect(server.requests.length).to.equal(1);
66+
});
67+
68+
it('Test with missing apiAuthToken', function () {
69+
adapterManager.enableAnalytics({
70+
provider: 'symitri',
71+
options: initOptionsInValid
72+
});
73+
events.emit(EVENTS.BID_WON, bidWon);
74+
expect(server.requests.length).to.equal(0);
75+
});
76+
77+
it('Test correct winning bid is sent to server', function () {
78+
adapterManager.enableAnalytics({
79+
provider: 'symitri',
80+
options: initOptionsValid
81+
});
82+
events.emit(EVENTS.BID_WON, bidWon);
83+
expect(server.requests.length).to.equal(1);
84+
let winEventData = JSON.parse(server.requests[0].requestBody);
85+
expect(winEventData).to.deep.equal(bidWon);
86+
let authToken = server.requests[0].requestHeaders['Authorization'];
87+
expect(authToken).to.equal(initOptionsValid.apiAuthToken);
88+
});
89+
});
90+
});

0 commit comments

Comments
 (0)