@@ -2,14 +2,28 @@ import logger from '../logger';
2
2
import { MediatorConfig } from '../types/mediatorConfig' ;
3
3
import { RequestOptions } from '../types/request' ;
4
4
import { getConfig } from '../config/config' ;
5
- import { activateHeartbeat , fetchConfig , registerMediator } from 'openhim-mediator-utils' ;
5
+ import axios , { AxiosError } from 'axios' ;
6
+ import https from 'https' ;
7
+ import {
8
+ activateHeartbeat ,
9
+ fetchConfig ,
10
+ registerMediator ,
11
+ authenticate ,
12
+ genAuthHeaders ,
13
+ } from 'openhim-mediator-utils' ;
14
+ import { Bucket , createMinioBucketListeners , ensureBucketExists } from '../utils/minioClient' ;
15
+ import path from 'path' ;
6
16
7
- const { openhimUsername, openhimPassword, openhimMediatorUrl, trustSelfSigned } = getConfig ( ) ;
17
+ const { openhimUsername, openhimPassword, openhimMediatorUrl, trustSelfSigned, runningMode } =
18
+ getConfig ( ) ;
8
19
9
- const resolveMediatorConfig = ( mediatorConfigFilePath : string ) : MediatorConfig => {
20
+ const mediatorConfigFilePath = path . resolve ( __dirname , './mediatorConfig.json' ) ;
21
+
22
+ const resolveMediatorConfig = ( ) : MediatorConfig => {
10
23
let mediatorConfigFile ;
11
24
12
25
try {
26
+ logger . info ( `Loading mediator config from: ${ mediatorConfigFilePath } ` ) ;
13
27
mediatorConfigFile = require ( mediatorConfigFilePath ) ;
14
28
} catch ( error ) {
15
29
logger . error ( `Failed to parse JSON: ${ error } ` ) ;
@@ -29,9 +43,9 @@ const resolveOpenhimConfig = (urn: string): RequestOptions => {
29
43
} ;
30
44
} ;
31
45
32
- export const setupMediator = ( mediatorConfigFilePath : string ) => {
46
+ export const setupMediator = ( ) => {
33
47
try {
34
- const mediatorConfig = resolveMediatorConfig ( mediatorConfigFilePath ) ;
48
+ const mediatorConfig = resolveMediatorConfig ( ) ;
35
49
const openhimConfig = resolveOpenhimConfig ( mediatorConfig . urn ) ;
36
50
37
51
registerMediator ( openhimConfig , mediatorConfig , ( error : Error ) => {
@@ -54,12 +68,78 @@ export const setupMediator = (mediatorConfigFilePath: string) => {
54
68
logger . error ( `Heartbeat failed: ${ JSON . stringify ( err ) } ` ) ;
55
69
} ) ;
56
70
57
- emitter . on ( 'config' , ( config : any ) => {
58
- logger . info ( `Config: ${ JSON . stringify ( config ) } ` ) ;
71
+ emitter . on ( 'config' , async ( config : any ) => {
72
+ logger . info ( 'Received config from OpenHIM' ) ;
73
+
74
+ const buckets = config . minio_buckets_registry as Bucket [ ] ;
75
+
76
+ for await ( const { bucket, region } of buckets ) {
77
+ await ensureBucketExists ( bucket , region ) ;
78
+ }
79
+
80
+ createMinioBucketListeners ( buckets . map ( ( bucket ) => bucket . bucket ) ) ;
59
81
} ) ;
60
82
} ) ;
61
83
} ) ;
62
84
} catch ( err ) {
63
85
logger . error ( 'Unable to register mediator' , err ) ;
64
86
}
65
87
} ;
88
+
89
+ //TODO: Add Typing and error handling.
90
+ async function getMediatorConfig ( ) {
91
+ logger . info ( 'Fetching mediator config from OpenHIM' ) ;
92
+ const mediatorConfig = resolveMediatorConfig ( ) ;
93
+ const openhimConfig = resolveOpenhimConfig ( mediatorConfig . urn ) ;
94
+
95
+ const { apiURL, urn, username, password, trustSelfSigned } = openhimConfig ;
96
+
97
+ try {
98
+ const request = await axios . get ( `${ apiURL } /mediators/urn:mediator:climate-mediator` , {
99
+ auth : {
100
+ username,
101
+ password,
102
+ } ,
103
+ httpsAgent : new https . Agent ( {
104
+ rejectUnauthorized : ! trustSelfSigned ,
105
+ } ) ,
106
+ } ) ;
107
+
108
+ return request . data ;
109
+ } catch ( e ) {
110
+ const error = e as AxiosError ;
111
+ logger . error ( `Failed to fetch mediator config: ${ JSON . stringify ( error ) } ` ) ;
112
+ error . status === 404 && logger . warn ( 'Mediator config not found in OpenHIM, ' ) ;
113
+ return null ;
114
+ }
115
+ }
116
+
117
+ export async function getRegisterBuckets ( ) : Promise < Bucket [ ] > {
118
+ if ( runningMode !== 'testing' ) {
119
+ logger . info ( 'Fetching registered buckets from OpenHIM' ) ;
120
+ const mediatorConfig = await getMediatorConfig ( ) ;
121
+
122
+ //TODO: Handle errors, and undefined response.
123
+ const buckets = mediatorConfig . config ?. minio_buckets_registry as Bucket [ ] ;
124
+ if ( ! buckets ) {
125
+ return [ ] ;
126
+ }
127
+ return buckets ;
128
+ } else {
129
+ logger . info ( 'Running in testing mode, reading buckets from ENV' ) ;
130
+ const buckets = getConfig ( ) . minio . buckets . split ( ',' ) ;
131
+ return buckets . map ( ( bucket ) => ( { bucket, region : '' } ) ) ;
132
+ }
133
+ }
134
+
135
+ export async function registerBucket ( bucket : string , region ?: string ) {
136
+ if ( runningMode !== 'testing' ) {
137
+ return true ;
138
+ }
139
+ const mediatorConfig = await getMediatorConfig ( ) ;
140
+ const existingBuckets = mediatorConfig . config ?. minio_buckets_registry ;
141
+
142
+ if ( ! existingBuckets ) {
143
+ return [ ] ;
144
+ }
145
+ }
0 commit comments