import {Promise} from 'es6-promise' export type HttpMethod = 'POST' | 'PUT' | 'GET' | 'DELETE' ; export interface ApiCallArgs { url: string; method: HttpMethod; headers?: any; payload?: any; jsonBody?: boolean; } ; export type imageType = 'FRONT' | 'BACK' | 'DETAILFRONT' | 'DETAILBACK' | 'MEDICATIONFRONT' | 'MEDICATIONBACK' | 'ALL'; export type grouping = 'byProduct' | 'byCheck'; export type extent = 'compact' | 'full'; export type checkType = 'allergySubstance' | 'allergyExcipient' | 'doping' | 'doubleMedication' | 'elderly' | 'interaction' | 'interactionFlycicleCH' | 'liverInsufficiency' | 'nutrition' | 'posology' | 'reproduction' | 'renalInsufficiency'; export interface check { check?: checkType, // Default / if empty or missing: error hideAbove?: number } export interface hciCdsCheckRequest { medication: string, extent?: extent, grouping?: grouping, checks: check[] } export interface hciQueryRequest { key: string; index?: string; keyType?: string; } export interface userCredentials { username: string; password: string; } export function hciQuery(requestParams: hciQueryRequest, credentials?: userCredentials) { let baseUrl = `https://index.hcisolutions.ch/index/current/get.aspx?schema=ARTICLE`; let queryParts = Object.keys(requestParams).map(key => { return key + '=' + requestParams[key] }); let query = queryParts.join('&'); query = query && `&${query}` || ''; let url = baseUrl + query; let username = credentials.username || 'EPN236342@hcisolutions.ch'; let password = credentials.password || 'UMPbDJu7!W'; return _apiCall({ url: url, method: "GET", headers: { 'Authorization': 'Basic ' + btoa(`${username}:${password}`) }, jsonBody: false }).then((rsp: any) => { return rsp; }).catch((err) => { return err; }) } export function hciGetPicture(type: imageType, byPharmaCode?: string, byProdNo?: string) { let _pharmaCodeStr let _prodNoStr; if (byProdNo) { _prodNoStr = `https://apps.hcisolutions.ch/MyProducts/picture/${byProdNo}/ProductNr/` } if (byPharmaCode) { _pharmaCodeStr = `https://apps.hcisolutions.ch/MyProducts/picture/${byPharmaCode}/Pharmacode/`; } return new Promise(function (resolve, reject) { if (type === "FRONT") { if (byPharmaCode) { _checkLink(`${_pharmaCodeStr}PA/Front/F`).then((_) => { resolve(`${_pharmaCodeStr}PA/Front/F`); }).catch((err) => { reject(err); }) } else { reject("ERROR: Cannot query medication front without pharma code."); } } else if (type === "BACK") { if (byPharmaCode) { _checkLink(`${_pharmaCodeStr}PA/Back/F`).then((_) => { resolve(`${_pharmaCodeStr}PA/Back/F`); }).catch((err) => { reject(err); }) } else { reject("ERROR: Cannot query medication back without pharma code."); } } else if (type === "DETAILFRONT") { if (byPharmaCode) { _checkLink(`${_pharmaCodeStr}BL/Front/F`).then((_) => { resolve(`${_pharmaCodeStr}BL/Front/F`); }).catch((err) => { reject(err); }) } else { reject("ERROR: Cannot query medication detail front without pharma code."); } } else if (type === "DETAILBACK") { if (byPharmaCode) { _checkLink(`${_pharmaCodeStr}BL/Back/F`).then((_) => { resolve(`${_pharmaCodeStr}BL/Back/F`); }).catch((err) => { reject(err); }) } else { reject("ERROR: Cannot query medication detail back without pharma code."); } } else if (type === "MEDICATIONFRONT") { if (byProdNo) { _checkLink(`${_prodNoStr}PI/Front/F`).then((_) => { resolve(`${_prodNoStr}PI/Front/F`); }, (errMsg) => { reject(errMsg); }).catch((err) => { reject(err); }) } else { reject("ERROR: Cannot query medication detail front without product number."); } } else if (type === "MEDICATIONBACK") { if (byProdNo) { _checkLink(`${_prodNoStr}PI/Back/F`).then((_) => { resolve(`${_prodNoStr}PI/Back/F`); }).catch((err) => { reject(err); }) } else { reject("ERROR: Cannot query medication detail back without product number."); } } else if (type === "ALL") { if(byPharmaCode && byProdNo){ let pictureObj = { front: '', back: '', detailFront: '', detailBack: '', medicationFront: '', medicationBack: '' } _checkLink(`${_pharmaCodeStr}PA/Front/F`).then((rsp) => { pictureObj.front = `${_pharmaCodeStr}PA/Front/F`; }, (rej) => { pictureObj.front = `${rej}`; }).then(_ => _checkLink(`${_pharmaCodeStr}PA/Back/F`).then((rsp) => { pictureObj.back = `${_pharmaCodeStr}PA/Back/F`; }, (rej) => { pictureObj.back = `${rej}`; }).then(_ => _checkLink(`${_pharmaCodeStr}BL/Front/F`).then((rsp) => { pictureObj.detailFront = `${_pharmaCodeStr}BL/Front/F`; }, (rej) => { pictureObj.detailFront = `${rej}`; }).then(_ => _checkLink(`${_pharmaCodeStr}BL/Back/F`).then((rsp) => { pictureObj.detailBack = `${_pharmaCodeStr}BL/Back/F`; }, (rej) => { pictureObj.detailBack = `${rej}`; }).then(_ => _checkLink(`${_prodNoStr}PI/Front/F`).then((rsp) => { pictureObj.medicationFront = `${_prodNoStr}PI/Front/F`; }, (rej) => { pictureObj.medicationFront = `${rej}`; }).then(_ => _checkLink(`${_prodNoStr}PI/Back/F`).then((rsp) => { pictureObj.medicationBack = `${_prodNoStr}PI/Back/F`; }, (rej) => { pictureObj.medicationBack = `${rej}`; }).then(_ => { resolve(pictureObj); })))))) } else if (byPharmaCode){ let pictureObj = { front: '', back: '', detailFront: '', detailBack: '', } _checkLink(`${_pharmaCodeStr}PA/Front/F`).then((rsp) => { pictureObj.front = `${_pharmaCodeStr}PA/Front/F`; }, (rej) => { pictureObj.front = `${rej}`; }).then(_ => _checkLink(`${_pharmaCodeStr}PA/Back/F`).then((rsp) => { pictureObj.back = `${_pharmaCodeStr}PA/Back/F`; }, (rej) => { pictureObj.back = `${rej}`; }).then(_ => _checkLink(`${_pharmaCodeStr}BL/Front/F`).then((rsp) => { pictureObj.detailFront = `${_pharmaCodeStr}BL/Front/F`; }, (rej) => { pictureObj.detailFront = `${rej}`; }).then(_ => _checkLink(`${_pharmaCodeStr}BL/Back/F`).then((rsp) => { pictureObj.detailBack = `${_pharmaCodeStr}BL/Back/F`; }, (rej) => { pictureObj.detailBack = `${rej}`; }).then(_ => { resolve(pictureObj); })))) } else { reject("ERROR: Abort. In order to query all picture information you need to at least provide a pharma code"); } } }) } export function hciCdsCheck(requestParams: hciCdsCheckRequest) { return _apiCall({ url: "https://int.hcisolutions.ch/MedicationActiveForm/cds/check", method: "POST", jsonBody: true, headers: { 'Accept': 'application/json' }, payload: requestParams }).then((rsp: any) => { return rsp; }).catch((err) => { return err; }) } export function _checkLink(url: string) { return new Promise((resolve, reject) => { return _apiCall({ url: url, method: "GET" }).then((rsp: any) => { resolve(rsp); }, (rsp) => { reject(rsp); }).catch((err) => { return err; }) }) } export function _apiCall(args: ApiCallArgs) { let url = args.url; let method = args.method; let payload = args.payload; let headers = args.headers; let jsonBody = args.jsonBody || false; return new Promise(function (resolve, reject) { let xhr = new XMLHttpRequest(); xhr.open(method, url, true); if (headers) { Object.keys(headers).forEach((key) => { xhr.setRequestHeader(key, headers[key]); }); } xhr.onreadystatechange = function () { if (this.readyState === 4) { // loaded let status = this.status; if (status >= 200 && status < 300) { // successfuly // check content-disposition var disposition = xhr.getResponseHeader("Content-Disposition"); console.log(disposition); if (disposition === "inline; filename=notFound.jpg") { console.log("Picture not found, Picture: " + disposition); reject("No picture available"); } let body: any; if (jsonBody) { body = JSON.parse(this.responseText); } else { body = this.responseText; } resolve({ message: 'Request successful', body: body, status: status }); } else { // loaded but non-successful response reject({ message: this.statusText, body: this.responseText, status: status }); } } }; xhr.onerror = function () { reject({ message: 'Network error', body: '', status: 0 }); } if (payload !== undefined) { xhr.send(JSON.stringify(payload)); } else { xhr.send(); } }); }