Skip to content

Commit

Permalink
fix(#138): change ltfu mediator to cht mediator and add openmrs mediator
Browse files Browse the repository at this point in the history
  • Loading branch information
witash committed Oct 2, 2024
1 parent 6d2c7d2 commit e91be25
Show file tree
Hide file tree
Showing 11 changed files with 63 additions and 38 deletions.
10 changes: 4 additions & 6 deletions configurator/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,11 @@ const OPENHIM_API_USERNAME =
const OPENHIM_CLIENT_PASSWORD = process.env.OPENHIM_CLIENT_PASSWORD || 'interop-password';
const OPENHIM_USER_PASSWORD = process.env.OPENHIM_USER_PASSWORD || 'interop-password';

const OPENMRS_HOST = process.env.OPENMRS || 'openmrs';
const OPENMRS_HOST = process.env.OPENMRS_HOST;
const OPENMRS_PORT = process.env.OPENMRS_PORT || 8080;
const OPENMRS_USERNAME =
process.env.OPENMRS_USERNAME || 'admin';
const OPENMRS_PASSWORD =
process.env.OPENMRS_PASSWORD || 'Admin123';
const OPENMRS_PROTOCOL = process.env.OPENMRS_PROTOCOL || 'http'
const OPENMRS_USERNAME = process.env.OPENMRS_USERNAME;
const OPENMRS_PASSWORD = process.env.OPENMRS_PASSWORD;
const OPENMRS_PROTOCOL = process.env.OPENMRS_PROTOCOL || 'http';

module.exports = {
OPENHIM_API_HOSTNAME,
Expand Down
8 changes: 5 additions & 3 deletions configurator/index.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const {OPENHIM_USER_PASSWORD, OPENHIM_CLIENT_PASSWORD} = require('./config');
const {OPENMRS_USERNAME, OPENMRS_PASSWORD, OPENMRS_HOST, OPENMRS_PORT, OPENMRS_PROTOCOL} = require('./config');
const {generateApiOptions, generateAuthHeaders} = require('./libs/authentication');
const {generateUser, generateClient, generateHapiFihrChannel, generateOpenMRSChannel} = require('./libs/generators');
const {generateUser, generateClient, generateHapiFhirChannel, generateOpenMRSChannel} = require('./libs/generators');
const {fetch} = require('./utils');
const logger = require('./logger');

Expand All @@ -16,8 +16,10 @@ async function handleConfiguration () {

metadata.Users.push(await generateUser(OPENHIM_USER_PASSWORD));
metadata.Clients.push(await generateClient(OPENHIM_CLIENT_PASSWORD));
metadata.Channels.push(await generateHapiFihrChannel());
metadata.Channels.push(await generateOpenMRSChannel(OPENMRS_HOST, OPENMRS_PORT, OPENMRS_USERNAME, OPENMRS_PASSWORD, OPENMRS_PROTOCOL));
metadata.Channels.push(await generateHapiFhirChannel());
if (OPENMRS_HOST) {
metadata.Channels.push(await generateOpenMRSChannel(OPENMRS_HOST, OPENMRS_PORT, OPENMRS_USERNAME, OPENMRS_PASSWORD, OPENMRS_PROTOCOL));
}

const data = JSON.stringify(metadata);
const apiOptions = generateApiOptions('/metadata');
Expand Down
4 changes: 2 additions & 2 deletions configurator/libs/generators.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ async function generateUser (password) {
};
}

async function generateHapiFihrChannel () {
async function generateHapiFhirChannel () {
return {
methods: [
'GET',
Expand Down Expand Up @@ -157,6 +157,6 @@ async function generateOpenMRSChannel (host, port, username, password, type) {
module.exports = {
generateClient,
generateUser,
generateHapiFihrChannel,
generateHapiFhirChannel,
generateOpenMRSChannel
};
9 changes: 6 additions & 3 deletions docker/docker-compose.mediator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ services:
- "FHIR_URL=${FHIR_URL:-http://openhim-core:5001/fhir}"
- "FHIR_USERNAME=${FHIR_USERNAME:-interop-client}"
- "FHIR_PASSWORD=${FHIR_PASSWORD:-interop-password}"
- "OPENMRS_URL=${OPENMRS_URL:-http://openhim-core:5001/openmrs}"
- "OPENMRS_USERNAME=${OPENMRS_USERNAME:-interop-client}"
- "OPENMRS_PASSWORD=${OPENMRS_PASSWORD:-interop-password}"
- "OPENMRS_URL=${OPENMRS_URL}"
- "OPENMRS_USERNAME=${OPENMRS_USERNAME}"
- "OPENMRS_PASSWORD=${OPENMRS_PASSWORD}"
- "CHT_URL=${CHT_URL:-https://nginx}"
- "CHT_USERNAME=${CHT_USERNAME:-admin}"
- "CHT_PASSWORD=${CHT_PASSWORD:-password}"
Expand All @@ -38,6 +38,9 @@ services:
- "OPENHIM_USERNAME=${OPENHIM_USERNAME:[email protected]}"
- "OPENHIM_CLIENT_PASSWORD=${OPENHIM_CLIENT_PASSWORD:-interop-password}"
- "OPENHIM_USER_PASSWORD=${OPENHIM_USER_PASSWORD:-interop-password}"
- "OPENMRS_HOST=${OPENMRS_HOST}"
- "OPENMRS_USERNAME=${OPENMRS_USERNAME}"
- "OPENMRS_PASSWORD=${OPENMRS_PASSWORD}"
networks:
- cht-net

Expand Down
6 changes: 3 additions & 3 deletions mediator/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@ export const CHT = {
};

export const OPENMRS = {
url: getEnvironmentVariable('OPENMRS_URL', 'http://openhim-core:5001/openmrs'),
username: getEnvironmentVariable('OPENMRS_USERNAME', 'interop-client'),
password: getEnvironmentVariable('OPENMRS_PASSWORD', 'interop-password'),
url: getEnvironmentVariable('OPENMRS_URL', ''),
username: getEnvironmentVariable('OPENMRS_USERNAME', ''),
password: getEnvironmentVariable('OPENMRS_PASSWORD', ''),
timeout: Number(getEnvironmentVariable('REQUEST_TIMEOUT', '5000'))
};

Expand Down
16 changes: 16 additions & 0 deletions mediator/config/openmrs_mediator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
export const openMRSMediatorConfig = {
urn: 'urn:mediator:openmrs-mediator',
version: '1.0.0',
name: 'OpenMRS Mediator',
description: 'A mediator to sync CHT data with OpenMRS',
endpoints: [
{
name: 'OpenMRS Mediator',
host: 'mediator',
path: '/',
port: '6000',
primary: true,
type: 'http',
},
],
};
30 changes: 18 additions & 12 deletions mediator/index.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import express, {Request, Response} from 'express';
import { mediatorConfig } from './config/mediator';
import { openMRSMediatorConfig } from './config/openmrs_mediator';
import { logger } from './logger';
import bodyParser from 'body-parser';
import {PORT, OPENHIM, SYNC_INTERVAL} from './config';
import {PORT, OPENHIM, SYNC_INTERVAL, OPENMRS} from './config';
import patientRoutes from './src/routes/patient';
import serviceRequestRoutes from './src/routes/service-request';
import encounterRoutes from './src/routes/encounter';
Expand Down Expand Up @@ -42,17 +43,22 @@ if (process.env.NODE_ENV !== 'test') {
// TODO => inject the 'port' and 'http scheme' into 'mediatorConfig'
registerMediator(OPENHIM, mediatorConfig, registerMediatorCallback);

// start patient and ecnounter sync in the background
setInterval(async () => {
try {
const startTime = new Date();
startTime.setHours(startTime.getHours() - 1);
await syncPatients(startTime);
await syncEncounters(startTime);
} catch (error: any) {
logger.error(error);
}
}, Number(SYNC_INTERVAL));
// if OPENMRS is specified, register its mediator
// and start the sync background task
if (OPENMRS.url) {
registerMediator(OPENHIM, openMRSMediatorConfig, registerMediatorCallback);
// start patient and ecnounter sync in the background
setInterval(async () => {
try {
const startTime = new Date();
startTime.setHours(startTime.getHours() - 1);
await syncPatients(startTime);
await syncEncounters(startTime);
} catch (error: any) {
logger.error(error);
}
}, Number(SYNC_INTERVAL));
}
}

export default app;
4 changes: 2 additions & 2 deletions mediator/src/controllers/service-request.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { logger } from '../../logger';
import { createChtRecord } from '../utils/cht';
import { createChtFollowUpRecord } from '../utils/cht';
import {
getFHIRPatientResource,
getFHIROrgEndpointResource,
Expand All @@ -21,7 +21,7 @@ export async function createServiceRequest(request: fhir4.ServiceRequest) {
const url = endpointRes.data.address;
const subscriptionRes = await createFHIRSubscriptionResource(patientId, url);

const recordRes = await createChtRecord(patientId);
const recordRes = await createChtFollowUpRecord(patientId);

if (recordRes.data.success !== true) {
await deleteFhirSubscription(subscriptionRes.data.id);
Expand Down
6 changes: 3 additions & 3 deletions mediator/src/controllers/tests/utils.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { createChtRecord } from '../../utils/cht';
import { createChtFollowUpRecord } from '../../utils/cht';
import {
getFHIROrgEndpointResource,
getFHIRPatientResource,
Expand All @@ -21,6 +21,6 @@ export const mockCreateFHIRSubscriptionResource =
createFHIRSubscriptionResource as jest.MockedFn<
typeof createFHIRSubscriptionResource
>;
export const mockCreateChtRecord = createChtRecord as jest.MockedFn<
typeof createChtRecord
export const mockCreateChtRecord = createChtFollowUpRecord as jest.MockedFn<
typeof createChtFollowUpRecord
>;
2 changes: 1 addition & 1 deletion mediator/src/utils/cht.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ function getOptions(){
return options;
}

export async function createChtRecord(patientId: string) {
export async function createChtFollowUpRecord(patientId: string) {
const record = {
_meta: {
form: 'interop_follow_up',
Expand Down
6 changes: 3 additions & 3 deletions mediator/src/utils/tests/cht.spec.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { createChtRecord, generateChtRecordsApiUrl } from '../cht';
import { createChtFollowUpRecord, generateChtRecordsApiUrl } from '../cht';
import axios from 'axios';

jest.mock('axios');

const mockAxios = axios as jest.Mocked<typeof axios>;

describe('CHT Utils', () => {
describe('createChtRecord', () => {
describe('createChtFollowUpRecord', () => {
it('creates a new cht record', async () => {
const patientId = 'PATIENT_ID';

const data = { status: 201, data: {} };
mockAxios.post.mockResolvedValueOnce(data);

const res = await createChtRecord(patientId);
const res = await createChtFollowUpRecord(patientId);

expect(res.status).toBe(data.status);
expect(res.data).toStrictEqual(data.data);
Expand Down

0 comments on commit e91be25

Please sign in to comment.