diff --git a/src/k-provider/multi-request-builder.js b/src/k-provider/multi-request-builder.js index 058d5914..88fc933a 100644 --- a/src/k-provider/multi-request-builder.js +++ b/src/k-provider/multi-request-builder.js @@ -19,13 +19,6 @@ export default class MultiRequestBuilder extends RequestBuilder { */ requests: Array = []; - /** - * @constructor - */ - constructor() { - super(); - } - /** * Adds request to requests array * @function add diff --git a/src/k-provider/ott/services/ott-service.js b/src/k-provider/ott/services/ott-service.js index 7691189c..43b36660 100644 --- a/src/k-provider/ott/services/ott-service.js +++ b/src/k-provider/ott/services/ott-service.js @@ -6,10 +6,12 @@ export default class OttService { static getMultirequest(ks: string): MultiRequestBuilder { let ottParams = config.SERVICE_CONFIG_PARAMAS; Object.assign(ottParams, {ks: ks}); - let multiReq = new MultiRequestBuilder(); + let headers: Map = new Map(); + headers.set("Content-Type", "application/json"); + let multiReq = new MultiRequestBuilder(headers); multiReq.method = "POST"; multiReq.service = "multirequest"; - multiReq.baseUrl = config.BE_URL; + multiReq.url = multiReq.getUrl(config.BE_URL); multiReq.params = ottParams; return multiReq; } diff --git a/src/k-provider/ovp/services/base-entry-service.js b/src/k-provider/ovp/services/base-entry-service.js index cfc8fde6..4a6b7ac4 100644 --- a/src/k-provider/ovp/services/base-entry-service.js +++ b/src/k-provider/ovp/services/base-entry-service.js @@ -20,11 +20,13 @@ export default class BaseEntryService extends OvpService { * @static */ static getPlaybackContext(baseUrl: string, ks: string, entryId: string): RequestBuilder { - let request = new RequestBuilder(); + let headers: Map = new Map(); + headers.set("Content-Type", "application/json"); + let request = new RequestBuilder(headers); request.service = SERVICE_NAME; request.action = "getPlaybackContext"; request.method = "POST"; - request.baseUrl = baseUrl; + request.url = request.getUrl(baseUrl); request.tag = "baseEntry-getPlaybackContext"; let contextDataParams = {objectType: "KalturaContextDataParams", flavorTags: "all"}; let params = {entryId: entryId, ks: ks, contextDataParams: contextDataParams}; @@ -42,11 +44,13 @@ export default class BaseEntryService extends OvpService { * @static */ static list(baseUrl: string, ks: string, entryId: string): RequestBuilder { - let request = new RequestBuilder(); + let headers: Map = new Map(); + headers.set("Content-Type", "application/json"); + let request = new RequestBuilder(headers); request.service = SERVICE_NAME; request.action = "list"; request.method = "POST"; - request.baseUrl = baseUrl; + request.url = request.getUrl(baseUrl); request.tag = "list"; request.params = BaseEntryService.getEntryListReqParams(entryId, ks); return request; diff --git a/src/k-provider/ovp/services/meta-data-service.js b/src/k-provider/ovp/services/meta-data-service.js index c5bffa5c..ae4bacfb 100644 --- a/src/k-provider/ovp/services/meta-data-service.js +++ b/src/k-provider/ovp/services/meta-data-service.js @@ -20,11 +20,13 @@ export default class MetaDataService extends OvpService { * @static */ static list(baseUrl: string, ks: string, entryId: string) { - let request = new RequestBuilder(); + let headers: Map = new Map(); + headers.set("Content-Type", "application/json"); + let request = new RequestBuilder(headers); request.service = SERVICE_NAME; request.action = "list"; request.method = "POST"; - request.baseUrl = baseUrl; + request.url = request.getUrl(baseUrl); request.tag = "metadata_metadata-list"; let filter = {objectType: "KalturaMetadataFilter", objectIdEqual: entryId, metadataObjectTypeEqual: "1"}; let params = {filter: filter, ks: ks}; diff --git a/src/k-provider/ovp/services/ovp-service.js b/src/k-provider/ovp/services/ovp-service.js index 04d2d493..26abfdf1 100644 --- a/src/k-provider/ovp/services/ovp-service.js +++ b/src/k-provider/ovp/services/ovp-service.js @@ -24,10 +24,12 @@ export default class OvpService { if (partnerId) { Object.assign(ovpParams, {partnerId: partnerId}); } - let multiReq = new MultiRequestBuilder(); + let headers: Map = new Map(); + headers.set("Content-Type", "application/json"); + let multiReq = new MultiRequestBuilder(headers); multiReq.method = "POST"; multiReq.service = SERVICE_NAME; - multiReq.baseUrl = config.beUrl; + multiReq.url = multiReq.getUrl(config.beUrl); multiReq.params = ovpParams; return multiReq; } diff --git a/src/k-provider/ovp/services/session-service.js b/src/k-provider/ovp/services/session-service.js index bf32bc60..3be0fa2b 100644 --- a/src/k-provider/ovp/services/session-service.js +++ b/src/k-provider/ovp/services/session-service.js @@ -19,11 +19,13 @@ export default class SessionService extends OvpService { * @static */ static anonymousSession(baseUrl: string, partnerId: number) { - let request = new RequestBuilder(); + let headers: Map = new Map(); + headers.set("Content-Type", "application/json"); + let request = new RequestBuilder(headers); request.service = SERVICE_NAME; request.action = "startWidgetSession"; request.method = "POST"; - request.baseUrl = baseUrl; + request.url = request.getUrl(baseUrl); request.tag = "session-startWidget"; request.params = {widgetId: "_" + partnerId}; return request; diff --git a/src/k-provider/ovp/services/stats-service.js b/src/k-provider/ovp/services/stats-service.js index a7617264..b08688d5 100644 --- a/src/k-provider/ovp/services/stats-service.js +++ b/src/k-provider/ovp/services/stats-service.js @@ -2,6 +2,7 @@ import OvpService from './ovp-service' import RequestBuilder from '../../request-builder' import Configuration from '../config' +import {param} from '../../../util/param' const SERVICE_NAME: string = "stats"; /** @@ -15,21 +16,21 @@ export default class StatsService extends OvpService { * @function collect * @param {string} ks - The ks * @param {Object} event - The event data - * @param {string} [baseUrl=Configuration.beUrl] - The service base URL + * @param {string} baseUrl - The service base URL * @returns {RequestBuilder} - The request builder * @static */ - static collect(ks: string, event: Object, baseUrl: ?string): RequestBuilder { + static collect(ks: string, event: Object, baseUrl: string): RequestBuilder { let ovpParams = Configuration.get(); let serviceParams = {}; Object.assign(serviceParams, ovpParams.serviceParams, {ks: ks}, event); let request = new RequestBuilder(); request.service = SERVICE_NAME; request.action = "collect"; - request.method = "POST"; - request.baseUrl = baseUrl || ovpParams.beUrl; + request.method = "GET"; request.tag = "stats-collect"; - request.params = JSON.stringify(serviceParams); + request.params = serviceParams; + request.url = baseUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(request.params); return request; } } diff --git a/src/k-provider/ovp/services/ui-conf-service.js b/src/k-provider/ovp/services/ui-conf-service.js index 364f17aa..039bcffd 100644 --- a/src/k-provider/ovp/services/ui-conf-service.js +++ b/src/k-provider/ovp/services/ui-conf-service.js @@ -20,11 +20,13 @@ export default class UiConfService extends OvpService { * @static */ static get(baseUrl: string, ks: string, uiConfID: number) { - let request = new RequestBuilder(); + let headers: Map = new Map(); + headers.set("Content-Type", "application/json"); + let request = new RequestBuilder(headers); request.service = SERVICE_NAME; request.action = "get"; request.method = "POST"; - request.baseUrl = baseUrl; + request.url = request.getUrl(baseUrl); request.tag = "uiconf-get"; let responseProfileParams = { fields: "config", diff --git a/src/k-provider/request-builder.js b/src/k-provider/request-builder.js index b9370420..ec613770 100644 --- a/src/k-provider/request-builder.js +++ b/src/k-provider/request-builder.js @@ -27,10 +27,10 @@ export default class RequestBuilder { */ headers: Map; /** - * @member - Service base url - * @type {Map} + * @member - Service URL + * @type {string} */ - baseUrl: string; + url: string; /** * @member - Service method (POST,GET,DELETE etc..) * @type {string} @@ -48,20 +48,16 @@ export default class RequestBuilder { */ constructor(headers: Map = new Map()) { this.headers = headers; - this.headers.set("Content-Type", "application/json"); } /** * Builds restful service URL * @function getUrl + * @param {string} baseUrl - The service base URL * @returns {string} The service URL */ - getUrl(): string { - if (!this.baseUrl) { - throw new Error("baseUrl is mandatory for request builder"); - } - let url = this.baseUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : ''); - return url; + getUrl(baseUrl: string): string { + return baseUrl + '/service/' + this.service + (this.action ? '/action/' + this.action : ''); } /** @@ -70,6 +66,9 @@ export default class RequestBuilder { * @returns {Promise.} Service response as promise */ doHttpRequest(): Promise { + if (!this.url) { + throw new Error("baseUrl is mandatory for request builder"); + } let request = new XMLHttpRequest(); return new Promise((resolve, reject) => { request.onreadystatechange = function () { @@ -85,7 +84,7 @@ export default class RequestBuilder { } } }; - request.open(this.method, this.getUrl()); + request.open(this.method, this.url); this.headers.forEach((value, key) => { request.setRequestHeader(key, value); }); diff --git a/src/util/param.js b/src/util/param.js new file mode 100644 index 00000000..c1544de9 --- /dev/null +++ b/src/util/param.js @@ -0,0 +1,43 @@ +let param = (a) => { + let s = [], rbracket = /\[\]$/, + isArray = function (obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }, add = function (k, v) { + v = typeof v === 'function' ? v() : v === null ? '' : v === undefined ? '' : v; + s[s.length] = encodeURIComponent(k) + '=' + encodeURIComponent(v); + }, buildParams = function (prefix, obj) { + let i, len, key; + + if (prefix) { + if (isArray(obj)) { + for (i = 0, len = obj.length; i < len; i++) { + if (rbracket.test(prefix)) { + add(prefix, obj[i]); + } else { + buildParams(prefix + ':' + (typeof obj[i] === 'object' ? i : ''), obj[i]); + } + } + } else if (obj && String(obj) === '[object Object]') { + for (key in obj) { + buildParams(prefix + ':' + key, obj[key]); + } + } else { + add(prefix, obj); + } + } else if (isArray(obj)) { + for (i = 0, len = obj.length; i < len; i++) { + add(obj[i].name, obj[i].value); + } + } else { + for (key in obj) { + buildParams(key, obj[key]); + } + } + return s; + }; + + return buildParams('', a).join('&').replace(/%20/g, '+'); +}; + +export {param} + diff --git a/test/src/k-provider/ovp/services/stats-service.spec.js b/test/src/k-provider/ovp/services/stats-service.spec.js index cf36c16f..919ebf81 100644 --- a/test/src/k-provider/ovp/services/stats-service.spec.js +++ b/test/src/k-provider/ovp/services/stats-service.spec.js @@ -1,6 +1,7 @@ import StatsService from '../../../../../src/k-provider/ovp/services/stats-service' import RequestBuilder from '../../../../../src/k-provider/request-builder' import Configuration from '../../../../../src/k-provider/ovp/config' +import {param} from '../../../../../src/util/param' describe('stats service - collect', function () { let ovpParams, ks, event; @@ -11,26 +12,15 @@ describe('stats service - collect', function () { event = {a:1}; }); - it('should be default baseUrl', function () { - let request = StatsService.collect(ks, event); + it('should be proper values', function () { + let baseUrl = 'some url'; + let request = StatsService.collect(ks, event, baseUrl); (request instanceof RequestBuilder).should.be.true; request.service.should.be.equal('stats'); request.action.should.be.equal('collect'); - request.method.should.be.equal('POST'); - request.baseUrl.should.be.equal(ovpParams.beUrl); + request.method.should.be.equal('GET'); + request.url.should.be.equal(baseUrl + '?service=' + request.service + '&action=' + request.action + '&' + param(request.params)); request.tag.should.be.equal('stats-collect'); - request.params.should.be.equal(JSON.stringify(Object.assign({}, ovpParams.serviceParams, {ks: ks}, event))); - }); - - it('should be take baseUrl from argument', function () { - let beUrl = 'some url'; - let request = StatsService.collect(ks, event, beUrl); - (request instanceof RequestBuilder).should.be.true; - request.service.should.be.equal('stats'); - request.action.should.be.equal('collect'); - request.method.should.be.equal('POST'); - request.baseUrl.should.be.equal(beUrl); - request.tag.should.be.equal('stats-collect'); - request.params.should.be.equal(JSON.stringify(Object.assign({}, ovpParams.serviceParams, {ks: ks}, event))); + request.params.should.deep.equal(Object.assign({}, ovpParams.serviceParams, {ks: ks}, event)); }); }); diff --git a/test/src/util/util.spec.js b/test/src/util/util.spec.js new file mode 100644 index 00000000..39d11dd3 --- /dev/null +++ b/test/src/util/util.spec.js @@ -0,0 +1,24 @@ +import {param} from '../../../src/util/param' + +describe('param method', function () { + + it('should parse object to query params', function () { + let obj = { + a: 'literal', + obj: { + b: 'canon-literal', + canon_array: [1, 2] + }, + array: ['c', 3, {d: 4}] + }; + let query_params_str = param(obj); + let query_params_arr = decodeURIComponent(query_params_str).split('&'); + query_params_arr[0].should.equal('a=literal'); + query_params_arr[1].should.equal('obj:b=canon-literal'); + query_params_arr[2].should.equal('obj:canon_array:=1'); + query_params_arr[3].should.equal('obj:canon_array:=2'); + query_params_arr[4].should.equal('array:=c'); + query_params_arr[5].should.equal('array:=3'); + query_params_arr[6].should.equal('array:2:d=4'); + }); +});