diff --git a/integrationExamples/gpt/userId_example.html b/integrationExamples/gpt/userId_example.html index 4ed32270be7..48b349649bc 100644 --- a/integrationExamples/gpt/userId_example.html +++ b/integrationExamples/gpt/userId_example.html @@ -260,6 +260,9 @@ }, { "name": "dacId" + }, + { + "name": "gravitompId" } ], "syncDelay": 5000, diff --git a/modules/.submodules.json b/modules/.submodules.json index 54bf77c7dca..bf836331bca 100644 --- a/modules/.submodules.json +++ b/modules/.submodules.json @@ -41,7 +41,8 @@ "unifiedIdSystem", "verizonMediaIdSystem", "zeotapIdPlusIdSystem", - "adqueryIdSystem" + "adqueryIdSystem", + "gravitoIdSystem" ], "adpod": [ "freeWheelAdserverVideo", diff --git a/modules/gravitoIdSystem.js b/modules/gravitoIdSystem.js new file mode 100644 index 00000000000..30fa3abd6d2 --- /dev/null +++ b/modules/gravitoIdSystem.js @@ -0,0 +1,57 @@ +/** + * This module adds gravitompId to the User ID module + * The {@link module:modules/userId} module is required + * @module modules/gravitoIdSystem + * @requires module:modules/userId + */ + +import { submodule } from '../src/hook.js'; +import { getStorageManager } from '../src/storageManager.js'; + +export const storage = getStorageManager(); + +export const cookieKey = 'gravitompId'; + +export const gravitoIdSystemSubmodule = { + /** + * used to link submodule with config + * @type {string} + */ + name: 'gravitompId', + + /** + * performs action to obtain id + * @function + * @returns { {id: {gravitompId: string}} | undefined } + */ + getId: function() { + const newId = storage.getCookie(cookieKey); + if (!newId) { + return undefined; + } + const result = { + gravitompId: newId + } + return {id: result}; + }, + + /** + * decode the stored id value for passing to bid requests + * @function + * @param { {gravitompId: string} } value + * @returns { {gravitompId: {id: string} } | undefined } + */ + decode: function(value) { + if (value && typeof value === 'object') { + const result = {}; + if (value.gravitompId) { + result.id = value.gravitompId + } + return {gravitompId: result}; + } + return undefined; + }, + +} + +submodule('userId', gravitoIdSystemSubmodule); diff --git a/modules/gravitoIdSystem.md b/modules/gravitoIdSystem.md new file mode 100644 index 00000000000..af4946779c5 --- /dev/null +++ b/modules/gravitoIdSystem.md @@ -0,0 +1,28 @@ +## Gravito User ID Submodule + +Gravito ID, provided by [Gravito Ltd.](https://gravito.net), is ID for ad targeting by using 1st party cookie. +Please contact Gravito Ltd. before using this ID. + +## Building Prebid with Gravito ID Support + +First, make sure to add the Gravito ID submodule to your Prebid.js package with: + +``` +gulp build --modules=gravitoIdSystem +``` + +The following configuration parameters are available: + +```javascript +pbjs.setConfig({ + userSync: { + userIds: [{ + name: 'gravitompId' + }] + } +}); +``` + +| Param under userSync.userIds[] | Scope | Type | Description | Example | +| --- | --- | --- | --- | --- | +| name | Required | String | The name of this module. | `"gravitompId"` | diff --git a/modules/userId/eids.js b/modules/userId/eids.js index 15fefb5619c..8176fa9f4d2 100644 --- a/modules/userId/eids.js +++ b/modules/userId/eids.js @@ -308,6 +308,12 @@ export const USER_IDS_CONFIG = { return data.envelope; } }, + + // Gravito MP ID + 'gravitompId': { + source: 'gravito.net', + atype: 1 + }, }; // this function will create an eid object for the given UserId sub-module diff --git a/modules/userId/userId.md b/modules/userId/userId.md index 38b196a3b4b..22af69ce1e3 100644 --- a/modules/userId/userId.md +++ b/modules/userId/userId.md @@ -161,6 +161,9 @@ pbjs.setConfig({ }, { name: "dacId" + }, + { + name: "gravitompId" } ], syncDelay: 5000, diff --git a/test/spec/modules/gravitoIdSystem_spec.js b/test/spec/modules/gravitoIdSystem_spec.js new file mode 100644 index 00000000000..e904355f7f1 --- /dev/null +++ b/test/spec/modules/gravitoIdSystem_spec.js @@ -0,0 +1,51 @@ +import { gravitoIdSystemSubmodule, storage, cookieKey } from 'modules/gravitoIdSystem.js'; + +const GRAVITOID_TEST_VALUE = 'gravitompIdTest'; +const GRAVITOID_TEST_OBJ = { + gravitompId: GRAVITOID_TEST_VALUE +}; + +describe('gravitompId module', function () { + let getCookieStub; + + beforeEach(function (done) { + getCookieStub = sinon.stub(storage, 'getCookie'); + done(); + }); + + afterEach(function () { + getCookieStub.restore(); + }); + + const cookieTestCasesForEmpty = [ + undefined, + null, + '' + ] + + describe('getId()', function () { + it('should return the gravitompId when it exists in cookie', function () { + getCookieStub.withArgs(cookieKey).returns(GRAVITOID_TEST_VALUE); + const id = gravitoIdSystemSubmodule.getId(); + expect(id).to.be.deep.equal({id: {gravitompId: GRAVITOID_TEST_VALUE}}); + }); + + cookieTestCasesForEmpty.forEach(testCase => it('should return the gravitompId when it not exists in cookie', function () { + getCookieStub.withArgs(cookieKey).returns(testCase); + const id = gravitoIdSystemSubmodule.getId(); + expect(id).to.be.deep.equal(undefined); + })); + }); + + describe('decode()', function () { + it('should return the gravitompId when it exists in cookie', function () { + const decoded = gravitoIdSystemSubmodule.decode(GRAVITOID_TEST_OBJ); + expect(decoded).to.be.deep.equal({gravitompId: {id: GRAVITOID_TEST_VALUE}}); + }); + + it('should return the undefined when decode id is not "string"', function () { + const decoded = gravitoIdSystemSubmodule.decode(1); + expect(decoded).to.equal(undefined); + }); + }); +});