openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
1,128 lines (1,127 loc) • 44.7 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for src/api/mediators.coffee</title>
<meta charset="utf-8" />
<link rel="stylesheet" href="../../prettify.css" />
<link rel="stylesheet" href="../../base.css" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style type='text/css'>
.coverage-summary .sorter {
background-image: url(../../sort-arrow-sprite.png);
}
</style>
</head>
<body>
<div class='wrapper'>
<div class='pad1'>
<h1>
<a href="../../index.html">All files</a> / <a href="index.html">src/api</a> mediators.coffee
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">15.88% </span>
<span class="quiet">Statements</span>
<span class='fraction'>27/170</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">1.69% </span>
<span class="quiet">Branches</span>
<span class='fraction'>1/59</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/26</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">15.48% </span>
<span class="quiet">Lines</span>
<span class='fraction'>26/168</span>
</div>
</div>
</div>
<div class='status-line low'></div>
<pre><table class="coverage">
<tr><td class="line-count quiet">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355</td><td class="line-coverage quiet"><span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-no"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >Channel = require('../model/channels').Channel</span></span>
Mediator = require('../model/mediators').Mediator
Q = require 'q'
logger = require 'winston'
authorisation = require './authorisation'
semver = require 'semver'
atna = require 'atna-audit'
utils = require "../utils"
auditing = require '../auditing'
mask = '**********'
maskPasswords = <span class="fstat-no" title="function not covered" >(</span>defs, config) ->
if not config
<span class="cstat-no" title="statement not covered" > return</span>
defs.forEach <span class="fstat-no" title="function not covered" >(</span>d) ->
if d.type is 'password' and config[d.param]
<span class="cstat-no" title="statement not covered" > if d.array</span>
<span class="cstat-no" title="statement not covered" > config[d.param] = config[d.param].map <span class="fstat-no" title="function not covered" ></span>-> mask</span>
else
<span class="cstat-no" title="statement not covered" > config[d.param] = mask</span>
if d.type is 'struct' and config[d.param]
maskPasswords d.template, config[d.param]
restoreMaskedPasswords = <span class="fstat-no" title="function not covered" >(</span>defs, maskedConfig, config) ->
if not maskedConfig or not config
<span class="cstat-no" title="statement not covered" > return</span>
defs.forEach <span class="fstat-no" title="function not covered" >(</span>d) ->
if d.type is 'password' and maskedConfig[d.param] and config[d.param]
<span class="cstat-no" title="statement not covered" > if d.array</span>
<span class="cstat-no" title="statement not covered" > maskedConfig[d.param].forEach <span class="fstat-no" title="function not covered" >(</span>p, i) -></span>
if p is mask
maskedConfig[d.param][i] = config[d.param][i]
else
<span class="cstat-no" title="statement not covered" > if maskedConfig[d.param] is mask</span>
<span class="cstat-no" title="statement not covered" > maskedConfig[d.param] = config[d.param]</span>
if d.type is 'struct' and maskedConfig[d.param] and config[d.param]
restoreMaskedPasswords d.template, maskedConfig[d.param], config[d.param]
exports.getAllMediators = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getAllMediators denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > m = y</span>ield Mediator.find().exec()
<span class="cstat-no" title="statement not covered" > maskPasswords m.configDefs, m.config</span>
this.body = m
catch <span class="cstat-no" title="statement not covered" >err</span>
logAndSetResponse this, 500, "Could not fetch mediators via the API: #{err}", 'error'
exports.getMediator = <span class="fstat-no" title="function not covered" >(</span>mediatorURN) ->
# Must be admin
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getMediator denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > urn = u</span>nescape mediatorURN
try
<span class="cstat-no" title="statement not covered" > result = y</span>ield Mediator.findOne({ "urn": urn }).exec()
<span class="cstat-no" title="statement not covered" > if result == null</span>
this.status = 404
else
<span class="cstat-no" title="statement not covered" > maskPasswords result.configDefs, result.config</span>
this.body = result
catch <span class="cstat-no" title="statement not covered" >err</span>
logAndSetResponse this, 500, "Could not fetch mediator using UUID #{urn} via the API: #{err}", 'error'
constructError = <span class="fstat-no" title="function not covered" >(</span>message, name) ->
<span class="cstat-no" title="statement not covered" > err = new E</span>rror message
<span class="cstat-no" title="statement not covered" > err.name = n</span>ame
<span class="cstat-no" title="statement not covered" > return e</span>rr
validateConfigDef = <span class="fstat-no" title="function not covered" >(</span>def) ->
if def.type is 'struct' and not def.template
<span class="cstat-no" title="statement not covered" > throw constructError "Must specify a template for struct param '#{def.param}'", 'ValidationError'</span>
else if def.type is 'struct'
<span class="cstat-no" title="statement not covered" > for templateItem in def.template</span>
if not templateItem.param
<span class="cstat-no" title="statement not covered" > throw constructError "Must specify field 'param' in template definition for param '#{def.param}'", 'ValidationError'</span>
if not templateItem.type
<span class="cstat-no" title="statement not covered" > throw constructError "Must specify field 'type' in template definition for param '#{def.param}'", 'ValidationError'</span>
if templateItem.type is 'struct'
<span class="cstat-no" title="statement not covered" > throw constructError "May not recursively specify 'struct' in template definitions (param '#{def.param}')", 'ValidationError'</span>
validateConfigDef templateItem
else if def.type is 'option'
if not utils.typeIsArray def.values
<span class="cstat-no" title="statement not covered" > throw constructError "Expected field 'values' to be an array (option param '#{def.param}')", 'ValidationError'</span>
<span class="cstat-no" title="statement not covered" > if not def.values? or def.values.length is 0</span>
<span class="cstat-no" title="statement not covered" > throw constructError "Must specify a values array for option param '#{def.param}'", 'ValidationError'</span>
# validations additional to the mongoose schema validation
validateConfigDefs = <span class="fstat-no" title="function not covered" >(</span>configDefs) ->
<span class="cstat-no" title="statement not covered" > validateConfigDef def for def in configDefs</span>
exports.addMediator = <span class="fstat-no" title="function not covered" ></span>->
# Must be admin
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to addMediator denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > mediator = this.request.b</span>ody
if mediator?.endpoints?[0]?.host?
<span class="cstat-no" title="statement not covered" > mediatorHost = mediator.endpoints[0].host</span>
else
<span class="cstat-no" title="statement not covered" > mediatorHost = 'unknown'</span>
# audit mediator start
<span class="cstat-no" title="statement not covered" > audit = a</span>tna.appActivityAudit true, mediator.name, mediatorHost, 'system'
<span class="cstat-no" title="statement not covered" > audit = a</span>tna.wrapInSyslog audit
<span class="cstat-no" title="statement not covered" > auditing.sendAuditEvent audit, <span class="fstat-no" title="function not covered" ></span>-></span>
logger.info "Processed internal mediator start audit for: #{mediator.name} - #{mediator.urn}"
if not mediator.urn
<span class="cstat-no" title="statement not covered" > throw constructError 'URN is required', 'ValidationError'</span>
if not mediator.version or not semver.valid(mediator.version)
<span class="cstat-no" title="statement not covered" > throw constructError 'Version is required. Must be in SemVer form x.y.z', 'ValidationError'</span>
if mediator.configDefs
<span class="cstat-no" title="statement not covered" > validateConfigDefs mediator.configDefs</span>
<span class="cstat-no" title="statement not covered" > if mediator.config?</span>
<span class="cstat-no" title="statement not covered" > validateConfig mediator.configDefs, mediator.config</span>
<span class="cstat-no" title="statement not covered" > existing = y</span>ield Mediator.findOne({urn: mediator.urn}).exec()
if existing?
<span class="cstat-no" title="statement not covered" > if semver.gt(mediator.version, existing.version)</span>
# update the mediator
if mediator.config? and existing.config?
# if some config already exists, add only config that didn't exist previously
<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" > for param, val of mediator.config</span></span>
if existing.config[param]?
<span class="cstat-no" title="statement not covered" > mediator.config[param] = existing.config[param]</span>
<span class="cstat-no" title="statement not covered" > yield Mediator.findByIdAndUpdate(existing._id, mediator).exec()</span>
else
# this is a new mediator validate and save it
if not mediator.endpoints or mediator.endpoints.length < 1
<span class="cstat-no" title="statement not covered" > throw constructError 'At least 1 endpoint is required', 'ValidationError'</span>
<span class="cstat-no" title="statement not covered" > yield Q.ninvoke(new Mediator(mediator), 'save')</span>
<span class="cstat-no" title="statement not covered" > this.status = 2</span>01
logger.info "User #{this.authenticated.email} created mediator with urn #{mediator.urn}"
catch <span class="cstat-no" title="statement not covered" >err</span>
<span class="cstat-no" title="statement not covered" > if err.name is 'ValidationError'</span>
utils.logAndSetResponse this, 400, "Could not add Mediator via the API: #{err}", 'error'
else
utils.logAndSetResponse this, 500, "Could not add Mediator via the API: #{err}", 'error'
exports.removeMediator = <span class="fstat-no" title="function not covered" >(</span>urn) ->
# Must be admin
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeMediator denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > urn = u</span>nescape urn
try
<span class="cstat-no" title="statement not covered" > yield Mediator.findOneAndRemove({ urn: urn }).exec()</span>
<span class="cstat-no" title="statement not covered" > this.body = "Mediator with urn #{urn} has been successfully removed by #{this.authenticated.e</span>mail}"
logger.info "Mediator with urn #{urn} has been successfully removed by #{this.authenticated.email}"
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not remove Mediator by urn #{urn} via the API: #{err}", 'error'
exports.heartbeat = <span class="fstat-no" title="function not covered" >(</span>urn) ->
# Must be admin
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeMediator denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > urn = u</span>nescape urn
try
<span class="cstat-no" title="statement not covered" > mediator = y</span>ield Mediator.findOne({ urn: urn }).exec()
if not mediator?
<span class="cstat-no" title="statement not covered" > this.status = 4</span>04
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > heartbeat = this.request.b</span>ody
if not heartbeat?.uptime?
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
if mediator._configModifiedTS > mediator._lastHeartbeat or heartbeat?.config is true
# Return config if it has changed since last heartbeat
<span class="cstat-no" title="statement not covered" > this.body = mediator.config</span>
else
<span class="cstat-no" title="statement not covered" > this.body = ""</span>
# set internal properties
if heartbeat?
update =
_lastHeartbeat: new Date()
_uptime: heartbeat.uptime
<span class="cstat-no" title="statement not covered" > yield Mediator.findByIdAndUpdate(mediator._id, update).exec()</span>
this.status = 200
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not process mediator heartbeat (urn: #{urn}): #{err}", 'error'
validateConfigField = <span class="fstat-no" title="function not covered" >(</span>param, def, field) ->
<span class="cstat-no" title="statement not covered" > switch def.type</span>
when <span class="cstat-no" title="statement not covered" >'string'</span>
if typeof field isnt 'string'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be a string.", 'ValidationError'</span>
when <span class="cstat-no" title="statement not covered" >'bigstring'</span>
if typeof field isnt 'string'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be a large string.", 'ValidationError'</span>
when <span class="cstat-no" title="statement not covered" >'number'</span>
if typeof field isnt 'number'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be a number.", 'ValidationError'</span>
when <span class="cstat-no" title="statement not covered" >'bool'</span>
if typeof field isnt 'boolean'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be a boolean.", 'ValidationError'</span>
when <span class="cstat-no" title="statement not covered" >'option'</span>
if (def.values.indexOf field) is -1
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be one of #{def.values}", 'ValidationError'</span>
when <span class="cstat-no" title="statement not covered" >'map'</span>
if typeof field isnt 'object'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be an object.", 'ValidationError'</span>
<span class="cstat-no" title="statement not covered" > for k, v of field</span>
if typeof v isnt 'string'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to only contain string values.", 'ValidationError'</span>
when <span class="cstat-no" title="statement not covered" >'struct'</span>
if typeof field isnt 'object'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be an object.", 'ValidationError'</span>
<span class="cstat-no" title="statement not covered" > templateFields = (d</span>ef.template.map <span class="fstat-no" title="function not covered" >(</span>tp) -> tp.param)
<span class="cstat-no" title="statement not covered" > for paramField of field</span>
if paramField not in templateFields
<span class="cstat-no" title="statement not covered" > throw constructError "Field #{paramField} is not defined in template definition for config param #{param}.", 'ValidationError'</span>
when 'password'
if typeof field isnt 'string'
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be a string representing a password.", 'ValidationError'</span>
validateConfig = <span class="fstat-no" title="function not covered" >(</span>configDef, config) ->
# reduce to a single true or false value, start assuming valid
<span class="cstat-no" title="statement not covered" > return O</span>bject.keys(config).every <span class="fstat-no" title="function not covered" >(</span>param) ->
# find the matching def if there is one
<span class="cstat-no" title="statement not covered" > matchingDefs = c</span>onfigDef.filter <span class="fstat-no" title="function not covered" >(</span>def) ->
<span class="cstat-no" title="statement not covered" > return def.param is p</span>aram
# fail if there isn't a matching def
if matchingDefs.length is 0
<span class="cstat-no" title="statement not covered" > throw constructError "No config definition found for parameter #{param}", 'ValidationError'</span>
# validate the param against the defs
matchingDefs.map <span class="fstat-no" title="function not covered" >(</span>def) ->
if def.array
if not utils.typeIsArray config[param]
<span class="cstat-no" title="statement not covered" > throw constructError "Expected config param #{param} to be an array of type #{def.type}", 'ValidationError'</span>
<span class="cstat-no" title="statement not covered" > for field, i in config[param]</span>
validateConfigField "#{param}[#{i}]", def, field
else
validateConfigField param, def, config[param]
if process.env.NODE_ENV == "test"
exports.validateConfig = validateConfig
exports.setConfig = <span class="fstat-no" title="function not covered" >(</span>urn) ->
# Must be admin
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeMediator denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > urn = u</span>nescape urn
<span class="cstat-no" title="statement not covered" > config = this.request.b</span>ody
try
<span class="cstat-no" title="statement not covered" > mediator = y</span>ield Mediator.findOne({ urn: urn }).exec()
if not mediator?
<span class="cstat-no" title="statement not covered" > this.status = 4</span>04
<span class="cstat-no" title="statement not covered" > this.body = '</span>No mediator found for this urn.'
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > restoreMaskedPasswords mediator.configDefs, config, mediator.config</span>
<span class="cstat-no" title="statement not covered" > validateConfig mediator.configDefs, config</span>
catch <span class="cstat-no" title="statement not covered" >err</span>
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > this.body = err.m</span>essage
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > yield Mediator.findOneAndUpdate({ urn: urn }, { config: this.request.body, _configModifiedTS: new Date() }).exec()</span>
this.status = 200
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not set mediator config (urn: #{urn}): #{err}", 'error'
saveDefaultChannelConfig = <span class="fstat-no" title="function not covered" >(</span>channels) ->
<span class="cstat-no" title="statement not covered" > promises = [</span>]
<span class="cstat-no" title="statement not covered" > for channel in channels</span>
<span class="cstat-no" title="statement not covered" > delete channel._</span>id
<span class="cstat-no" title="statement not covered" > for route in channel.routes</span>
<span class="cstat-no" title="statement not covered" > delete route._</span>id
<span class="cstat-no" title="statement not covered" > promises.push new Channel(channel).save()</span>
<span class="cstat-no" title="statement not covered" > return p</span>romises
exports.loadDefaultChannels = <span class="fstat-no" title="function not covered" >(</span>urn) ->
# Must be admin
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeMediator denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > urn = u</span>nescape urn
<span class="cstat-no" title="statement not covered" > channels = this.request.b</span>ody
try
<span class="cstat-no" title="statement not covered" > mediator = y</span>ield Mediator.findOne({ urn: urn }).lean().exec()
if not mediator?
<span class="cstat-no" title="statement not covered" > this.status = 4</span>04
<span class="cstat-no" title="statement not covered" > this.body = '</span>No mediator found for this urn.'
<span class="cstat-no" title="statement not covered" > return</span>
if not channels? or channels.length is 0
<span class="cstat-no" title="statement not covered" > yield Q.all saveDefaultChannelConfig(mediator.defaultChannelConfig)</span>
else
<span class="cstat-no" title="statement not covered" > filteredChannelConfig = m</span>ediator.defaultChannelConfig.filter <span class="fstat-no" title="function not covered" >(</span>channel) ->
<span class="cstat-no" title="statement not covered" > return c</span>hannel.name in channels
<span class="cstat-no" title="statement not covered" > if filteredChannelConfig.length < channels.length</span>
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 400, "Could not load mediator default channel config, one or more channels in the request body not found in the mediator config (urn: #{urn})", 'error'</span>
<span class="cstat-no" title="statement not covered" > return</span>
else
<span class="cstat-no" title="statement not covered" > yield Q.all saveDefaultChannelConfig(filteredChannelConfig)</span>
this.status = 201
catch <span class="cstat-no" title="statement not covered" >err</span>
<span class="cstat-no" title="statement not covered" > logger.debug err.stack</span>
utils.logAndSetResponse this, 500, "Could not load mediator default channel config (urn: #{urn}): #{err}", 'error'
</pre></td></tr>
</table></pre>
<div class='push'></div><!-- for sticky footer -->
</div><!-- /wrapper -->
<div class='footer quiet pad2 space-top1 center small'>
Code coverage
generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Oct 10 2016 13:39:22 GMT+0200 (SAST)
</div>
</div>
<script src="../../prettify.js"></script>
<script>
window.onload = function () {
if (typeof prettyPrint === 'function') {
prettyPrint();
}
};
</script>
<script src="../../sorter.js"></script>
</body>
</html>