ng-smart-on-fhir
Version:
[](https://srdc.com.tr/en)
118 lines • 16.1 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./smart-auth.service";
/**
* Authenticated FHIR client
*/
export class SmartOnFhirService {
get importedResources() {
return this._importedResources;
}
constructor(config = {}, auth) {
this.config = config;
this.auth = auth;
// imported local resources from SHCs
this.importedSHCards = [];
this._importedResources = {};
}
getClient() {
return this.auth.getClient();
}
async ready(callback) {
const client = await this.getClient();
return client ? callback(client) : Promise.reject();
}
getPatient() {
return this.auth.getPatient();
}
// FHIR Search
search(resourceType, ...params) {
return this.ready(client => client.request({
url: this.constructQueryURL(resourceType, params)
}));
}
// FHIR Create (POST/PUT)
create(resource, id) {
return this.ready(client => {
if (id) {
const _resource = { ...resource, id: id };
return client.update(resource);
}
else {
const _resource = { ...resource };
delete _resource.id;
return client.create(_resource);
}
});
}
// FHIR Operation
operation(options) {
const opUrl = (options.resourceType ? options.resourceType + (options.resourceId ? '/' + options.resourceId : '') + '/' : '')
+ '$' + options.operationName;
return this.ready(client => client.request({
method: 'POST',
url: opUrl + (options.queryParams?.length ? this.constructQueryURL('', options.queryParams) : ''),
body: JSON.stringify(options.params || {})
}));
}
// FHIR Request
request(url) {
if (url.length >= 2048) {
return this.ready(client => client.request({
method: 'POST',
url: '',
body: JSON.stringify({
resourceType: 'Bundle',
type: 'batch',
entry: [{
request: {
url,
method: 'GET'
}
}]
})
})).then(bundle => bundle.entry?.at(0)?.resource);
}
return this.ready(client => client.request({
url: url + (url.includes('Observation') ? '&_count=999' : '')
}));
}
logout() {
this.auth.logout();
}
// Construct FHIR API url from the given query
constructQueryURL(resourceType, params) {
return resourceType + '?' + (params?.map(_params => Object.keys(_params).map(key => key + '=' + _params[key]).join('&')).filter(_ => _).join('&') || '');
}
// Import data from SHC
importSHCData(param) {
const { bundle, shc } = param;
this.importedSHCards.push(param);
this._importedResources = this.importedSHCards.map(shc => shc.bundle.entry?.map(entry => entry.resource) || []).flat()
.reduce((o, r) => {
if (!r) {
return;
}
if (!o[r.resourceType]) {
o[r.resourceType] = [];
}
o[r.resourceType].push(r);
return o;
}, {});
const patient = bundle.entry?.find(entry => entry.resource?.resourceType === 'Patient')?.resource;
this.auth.offline(patient, shc);
}
// Return all imported resources from SHC
getAllImportedResources() {
return Object.values(this.importedResources).flat();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SmartOnFhirService, deps: [{ token: 'sofConfig' }, { token: i1.SmartAuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SmartOnFhirService }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SmartOnFhirService, decorators: [{
type: Injectable
}], ctorParameters: () => [{ type: undefined, decorators: [{
type: Inject,
args: ['sofConfig']
}] }, { type: i1.SmartAuthService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtb24tZmhpci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtb24tZmhpci9zcmMvbGliL3NlcnZpY2VzL3NtYXJ0LW9uLWZoaXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7O0FBS2pEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGtCQUFrQjtJQUs3QixJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsWUFBd0MsU0FBNEIsRUFBRSxFQUFVLElBQXNCO1FBQTlELFdBQU0sR0FBTixNQUFNLENBQXdCO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBa0I7UUFQdEcscUNBQXFDO1FBQzdCLG9CQUFlLEdBQThELEVBQUUsQ0FBQztRQUNoRix1QkFBa0IsR0FBMEMsRUFBRSxDQUFDO0lBTXZFLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFTyxLQUFLLENBQUMsS0FBSyxDQUFJLFFBQXdDO1FBQzdELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1FBQ3JDLE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQTtJQUNyRCxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQTtJQUMvQixDQUFDO0lBRUQsY0FBYztJQUNkLE1BQU0sQ0FBSSxZQUFvQixFQUFFLEdBQUcsTUFBYTtRQUM5QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQWtCLE1BQU0sQ0FBQyxF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QUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLENBQUE7WUFBQyxDQUFDO1lBQ2xELENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ1IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFlBQVksS0FBSyxTQUFTLENBQUMsRUFBRSxRQUFRLENBQUM7UUFDbEcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQWdCLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLHVCQUF1QjtRQUNyQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEQsQ0FBQzsrR0FwSFUsa0JBQWtCLGtCQVNULFdBQVc7bUhBVHBCLGtCQUFrQjs7NEZBQWxCLGtCQUFrQjtrQkFEOUIsVUFBVTs7MEJBVUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgQ2xpZW50IGZyb20gXCJmaGlyY2xpZW50L2xpYi9DbGllbnRcIjtcclxuaW1wb3J0IHtTbWFydEF1dGhTZXJ2aWNlfSBmcm9tIFwiLi9zbWFydC1hdXRoLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTbWFydE9uRmhpckNvbmZpZ30gZnJvbSBcIi4uL21vZGVsL3NtYXJ0LW9uLWZoaXIuY29uZmlnXCI7XHJcblxyXG4vKipcclxuICogQXV0aGVudGljYXRlZCBGSElSIGNsaWVudFxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU21hcnRPbkZoaXJTZXJ2aWNlIHtcclxuXHJcbiAgLy8gaW1wb3J0ZWQgbG9jYWwgcmVzb3VyY2VzIGZyb20gU0hDc1xyXG4gIHByaXZhdGUgaW1wb3J0ZWRTSENhcmRzOiB7IGxhYmVsPzogc3RyaW5nLCBzaGM6IHN0cmluZ1tdLCBidW5kbGU6IGZoaXI0LkJ1bmRsZSB9W10gPSBbXTtcclxuICBwcml2YXRlIF9pbXBvcnRlZFJlc291cmNlczogeyBbcnR5cGU6IHN0cmluZ106IGZoaXI0LlJlc291cmNlW10gfSA9IHt9O1xyXG4gIGdldCBpbXBvcnRlZFJlc291cmNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLl9pbXBvcnRlZFJlc291cmNlcztcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoJ3NvZkNvbmZpZycpIHB1YmxpYyBjb25maWc6IFNtYXJ0T25GaGlyQ29uZmlnID0ge30sIHByaXZhdGUgYXV0aDogU21hcnRBdXRoU2VydmljZSkge1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2xpZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aC5nZXRDbGllbnQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcmVhZHk8VD4oY2FsbGJhY2s6IChjbGllbnQ6IENsaWVudCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xyXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKVxyXG4gICAgcmV0dXJuIGNsaWVudCA/IGNhbGxiYWNrKGNsaWVudCkgOiBQcm9taXNlLnJlamVjdCgpXHJcbiAgfVxyXG5cclxuICBnZXRQYXRpZW50KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuYXV0aC5nZXRQYXRpZW50KClcclxuICB9XHJcblxyXG4gIC8vIEZISVIgU2VhcmNoXHJcbiAgc2VhcmNoPFQ+KHJlc291cmNlVHlwZTogc3RyaW5nLCAuLi5wYXJhbXM6IGFueVtdKTogUHJvbWlzZTxmaGlyNC5CdW5kbGU8VD4+IHtcclxuICAgIHJldHVybiB0aGlzLnJlYWR5PGZoaXI0LkJ1bmRsZTxUPj4oY2xpZW50ID0+IGNsaWVudC5yZXF1ZXN0KHtcclxuICAgICAgdXJsOiB0aGlzLmNvbnN0cnVjdFF1ZXJ5VVJMKHJlc291cmNlVHlwZSwgcGFyYW1zKVxyXG4gICAgfSkpXHJcbiAgfVxyXG5cclxuICAvLyBGSElSIENyZWF0ZSAoUE9TVC9QVVQpXHJcbiAgY3JlYXRlPFQ+KHJlc291cmNlOiBULCBpZD86IHN0cmluZyk6IFByb21pc2U8VD4ge1xyXG4gICAgcmV0dXJuIHRoaXMucmVhZHk8VD4oY2xpZW50ID0+IHtcclxuICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgY29uc3QgX3Jlc291cmNlID0geyAuLi5yZXNvdXJjZSwgaWQ6IGlkIH1cclxuICAgICAgICByZXR1cm4gY2xpZW50LnVwZGF0ZTxUPig8YW55PnJlc291cmNlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBfcmVzb3VyY2U6IGFueSA9IHsuLi5yZXNvdXJjZX07XHJcbiAgICAgICAgZGVsZXRlIF9yZXNvdXJjZS5pZDtcclxuICAgICAgICByZXR1cm4gY2xpZW50LmNyZWF0ZTxUPihfcmVzb3VyY2UpO1xyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgLy8gRkhJUiBPcGVyYXRpb25cclxuICBvcGVyYXRpb248VD4ob3B0aW9uczoge1xyXG4gICAgb3BlcmF0aW9uTmFtZTogc3RyaW5nLFxyXG4gICAgcmVzb3VyY2VUeXBlPzogc3RyaW5nLFxyXG4gICAgcmVzb3VyY2VJZD86IHN0cmluZyxcclxuICAgIHBhcmFtcz86IGZoaXI0LlBhcmFtZXRlcnNcclxuICAgIHF1ZXJ5UGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmd8bnVtYmVyIH1bXSxcclxuICB9KSB7XHJcbiAgICBjb25zdCBvcFVybCA9IChvcHRpb25zLnJlc291cmNlVHlwZSA/IG9wdGlvbnMucmVzb3VyY2VUeXBlICsgKG9wdGlvbnMucmVzb3VyY2VJZCA/ICcvJyArIG9wdGlvbnMucmVzb3VyY2VJZCA6ICcnKSArICcvJyA6ICcnKVxyXG4gICAgICArICckJyArIG9wdGlvbnMub3BlcmF0aW9uTmFtZTtcclxuICAgIHJldHVybiB0aGlzLnJlYWR5PFQ+KGNsaWVudCA9PiBjbGllbnQucmVxdWVzdCh7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICB1cmw6IG9wVXJsICsgKG9wdGlvbnMucXVlcnlQYXJhbXM/Lmxlbmd0aCA/IHRoaXMuY29uc3RydWN0UXVlcnlVUkwoJycsIG9wdGlvbnMucXVlcnlQYXJhbXMpIDogJycpLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRpb25zLnBhcmFtcyB8fCB7fSlcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8vIEZISVIgUmVxdWVzdFxyXG4gIHJlcXVlc3Q8VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPGZoaXI0LkJ1bmRsZTxUPj4ge1xyXG4gICAgaWYgKHVybC5sZW5ndGggPj0gMjA0OCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZWFkeTxmaGlyNC5CdW5kbGU8VD4+KGNsaWVudCA9PiBjbGllbnQucmVxdWVzdCh7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgdXJsOiAnJyxcclxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICByZXNvdXJjZVR5cGU6ICdCdW5kbGUnLFxyXG4gICAgICAgICAgdHlwZTogJ2JhdGNoJyxcclxuICAgICAgICAgIGVudHJ5OiBbe1xyXG4gICAgICAgICAgICByZXF1ZXN0OiB7XHJcbiAgICAgICAgICAgICAgdXJsLFxyXG4gICAgICAgICAgICAgIG1ldGhvZDogJ0dFVCdcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9KVxyXG4gICAgICB9KSkudGhlbihidW5kbGUgPT4gPGZoaXI0LkJ1bmRsZTxUPj5idW5kbGUuZW50cnk/LmF0KDApPy5yZXNvdXJjZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5yZWFkeTxmaGlyNC5CdW5kbGU8VD4+KGNsaWVudCA9PiBjbGllbnQucmVxdWVzdCh7XHJcbiAgICAgIHVybDogdXJsICsgKHVybC5pbmNsdWRlcygnT2JzZXJ2YXRpb24nKSA/ICcmX2NvdW50PTk5OScgOiAnJylcclxuICAgIH0pKVxyXG4gIH1cclxuXHJcbiAgbG9nb3V0KCkge1xyXG4gICAgdGhpcy5hdXRoLmxvZ291dCgpXHJcbiAgfVxyXG5cclxuICAvLyBDb25zdHJ1Y3QgRkhJUiBBUEkgdXJsIGZyb20gdGhlIGdpdmVuIHF1ZXJ5XHJcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RRdWVyeVVSTChyZXNvdXJjZVR5cGU6IHN0cmluZywgcGFyYW1zPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmd8bnVtYmVyIH1bXSkge1xyXG4gICAgcmV0dXJuIHJlc291cmNlVHlwZSArICc/JyArIChwYXJhbXM/Lm1hcChfcGFyYW1zID0+XHJcbiAgICAgIE9iamVjdC5rZXlzKF9wYXJhbXMpLm1hcChrZXkgPT4ga2V5ICsgJz0nICsgX3BhcmFtc1trZXldKS5qb2luKCcmJylcclxuICAgICkuZmlsdGVyKF8gPT4gXykuam9pbignJicpIHx8ICcnKTtcclxuICB9XHJcblxyXG4gIC8vIEltcG9ydCBkYXRhIGZyb20gU0hDXHJcbiAgaW1wb3J0U0hDRGF0YShwYXJhbTogeyBsYWJlbD86IHN0cmluZywgc2hjOiBzdHJpbmdbXSwgYnVuZGxlOiBmaGlyNC5CdW5kbGUgfSkge1xyXG4gICAgY29uc3Qge2J1bmRsZSwgc2hjfSA9IHBhcmFtO1xyXG4gICAgdGhpcy5pbXBvcnRlZFNIQ2FyZHMucHVzaChwYXJhbSlcclxuICAgIHRoaXMuX2ltcG9ydGVkUmVzb3VyY2VzID0gdGhpcy5pbXBvcnRlZFNIQ2FyZHMubWFwKHNoYyA9PlxyXG4gICAgICBzaGMuYnVuZGxlLmVudHJ5Py5tYXAoZW50cnkgPT4gZW50cnkucmVzb3VyY2UpIHx8IFtdKS5mbGF0KClcclxuICAgICAgLnJlZHVjZSgobzogYW55LCByOiBmaGlyNC5SZXNvdXJjZXx1bmRlZmluZWQpID0+IHtcclxuICAgICAgICBpZiAoIXIpIHsgcmV0dXJuOyB9XHJcbiAgICAgICAgaWYgKCFvW3IucmVzb3VyY2VUeXBlXSkgeyBvW3IucmVzb3VyY2VUeXBlXSA9IFtdIH1cclxuICAgICAgICBvW3IucmVzb3VyY2VUeXBlXS5wdXNoKHIpO1xyXG4gICAgICAgIHJldHVybiBvO1xyXG4gICAgICB9LCB7fSlcclxuICAgIGNvbnN0IHBhdGllbnQgPSBidW5kbGUuZW50cnk/LmZpbmQoZW50cnkgPT4gZW50cnkucmVzb3VyY2U/LnJlc291cmNlVHlwZSA9PT0gJ1BhdGllbnQnKT8ucmVzb3VyY2U7XHJcbiAgICB0aGlzLmF1dGgub2ZmbGluZSg8ZmhpcjQuUGF0aWVudD5wYXRpZW50LCBzaGMpO1xyXG4gIH1cclxuXHJcbiAgLy8gUmV0dXJuIGFsbCBpbXBvcnRlZCByZXNvdXJjZXMgZnJvbSBTSENcclxuICBnZXRBbGxJbXBvcnRlZFJlc291cmNlcygpIHtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuaW1wb3J0ZWRSZXNvdXJjZXMpLmZsYXQoKTtcclxuICB9XHJcbn1cclxuIl19