sdmx-rest
Version:
SDMX REST API client for JavaScript
224 lines (200 loc) • 7.34 kB
JavaScript
// 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);