UNPKG

gersemi

Version:
195 lines 15 kB
import * as Posterior from 'posterior'; import * as DOM from './DOM'; import * as SOAP from './SOAP'; import * as WSDL from './WSDL'; import * as XML from './XML'; XML.setURIs({ gen: 'http://ns.esha.com/2013/genesisapi', exlx: 'http://ns.esha.com/2013/exlx', typ: 'http://ns.esha.com/2013/types', }); export class Client { constructor(url, cfg = {}) { this.url = url; cfg.url = url; cfg.json = false; this.config = cfg; this.Base = Posterior(cfg, 'Client'); this.WSDL = this.Base.extend({ headers: { 'Content-Type': 'text/xml' }, singleton: true, responseData: (xml) => new WSDL.Definitions(xml), Children: { Query: { url: 'query.wsdl', }, Edit: { url: 'edit.wsdl', }, }, }, 'WSDL'); this.Query = this.Base.extend({ url: Query.PATH, method: 'POST', headers: { 'Content-Type': 'application/soap+xml', }, responseData: (res) => DOM.Parser.dom(res), Children: { Nutrients: { requestData: adapter(Query, 'listnutrients', url, 'PageSize'), }, Allergens: { requestData: adapter(Query, 'listallergens', url, 'PageSize'), }, Units: { requestData: adapter(Query, 'listunits', url, 'PageSize'), }, Foods: { requestData: adapter(Query, 'listfoods', url, 'PageSize'), }, ByGroup: { requestData: adapter(Query, 'searchbygroup', url, 'GroupName'), }, ByModifiedDateRange: { requestData: adapter(Query, 'searchbymodifieddaterange', url, undefined, ['typ']), }, ByName: { requestData: adapter(Query, 'searchbyname', url, 'FoodName'), }, ById: { requestData: adapter(Query, 'getfood', url, 'FoodId'), }, ByUserCode: { requestData: adapter(Query, 'getfood', url, 'UserCode'), }, Analysis: { requestData: adapter(Query, 'getanalysis', url), }, UserCodes: { requestData: adapter(Query, 'listfoodusercodes', url, 'PageSize'), }, }, }, 'Query'); this.Edit = this.Base.extend({ url: Edit.PATH, method: 'POST', headers: { 'Content-Type': 'application/soap+xml', }, responseData: (res) => DOM.Parser.dom(res), Children: { NewFood: { requestData: adapter(Edit, 'newfood', url, undefined, ['exlx']), }, UpdateFood: { requestData: adapter(Edit, 'updatefood', url, undefined, ['exlx']), }, }, }, 'Edit'); } } export function adapter(ReqCtor, action, url, defaultName, namespaces) { return (data) => { const request = new ReqCtor(action, url, namespaces); if (data instanceof Array) { if (data.length === 1 && typeof data[0] === 'string' && lookslikeXML(data[0])) { request.setRequestBody(data[0]); } else if (defaultName) { request.param(defaultName, data.length > 1 ? data : data[0]); } data = undefined; } return request.params(data).toString(); }; } function lookslikeXML(s) { s = s.trim(); return s.charAt(0) === '<' && s.charAt(s.length - 1) === '>'; } export class Request extends SOAP.Request { constructor(action, url, namespaces) { super(action, url, 'gen'); this.action = action; this.url = url; if (namespaces) { namespaces.forEach(ns => { this.ns(ns, XML.getURI(ns)); }); } this.request = new SOAP.Element('gen:' + Request.BODIES[action]); this.body.add(this.request); } setRequestBody(xml) { this.request.add(xml); } param(name, value) { if (value !== null && value !== undefined) { const paramElement = new SOAP.Element('gen:' + name); if (value instanceof XML.Element || typeof value === 'string') { paramElement.add(value); } else if (typeof value === 'object') { XML.fromJSON(value, paramElement, 'gen:'); } else { paramElement.add(JSON.stringify(value)); } this.request.add(paramElement); } return this; } params(params) { if (params) { for (const name in params) { this.param(name, params[name]); } } return this; } } Request.BODIES = { listnutrients: 'NutrientListRequest', listallergens: 'AllergenListRequest', listunits: 'UnitListRequest', listfoods: 'FoodsListRequest', searchbygroup: 'FoodsByGroupRequest', searchbymodifieddaterange: 'FoodsByModifiedDateRangeRequest', searchbyname: 'FoodsByNameRequest', getfood: 'FoodMetadataRequest', getanalysis: 'FoodAnalysisRequest', listfoodusercodes: 'FoodUserCodesListRequest', listgroups: 'GroupListRequest', getconversions: 'FoodConversionsRequest', search: 'FoodsRequest', searchbyproperty: 'FoodsByPropertyRequest', listrecommendationprofiles: 'RecommendationProfilesListRequest', listauthorities: 'AuthorityListRequest', newfood: 'NewFoodRequest', updatefood: 'UpdateFoodRequest', }; class Query extends Request { constructor(action, server, namespaces) { super(action, server + Query.PATH, namespaces); this.action = action; this.server = server; this.namespaces = namespaces; } } Query.PATH = 'soap/FoodQueryService.svc'; class Edit extends Request { constructor(action, server, namespaces) { super(action, server + Edit.PATH, namespaces); this.action = action; this.server = server; this.namespaces = namespaces; } } Edit.PATH = 'soap/FoodEditService.svc'; if (window && document.body.hasAttribute('debug')) { window.Client = Client; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29hcC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc29hcC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFNBQVMsTUFBTSxXQUFXLENBQUM7QUFDdkMsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFDN0IsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFFN0IsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUNWLEdBQUcsRUFBRSxvQ0FBb0M7SUFDekMsSUFBSSxFQUFFLDhCQUE4QjtJQUNwQyxHQUFHLEVBQUUsK0JBQStCO0NBQ3JDLENBQUMsQ0FBQztBQUVILE1BQU07SUFhSixZQUFtQixHQUFXLEVBQUUsTUFBNkIsRUFBRTtRQUE1QyxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQzVCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2QsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQzFCO1lBQ0UsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRTtZQUN2QyxTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNyRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFO29CQUNMLEdBQUcsRUFBRSxZQUFZO2lCQUNsQjtnQkFDRCxJQUFJ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