fume-fhir-converter
Version:
FHIR-Utilized Mapping Engine - Community
111 lines (91 loc) • 3.37 kB
text/typescript
/**
* © Copyright Outburn Ltd. 2022-2024 All Rights Reserved
* Project name: FUME-COMMUNITY
*/
import axios, { AxiosInstance } from 'axios';
import config from '../../config';
import { IConfig, IFhirClient } from '../../types';
import { getLogger } from '../logger';
export class FhirClient implements IFhirClient {
protected readonly contentType: string;
protected fhirServer?: AxiosInstance;
protected readonly serverConfig: IConfig;
protected readonly isStateless: boolean;
constructor () {
this.serverConfig = config.getServerConfig();
this.contentType = `application/fhir+json;fhirVersion=${config.getFhirVersionMinor()}`;
this.isStateless = this.serverConfig.SERVER_STATELESS;
this.init();
}
private authHeader (authType: string, username?: string, password?: string) {
if (authType === 'BASIC' && username && password && username > '' && password > '') {
const buff = Buffer.from(`${username}:${password}`, 'utf-8');
return `Basic ${buff.toString('base64')}`;
} else {
return undefined;
}
};
private init () {
if (!this.isStateless) {
const { FHIR_SERVER_BASE, FHIR_SERVER_TIMEOUT, FHIR_SERVER_AUTH_TYPE, FHIR_SERVER_UN, FHIR_SERVER_PW } = this.serverConfig;
const server = axios.create({
baseURL: FHIR_SERVER_BASE,
timeout: FHIR_SERVER_TIMEOUT,
headers: {
'Content-Type': this.contentType,
Accept: this.contentType,
Authorization: this.authHeader(FHIR_SERVER_AUTH_TYPE, FHIR_SERVER_UN, FHIR_SERVER_PW)
}
});
getLogger().info(`Using FHIR server: ${FHIR_SERVER_BASE}`);
this.fhirServer = server;
}
}
protected checkStateless () {
if (this.isStateless) {
getLogger().warn('Server is stateless, not performing the operation');
return true;
}
return false;
}
public async read (url: string) {
if (this.checkStateless()) {
return;
}
const response = await this.fhirServer!.get(`${url}`);
return response.data;
};
public async search (query: string, params?: object) {
if (this.checkStateless()) {
return;
}
const { SEARCH_BUNDLE_PAGE_SIZE } = this.serverConfig;
let queryConfigParams = { _count: SEARCH_BUNDLE_PAGE_SIZE };
if (params) {
queryConfigParams = { ...queryConfigParams, ...params };
};
getLogger().info(`Performing search, page size: ${queryConfigParams._count}`);
const response = await this.fhirServer!.get(`/${query}`, { params: queryConfigParams });
return response.data;
};
public async create (resource: object, resourceType: string) {
throw new Error('Method not implemented.');
}
public async update (resourceType: string, resourceId: string, resource: object) {
throw new Error('Method not implemented.');
}
public async simpleDelete (resourceType: string, resourceId: string) {
throw new Error('Method not implemented.');
}
}
/** Global fhir client */
let fhirClient: IFhirClient | undefined;
export const setFhirClient = (client: IFhirClient) => {
fhirClient = client;
};
export const getFhirClient = () => {
if (!fhirClient) {
throw new Error('FHIR client not initialized');
}
return fhirClient;
};