UNPKG

sdmx-rest

Version:

SDMX REST API client for JavaScript

224 lines (200 loc) 7.34 kB
// Generated by CoffeeScript 2.7.0 (function() { var ApiNumber, ApiResources, ApiVersion, Handler, MetadataDetail, MetadataReferences, MetadataReferencesExcluded, MetadataReferencesSpecial, VersionNumber, checkApiVersion, checkDetail, checkMultipleItems, checkMultipleVersions, checkReferences, checkResource, checkResources, checkVersionWithAll, createEntryPoint, createMetadataQuery, createShortMetadataQuery, getKeyFromVersion, handleMetaPathParams, handleMetaQueryParams, handler, isItemScheme, itemAllowed, toApiKeywords, indexOf = [].indexOf; ({ApiResources, ApiVersion, ApiNumber, getKeyFromVersion} = require('../utils/api-version')); ({createEntryPoint, checkMultipleItems} = require('../utils/url-generator-common')); ({MetadataReferences, MetadataReferencesExcluded, MetadataReferencesSpecial} = require('../metadata/metadata-references')); ({MetadataDetail} = require('../metadata/metadata-detail')); ({VersionNumber} = require('../utils/sdmx-patterns')); ({isItemScheme} = require('../metadata/metadata-type')); itemAllowed = function(r, a) { return a > ApiNumber.v1_0_2 && ((r !== 'hierarchicalcodelist' && isItemScheme(r)) || (a > ApiNumber.v1_1_0 && r === 'hierarchicalcodelist')); }; toApiKeywords = function(q, s, value, isVersion = false) { var v; v = value; if (s.api === ApiVersion.v2_0_0 && v === "all") { v = "*"; } else if (s.api !== ApiVersion.v2_0_0 && v === "*") { v = "all"; } else if (s.api === ApiVersion.v2_0_0 && v === "latest") { v = "~"; } else if (s.api === ApiVersion.v2_0_0 && !isVersion && v.indexOf("\+") > -1) { v = v.replace(/\+/, ","); } else if (s.api !== ApiVersion.v2_0_0 && v.indexOf(",") > -1) { v = v.replace(/,/, "+"); } return v; }; createMetadataQuery = function(q, s, a) { var agency, id, item, res, url, v; url = createEntryPoint(s); if (!(a < ApiNumber.v2_0_0)) { url += "structure/"; } res = toApiKeywords(q, s, q.resource); agency = toApiKeywords(q, s, q.agency); id = toApiKeywords(q, s, q.id); item = toApiKeywords(q, s, q.item); v = s.api === ApiVersion.v2_0_0 && q.version === "latest" ? "~" : q.version; url += `${res}/${agency}/${id}/${v}`; if (itemAllowed(q.resource, a)) { url += `/${item}`; } url += `?detail=${q.detail}&references=${q.references}`; return url; }; handleMetaPathParams = function(q, s, u, a) { var path; path = []; if (q.item !== 'all' && q.item !== '*' && itemAllowed(q.resource, a)) { path.push(toApiKeywords(q, s, q.item)); } if ((q.version !== 'latest' && q.version !== '~') || path.length) { path.push(toApiKeywords(q, s, q.version, true)); } if ((q.id !== 'all' && q.id !== '*') || path.length) { path.push(toApiKeywords(q, s, q.id)); } if ((q.agency !== 'all' && q.agency !== '*') || path.length) { path.push(toApiKeywords(q, s, q.agency)); } if (path.length) { u = u + '/' + path.reverse().join('/'); } return u; }; handleMetaQueryParams = function(q, u, hd, hr) { if (hd || hr) { u += '?'; } if (hd) { u += `detail=${q.detail}`; } if (hd && hr) { u += '&'; } if (hr) { u += `references=${q.references}`; } return u; }; createShortMetadataQuery = function(q, s, a) { var r, u; u = createEntryPoint(s); if (!(a < ApiNumber.v2_0_0)) { u += "structure/"; } r = toApiKeywords(q, s, q.resource); u += `${r}`; u = handleMetaPathParams(q, s, u, a); u = handleMetaQueryParams(q, u, q.detail !== MetadataDetail.FULL, q.references !== MetadataReferences.NONE); return u; }; checkVersionWithAll = function(q, s, v, a) { if (a < ApiNumber.v2_0_0) { if (!(v === 'latest' || v === 'all' || v.match(VersionNumber))) { throw Error(`Semantic versioning not allowed in ${s.api}`); } } }; checkMultipleVersions = function(q, s, a) { var i, j, k, len, len1, ref, ref1, results, results1, v; v = q.version; if (v.indexOf("\+") > -1) { ref = v.split("+"); results = []; for (j = 0, len = ref.length; j < len; j++) { i = ref[j]; results.push(checkVersionWithAll(q, s, i, a)); } return results; } else if (v.indexOf(",") > -1) { ref1 = v.split(","); results1 = []; for (k = 0, len1 = ref1.length; k < len1; k++) { i = ref1[k]; results1.push(checkVersionWithAll(q, s, i, a)); } return results1; } else { return checkVersionWithAll(q, s, v, a); } }; checkApiVersion = function(q, s, a) { checkMultipleItems(q.agency, s, 'agencies', a); checkMultipleItems(q.id, s, 'IDs', a); checkMultipleItems(q.version, s, 'versions', a); checkMultipleItems(q.item, s, 'items', a); return checkMultipleVersions(q, s, a); }; checkDetail = function(q, s, a) { if (a < ApiNumber.v1_3_0 && (q.detail === 'referencepartial' || q.detail === 'allcompletestubs' || q.detail === 'referencecompletestubs')) { throw Error(`${q.detail} not allowed in ${s.api}`); } if (a < ApiNumber.v2_0_0 && q.detail === 'raw') { throw Error(`raw not allowed in ${s.api}`); } }; checkResource = function(q, s, r) { var api; api = s.api.replace(/\./g, '_'); if (!(indexOf.call(ApiResources[api], r) >= 0 || (s.api === ApiVersion.v2_0_0 && r === "*"))) { throw Error(`${r} not allowed in ${s.api}`); } }; checkResources = function(q, s, a) { var i, j, k, len, len1, r, ref, ref1, results, results1; r = q.resource; if (a < ApiNumber.v2_0_0) { return checkResource(q, s, r); } else if (r.indexOf("\+") > -1) { ref = r.split("+"); results = []; for (j = 0, len = ref.length; j < len; j++) { i = ref[j]; results.push(checkResource(q, s, i)); } return results; } else if (r.indexOf(",") > -1) { ref1 = r.split(","); results1 = []; for (k = 0, len1 = ref1.length; k < len1; k++) { i = ref1[k]; results1.push(checkResource(q, s, i)); } return results1; } else { return checkResource(q, s, r); } }; checkReferences = function(q, s, a) { var api, ref, ref1, ref2; api = s.api.replace(/\./g, '_'); if (!(((ref = q.references, indexOf.call(ApiResources[api], ref) >= 0) || (ref1 = q.references, indexOf.call(Object.values(MetadataReferencesSpecial), ref1) >= 0)) && (ref2 = q.references, indexOf.call(MetadataReferencesExcluded, ref2) < 0))) { throw Error(`${q.references} not allowed as reference in ${s.api}`); } if (a < ApiNumber.v2_0_0 && q.references === 'ancestors') { throw Error(`ancestors not allowed as reference in ${s.api}`); } }; handler = Handler = class Handler { handle(q, s, skip) { var a; a = ApiNumber[getKeyFromVersion(s.api)]; checkApiVersion(q, s, a); checkDetail(q, s, a); checkResources(q, s, a); if (q.references) { checkReferences(q, s, a); } if (skip) { return createShortMetadataQuery(q, s, a); } else { return createMetadataQuery(q, s, a); } } }; exports.MetadataQueryHandler = handler; }).call(this);