openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
879 lines (878 loc) • 33.2 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for src/api/channels.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> channels.coffee
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">21.55% </span>
<span class="quiet">Statements</span>
<span class='fraction'>25/116</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/45</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/19</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">21.74% </span>
<span class="quiet">Lines</span>
<span class='fraction'>25/115</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</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</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-neutral"> </span>
<span class="cline-any cline-yes">1x</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-yes">1x</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-yes">1x</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-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-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-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-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-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</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-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-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-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">1x</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-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-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-neutral"> </span>
<span class="cline-any cline-yes">1x</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-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-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-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-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-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-yes">1x</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">1x</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-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-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-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-yes">1x</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-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-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-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-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></td><td class="text"><pre class="prettyprint lang-js">Channels = require('../model/channels')
Channel = Channels.Channel
Transaction = require('../model/transactions').Transaction
ObjectId = require('mongoose').Types.ObjectId
Q = require 'q'
logger = require 'winston'
authorisation = require './authorisation'
tcpAdapter = require '../tcpAdapter'
server = require "../server"
polling = require "../polling"
routerMiddleware = require '../middleware/router'
utils = require "../utils"
config = require '../config/config'
config.polling = config.get('polling')
request = require 'request'
isPathValid = <span class="fstat-no" title="function not covered" >(</span>channel) ->
if channel.routes?
<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" > for route in channel.routes</span></span>
# There cannot be both path and pathTranform. pathTransform must be valid
if (route.path and route.pathTransform) or (route.pathTransform and not /s\/.*\/.*/.test route.pathTransform)
<span class="cstat-no" title="statement not covered" > return false</span>
<span class="cstat-no" title="statement not covered" > return t</span>rue
###
# Retrieves the list of active channels
###
exports.getChannels = <span class="fstat-no" title="function not covered" ></span>->
try
this.body = yield authorisation.getUserViewableChannels this.authenticated
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not fetch all channels via the API: #{err}", 'error'
processPostAddTriggers = <span class="fstat-no" title="function not covered" >(</span>channel) ->
if channel.type and Channels.isChannelEnabled channel
<span class="cstat-no" title="statement not covered" > if (channel.type is 'tcp' or channel.type is 'tls') and server.isTcpHttpReceiverRunning()</span>
tcpAdapter.notifyMasterToStartTCPServer channel._id, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
else <span class="cstat-no" title="statement not covered" >if channel.type is 'polling'</span>
polling.registerPollingChannel channel, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
###
# Creates a new channel
###
exports.addChannel = <span class="fstat-no" title="function not covered" ></span>->
# Test if the user is authorised
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to addChannel denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
# Get the values to use
<span class="cstat-no" title="statement not covered" > channelData = this.request.b</span>ody
try
<span class="cstat-no" title="statement not covered" > channel = new C</span>hannel channelData
if not isPathValid channel
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel cannot have both path and pathTransform. pathTransform must be of the form s/from/to[/g]'
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
if channel.priority? and channel.priority < 1
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel priority cannot be below 1 (= Highest priority)'
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > numPrimaries = r</span>outerMiddleware.numberOfPrimaryRoutes channel.routes
if numPrimaries is 0
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel must have a primary route'
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
if numPrimaries > 1
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel cannot have a multiple primary routes'
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > result = y</span>ield Q.ninvoke channel, 'save'
# All ok! So set the result
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel successfully created'
<span class="cstat-no" title="statement not covered" > this.status = 2</span>01
<span class="cstat-no" title="statement not covered" > logger.info 'User %s created channel with id %s', this.authenticated.email, channel.id</span>
<span class="cstat-no" title="statement not covered" > channelData._id = channel._</span>id
processPostAddTriggers channelData
catch <span class="cstat-no" title="statement not covered" >err</span>
# Error! So inform the user
utils.logAndSetResponse this, 400, "Could not add channel via the API: #{err}", 'error'
###
# Retrieves the details for a specific channel
###
exports.getChannel = <span class="fstat-no" title="function not covered" >(</span>channelId) ->
# Get the values to use
<span class="cstat-no" title="statement not covered" > id = u</span>nescape channelId
try
# Try to get the channel
<span class="cstat-no" title="statement not covered" > result = n</span>ull
<span class="cstat-no" title="statement not covered" > accessDenied = f</span>alse
# if admin allow acces to all channels otherwise restrict result set
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > result = y</span>ield Channel.findOne({ _id: id, txViewAcl: { $in: this.authenticated.groups } }).exec()
<span class="cstat-no" title="statement not covered" > adminResult = y</span>ield Channel.findById(id).exec()
<span class="cstat-no" title="statement not covered" > if adminResult?</span>
<span class="cstat-no" title="statement not covered" > accessDenied = true</span>
else
<span class="cstat-no" title="statement not covered" > result = yield Channel.findById(id).exec()</span>
# Test if the result if valid
<span class="cstat-no" title="statement not covered" > if result is null</span>
<span class="cstat-no" title="statement not covered" > if accessDenied</span>
# Channel exists but this user doesn't have access
<span class="cstat-no" title="statement not covered" > this.body = "Access denied to channel with Id: '#{id}'</span>."
this.status = 403
else
# Channel not found! So inform the user
<span class="cstat-no" title="statement not covered" > this.body = "We could not find a channel with Id:'#{id}'</span>."
this.status = 404
else
# All ok! So set the result
this.body = result
catch <span class="cstat-no" title="statement not covered" >err</span>
# Error! So inform the user
utils.logAndSetResponse this, 500, "Could not fetch channel by Id '#{id}' via the API: #{err}", 'error'
processPostUpdateTriggers = <span class="fstat-no" title="function not covered" >(</span>channel) ->
if channel.type
<span class="cstat-no" title="statement not covered" > if (channel.type is 'tcp' or channel.type is 'tls') and server.isTcpHttpReceiverRunning()</span>
<span class="cstat-no" title="statement not covered" > if Channels.isChannelEnabled channel</span>
tcpAdapter.notifyMasterToStartTCPServer channel._id, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
else
tcpAdapter.notifyMasterToStopTCPServer channel._id, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
else <span class="cstat-no" title="statement not covered" >if channel.type is 'polling'</span>
<span class="cstat-no" title="statement not covered" > if Channels.isChannelEnabled channel</span>
polling.registerPollingChannel channel, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
else
polling.removePollingChannel channel, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
###
# Updates the details for a specific channel
###
exports.updateChannel = <span class="fstat-no" title="function not covered" >(</span>channelId) ->
# Test if the user is authorised
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to updateChannel denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
# Get the values to use
<span class="cstat-no" title="statement not covered" > id = u</span>nescape channelId
<span class="cstat-no" title="statement not covered" > channelData = this.request.b</span>ody
# Ignore _id if it exists, user cannot change the internal id
if typeof channelData._id isnt 'undefined'
<span class="cstat-no" title="statement not covered" > delete channelData._id</span>
if not isPathValid channelData
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 400, 'Channel cannot have both path and pathTransform. pathTransform must be of the form s/from/to[/g]', 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
if channelData.priority? and channelData.priority < 1
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel priority cannot be below 1 (= Highest priority)'
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
if channelData.routes?
<span class="cstat-no" title="statement not covered" > numPrimaries = r</span>outerMiddleware.numberOfPrimaryRoutes channelData.routes
if numPrimaries is 0
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel must have a primary route'
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > if numPrimaries > 1</span>
<span class="cstat-no" title="statement not covered" > this.body = '</span>Channel cannot have a multiple primary routes'
<span class="cstat-no" title="statement not covered" > this.status = 4</span>00
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > channel = y</span>ield Channel.findByIdAndUpdate(id, channelData).exec()
# All ok! So set the result
<span class="cstat-no" title="statement not covered" > this.body = '</span>The channel was successfully updated'
<span class="cstat-no" title="statement not covered" > logger.info 'User %s updated channel with id %s', this.authenticated.email, id</span>
<span class="cstat-no" title="statement not covered" > channelData._id = O</span>bjectId id
processPostUpdateTriggers channelData
catch <span class="cstat-no" title="statement not covered" >err</span>
# Error! So inform the user
utils.logAndSetResponse this, 500, "Could not update channel by id: #{id} via the API: #{e}", 'error'
processPostDeleteTriggers = <span class="fstat-no" title="function not covered" >(</span>channel) ->
if channel.type
<span class="cstat-no" title="statement not covered" > if (channel.type is 'tcp' or channel.type is 'tls') and server.isTcpHttpReceiverRunning()</span>
tcpAdapter.notifyMasterToStopTCPServer channel._id, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
else <span class="cstat-no" title="statement not covered" >if channel.type is 'polling'</span>
polling.removePollingChannel channel, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.error err if err
###
# Deletes a specific channels details
###
exports.removeChannel = <span class="fstat-no" title="function not covered" >(</span>channelId) ->
# Test if the user is authorised
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeChannel denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
# Get the values to use
<span class="cstat-no" title="statement not covered" > id = u</span>nescape channelId
try
<span class="cstat-no" title="statement not covered" > numExistingTransactions = y</span>ield Transaction.count({ channelID: id }).exec()
# Try to get the channel (Call the function that emits a promise and Koa will wait for the function to complete)
if numExistingTransactions is 0
# safe to remove
<span class="cstat-no" title="statement not covered" > channel = yield Channel.findByIdAndRemove(id).exec()</span>
else
# not safe to remove. just flag as deleted
<span class="cstat-no" title="statement not covered" > channel = yield Channel.findByIdAndUpdate(id, { status: 'deleted' }).exec()</span>
# All ok! So set the result
<span class="cstat-no" title="statement not covered" > this.body = '</span>The channel was successfully deleted'
<span class="cstat-no" title="statement not covered" > logger.info "User #{this.authenticated.email} removed channel with id #{id}"</span>
processPostDeleteTriggers channel
catch <span class="cstat-no" title="statement not covered" >err</span>
# Error! So inform the user
utils.logAndSetResponse this, 500, "Could not remove channel by id: #{id} via the API: #{e}", 'error'
###
# Manually Triggers Polling Channel
###
exports.triggerChannel = <span class="fstat-no" title="function not covered" >(</span>channelId) ->
# Test if the user is authorised
if authorisation.inGroup('admin', this.authenticated) is false
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to removeChannel denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
# Get the values to use
<span class="cstat-no" title="statement not covered" > id = u</span>nescape channelId
# need to initialize return status otherwise will always return 404
<span class="cstat-no" title="statement not covered" > this.status = 2</span>00
try
<span class="cstat-no" title="statement not covered" > channel = y</span>ield Channel.findById(id).exec()
# Test if the result if valid
<span class="cstat-no" title="statement not covered" > if channel is null</span>
# Channel not found! So inform the user
<span class="cstat-no" title="statement not covered" > this.body = "We could not find a channel with Id:'#{id}'</span>."
this.status = 404
else
<span class="cstat-no" title="statement not covered" > logger.info "Manually Polling channel #{channel._id}"</span>
options =
url: "http://#{config.polling.host}:#{config.polling.pollingPort}/trigger"
headers:
'channel-id': channel._id
'X-OpenHIM-LastRunAt': new Date
request options, <span class="fstat-no" title="function not covered" ></span>->
<span class="cstat-no" title="statement not covered" > logger.info "Channel Successfully polled #{channel._id}"</span>
# Return success status
this.status = 200
catch <span class="cstat-no" title="statement not covered" >err</span>
# Error! So inform the user
utils.logAndSetResponse this, 500, "Could not fetch channel by Id '#{id}' via the API: #{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>