UNPKG

@68publishers/amp-client

Version:

JS Client for 68publishers/amp

117 lines (88 loc) 2.83 kB
import { Resource } from './resource.mjs'; export class Request { #method; #endpoint; #version; #locale; #query; #defaultResources; #headers; constructor({ method, endpoint, version, locale = null, defaultResources = [], headers = [] }) { this.#method = method; this.#endpoint = endpoint; this.#version = version; this.#locale = locale; this.#query = {}; this.#defaultResources = defaultResources; this.#headers = headers; } addPosition(position, resources = [], applyDefaultResources = true) { const query = this.#query; if (position in query) { throw new Error('Position "' + position + '" already exists.'); } query[position] = {}; if (applyDefaultResources) { this.addPositionResources(position, this.#defaultResources); } this.addPositionResources(position, resources); } addPositionResources(position, resources) { for (let index in resources) { this.addPositionResource(position, resources[index]); } } addPositionResource(position, resource) { if (!(resource instanceof Resource)) { throw new TypeError('Argument resource must be instance of Resource class.'); } const query = this.#query; if (!(position in query)) { throw new Error('Missing position "' + position + '".'); } const queryPosition = query[position]; if (resource.name in queryPosition) { queryPosition[resource.name] = queryPosition[resource.name].withValues(resource.value); return; } queryPosition[resource.name] = resource; } get method() { return this.#method; } get endpoint() { return this.#endpoint; } get version() { return this.#version; } get locale() { return this.#locale; } get parameters() { const queryParameter = this.#parseQueryParameter(this.#query); const params = { query: 'GET' === this.method ? JSON.stringify(queryParameter) : queryParameter, }; if (null !== this.locale) { params.locale = this.locale; } return params; } get headers() { return this.#headers; } #parseQueryParameter = (query) => { const json = {}; for (let position in query) { json[position] = {}; for (let resource in query[position]) { const value = query[position][resource].value.filter(val => '' !== val); if (value.length) { json[position][resource] = value; } } } return json; } }