UNPKG

@teipublisher/pb-components

Version:
125 lines (117 loc) 3.84 kB
/* eslint-disable class-methods-use-this */ import { Registry } from './registry.js' // Todo: // - strings <- types // - use scheme#types in @type output? // - test with other providers, inside custom connector // - documentation async function getServiceManifest (endpoint) { const response = await fetch(endpoint); const data = await response.json(); return data; } export class ReconciliationService extends Registry { constructor(configElem) { super(configElem) this.endpoint = configElem.getAttribute('endpoint'); this.debug = configElem.getAttribute('debug'); getServiceManifest(this.endpoint).then((result) => { this.ORConfig = result; if (this.debug) { console.log( 'OpenReconcile connector for register \'%s\' at endpoint <%s>. Using config: %o', this._register, this.endpoint, this.ORConfig ); } }) } /** * Query the authority and return a RegistryResult. * * @param {String} key the search string */ async query(key) { const results = []; const paramsObj = { q1: { query: key } }; return new Promise((resolve) => { fetch(this.endpoint, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' }, body: "queries=".concat(JSON.stringify(paramsObj)) }) .then((response) => response.json()) .then((json) => { json.q1.result.forEach((item) => { if (this.ORConfig.view) { this.view = this.ORConfig.view.url.replace('{{id}}', item.id); } else { this.view = item.id; } if (item.description) { this.description = item.description; } else if (item.type) { this.description = item.type.map(t => t.name.toString() ).join(', ') } else { this.description = "" } const result = { register: this._register, id: (this._prefix ? `${this._prefix}-${item.id}` : item.id), label: item.name, link: this.view, details: this.description, provider: 'OpenReconcile' }; results.push(result); }); if (this.debug) { console.log( 'OpenReconcile results: %o', results ); } resolve({ totalItems: json.q1.result.length, items: results, }); }) }) } /** * Retrieve information about a registry entry and display it * using the given container. * * @param {String} id the id to look up * @param {HTMLElement} container reference to an element which should be used as container for displaying the information * @returns {Promise} a promise */ info(id, container) { if (!id) { return Promise.resolve({}); } if (!this.ORConfig.preview) { container.innerHTML = 'no \'preview\' information in endpoint\'s manifest'; return Promise.resolve(); } return new Promise((resolve, reject) => { const rawid = this._prefix ? id.substring(this._prefix.length + 1) : id; const url = this.ORConfig.preview.url.replace('{{id}}', encodeURIComponent(rawid)); fetch(url) .then(response => response.text()) .then((output) => { container.innerHTML = output; resolve({ id: this._prefix ? `${this._prefix}-${rawid}` : rawid }); }) .catch(() => reject()); }); } }