openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
858 lines (857 loc) • 33.7 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for src/api/roles.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> roles.coffee
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">10.16% </span>
<span class="quiet">Statements</span>
<span class='fraction'>13/128</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/58</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/10</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">10.48% </span>
<span class="quiet">Lines</span>
<span class='fraction'>13/124</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</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-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-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-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-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-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-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-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-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-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-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-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-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-neutral"> </span>
<span class="cline-any cline-yes">1x</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-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-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-yes">1x</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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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">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-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-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-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">Channel = require('../model/channels').Channel
Client = require('../model/clients').Client
logger = require 'winston'
authorisation = require './authorisation'
utils = require '../utils'
###
# Roles is a virtual API; virtual in the sense that it is not linked
# to a concrete roles collection.
#
# Rather it an abstraction of the 'allow' field on Channels and 'roles' on Clients,
# providing a mechanism for setting up allowed permissions.
###
filterRolesFromChannels = <span class="fstat-no" title="function not covered" >(</span>channels, clients) ->
<span class="cstat-no" title="statement not covered" > rolesMap = {</span>} # K: permission, V: channels, clients that share permission
<span class="cstat-no" title="statement not covered" > for ch in channels</span>
<span class="cstat-no" title="statement not covered" > for permission in ch.allow</span>
<span class="cstat-no" title="statement not covered" > isClient = f</span>alse
<span class="cstat-no" title="statement not covered" > for cl in clients</span>
if cl.clientID is permission
<span class="cstat-no" title="statement not covered" > isClient = true</span>
if not isClient
if not rolesMap[permission]
<span class="cstat-no" title="statement not covered" > rolesMap[permission] =</span>
channels: []
clients: []
<span class="cstat-no" title="statement not covered" > rolesMap[permission].channels.push _id: ch._id, name: ch.name</span>
<span class="cstat-no" title="statement not covered" > for cl in clients</span>
<span class="cstat-no" title="statement not covered" > for permission in cl.roles</span>
if not rolesMap[permission]
<span class="cstat-no" title="statement not covered" > rolesMap[permission] =</span>
channels: []
clients: []
<span class="cstat-no" title="statement not covered" > rolesMap[permission].clients.push _id: cl._id, clientID: cl.clientID</span>
<span class="cstat-no" title="statement not covered" > rolesArray = [</span>]
<span class="cstat-no" title="statement not covered" > for role of rolesMap</span>
<span class="cstat-no" title="statement not covered" > rolesArray.push</span>
name: role
channels: rolesMap[role].channels
clients: rolesMap[role].clients
<span class="cstat-no" title="statement not covered" > return r</span>olesArray
exports.getRoles = <span class="fstat-no" title="function not covered" ></span>->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getRoles denied.", 'info'</span>
try
<span class="cstat-no" title="statement not covered" > channels = y</span>ield Channel.find({}, {name: 1, allow: 1 }).exec()
<span class="cstat-no" title="statement not covered" > clients = y</span>ield Client.find({}, {clientID: 1, roles: 1 }).exec()
this.body = filterRolesFromChannels channels, clients
catch <span class="cstat-no" title="statement not covered" >e</span>
<span class="cstat-no" title="statement not covered" > logger.error "Could not fetch roles via the API: #{e.message}"</span>
<span class="cstat-no" title="statement not covered" > this.message = e.m</span>essage
this.status = 500
exports.getRole = <span class="fstat-no" title="function not covered" >(</span>name) ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to getRole denied.", 'info'</span>
try
<span class="cstat-no" title="statement not covered" > channels = y</span>ield Channel.find({allow: {$in: [name]}}, {name: 1 }).exec()
<span class="cstat-no" title="statement not covered" > clients = y</span>ield Client.find({ roles: $in: [name]}, {clientID: 1 }).exec()
<span class="cstat-no" title="statement not covered" > if (channels is null or channels.length is 0) and (clients is null or clients.length is 0)</span>
utils.logAndSetResponse this, 404, "Role with name '#{name}' could not be found.", 'info'
else
this.body =
name: name
channels: channels.map <span class="fstat-no" title="function not covered" >(</span>r) -> _id: r._id, name: r.name
clients: clients.map <span class="fstat-no" title="function not covered" >(</span>c) -> _id: c._id, clientID: c.clientID
catch <span class="cstat-no" title="statement not covered" >e</span>
<span class="cstat-no" title="statement not covered" > logger.error "Could not find role with name '#{name}' via the API: #{e.message}"</span>
<span class="cstat-no" title="statement not covered" > this.body = e.m</span>essage
this.status = 500
buildFindChannelByIdOrNameCriteria = <span class="fstat-no" title="function not covered" >(</span>ctx, role) ->
<span class="cstat-no" title="statement not covered" > criteria = {</span>}
<span class="cstat-no" title="statement not covered" > ids = [</span>]
<span class="cstat-no" title="statement not covered" > names = [</span>]
<span class="cstat-no" title="statement not covered" > for ch in role.channels</span>
if ch._id
<span class="cstat-no" title="statement not covered" > ids.push ch._id</span>
else if ch.name
<span class="cstat-no" title="statement not covered" > names.push ch.name</span>
else
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse ctx, 400, "_id and/or name must be specified for a channel", 'info'</span>
<span class="cstat-no" title="statement not covered" > return null</span>
if ids.length > 0 and names.length > 0
<span class="cstat-no" title="statement not covered" > criteria =</span>
$or: [
_id: $in: ids
,
name: $in: names
]
else
if ids.length > 0
<span class="cstat-no" title="statement not covered" > criteria._id = $in: ids</span>
<span class="cstat-no" title="statement not covered" > if names.length > 0</span>
<span class="cstat-no" title="statement not covered" > criteria.name = $in: names</span>
<span class="cstat-no" title="statement not covered" > return c</span>riteria
buildFindClientByIdOrClientIDCriteria = <span class="fstat-no" title="function not covered" >(</span>ctx, role) ->
<span class="cstat-no" title="statement not covered" > criteria = {</span>}
<span class="cstat-no" title="statement not covered" > ids = [</span>]
<span class="cstat-no" title="statement not covered" > clientIDs = [</span>]
<span class="cstat-no" title="statement not covered" > for ch in role.clients</span>
if ch._id
<span class="cstat-no" title="statement not covered" > ids.push ch._id</span>
else if ch.clientID
<span class="cstat-no" title="statement not covered" > clientIDs.push ch.clientID</span>
else
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse ctx, 400, "_id and/or clientID must be specified for a client", 'info'</span>
<span class="cstat-no" title="statement not covered" > return null</span>
if ids.length > 0 and clientIDs.length > 0
<span class="cstat-no" title="statement not covered" > criteria =</span>
$or: [
_id: $in: ids
,
clientID: $in: clientIDs
]
else
if ids.length > 0
<span class="cstat-no" title="statement not covered" > criteria._id = $in: ids</span>
<span class="cstat-no" title="statement not covered" > if clientIDs.length > 0</span>
<span class="cstat-no" title="statement not covered" > criteria.clientID = $in: clientIDs</span>
<span class="cstat-no" title="statement not covered" > return c</span>riteria
exports.addRole = <span class="fstat-no" title="function not covered" ></span>->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to addRole denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > role = this.request.b</span>ody
if not role.name
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 400, 'Must specify a role name', 'info'</span>
if role.channels?.length is 0 and role.clients?.length is 0
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 400, 'Must specify at least one channel or client to link the role to', 'info'</span>
try
<span class="cstat-no" title="statement not covered" > chResult = y</span>ield Channel.find({allow: {$in: [role.name]}}, {name: 1 }).exec()
<span class="cstat-no" title="statement not covered" > clResult = y</span>ield Client.find({roles: {$in: [role.name]}}, {clientID: 1 }).exec()
if chResult?.length > 0 or clResults?.length > 0
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 400, "Role with name '#{role.name}' already exists.", 'info'</span>
if role.channels
<span class="cstat-no" title="statement not covered" > chCriteria = b</span>uildFindChannelByIdOrNameCriteria this, role
<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span> return if not chCriteria</span>
if role.clients
<span class="cstat-no" title="statement not covered" > clCriteria = b</span>uildFindClientByIdOrClientIDCriteria this, role
<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span> return if not clCriteria</span>
if role.channels
<span class="cstat-no" title="statement not covered" > yield Channel.update(chCriteria, { $push: allow: role.name }, { multi: true }).exec()</span>
if role.clients
<span class="cstat-no" title="statement not covered" > yield Client.update(clCriteria, { $push: roles: role.name }, { multi: true }).exec()</span>
<span class="cstat-no" title="statement not covered" > logger.info "User #{this.authenticated.email} setup role '#{role.name}'"</span>
<span class="cstat-no" title="statement not covered" > this.body = '</span>Role successfully created'
this.status = 201
catch <span class="cstat-no" title="statement not covered" >e</span>
<span class="cstat-no" title="statement not covered" > logger.error "Could not add a role via the API: #{e.message}"</span>
<span class="cstat-no" title="statement not covered" > this.body = e.m</span>essage
this.status = 400
exports.updateRole = <span class="fstat-no" title="function not covered" >(</span>name) ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to updateRole denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > role = this.request.b</span>ody
try
# request validity checks
<span class="cstat-no" title="statement not covered" > chResult = y</span>ield Channel.find({allow: {$in: [name]}}, {name: 1 }).exec()
<span class="cstat-no" title="statement not covered" > clResult = y</span>ield Client.find({roles: {$in: [name]}}, {clientID: 1 }).exec()
if (chResult is null or chResult.length is 0) and (clResult is null or clResult.length is 0)
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 404, "Role with name '#{name}' could not be found.", 'info'</span>
if role.name
# do check here but only perform rename updates later after channel/client updates
<span class="cstat-no" title="statement not covered" > channels = y</span>ield Channel.find({allow: {$in: [role.name]}}, {name: 1 }).exec()
<span class="cstat-no" title="statement not covered" > clients = y</span>ield Client.find({roles: {$in: [role.name]}}, {name: 1 }).exec()
<span class="cstat-no" title="statement not covered" > if channels?.length > 0 or clients?.length > 0</span>
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 400, "Role with name '#{role.name}' already exists.", 'info'</span>
if role.channels
<span class="cstat-no" title="statement not covered" > chCriteria = b</span>uildFindChannelByIdOrNameCriteria this, role
<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span> return if not chCriteria</span>
if role.clients
<span class="cstat-no" title="statement not covered" > clCriteria = b</span>uildFindClientByIdOrClientIDCriteria this, role
<span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" ></span> return if not clCriteria</span>
# update channels
if role.channels
# clear role from existing
<span class="cstat-no" title="statement not covered" > yield Channel.update({}, { $pull: allow: name }, { multi: true }).exec()</span>
# set role on channels
<span class="cstat-no" title="statement not covered" > if role.channels.length > 0</span>
<span class="cstat-no" title="statement not covered" > yield Channel.update(chCriteria, { $push: allow: name }, { multi: true }).exec()</span>
# update clients
if role.clients
# clear role from existing
<span class="cstat-no" title="statement not covered" > yield Client.update({}, { $pull: roles: name }, { multi: true }).exec()</span>
# set role on clients
<span class="cstat-no" title="statement not covered" > if role.clients?.length > 0</span>
<span class="cstat-no" title="statement not covered" > yield Client.update(clCriteria, { $push: roles: name }, { multi: true }).exec()</span>
# rename role
if role.name
<span class="cstat-no" title="statement not covered" > yield Channel.update({ allow: $in: [name] }, { $push: allow: role.name }, { multi: true }).exec()</span>
<span class="cstat-no" title="statement not covered" > yield Channel.update({ allow: $in: [name] }, { $pull: allow: name }, { multi: true }).exec()</span>
<span class="cstat-no" title="statement not covered" > yield Client.update({ roles: $in: [name] }, { $push: roles: role.name }, { multi: true }).exec()</span>
<span class="cstat-no" title="statement not covered" > yield Client.update({ roles: $in: [name] }, { $pull: roles: name }, { multi: true }).exec()</span>
<span class="cstat-no" title="statement not covered" > logger.info "User #{this.authenticated.email} updated role with name '#{name}'"</span>
<span class="cstat-no" title="statement not covered" > this.body = '</span>Successfully updated role'
this.status = 200
catch <span class="cstat-no" title="statement not covered" >e</span>
<span class="cstat-no" title="statement not covered" > logger.error "Could not update role with name '#{name}' via the API: #{e.message}"</span>
<span class="cstat-no" title="statement not covered" > this.body = e.m</span>essage
this.status = 500
exports.deleteRole = <span class="fstat-no" title="function not covered" >(</span>name) ->
# Test if the user is authorised
if not authorisation.inGroup 'admin', this.authenticated
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 403, "User #{this.authenticated.email} is not an admin, API access to updateRole denied.", 'info'</span>
try
<span class="cstat-no" title="statement not covered" > channels = y</span>ield Channel.find({allow: {$in: [name]}}, {name: 1 }).exec()
<span class="cstat-no" title="statement not covered" > clients = y</span>ield Client.find({ roles: $in: [name]}, {clientID: 1 }).exec()
if (channels is null or channels.length is 0) and (clients is null or clients.length is 0)
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 404, "Role with name '#{name}' could not be found.", 'info'</span>
<span class="cstat-no" title="statement not covered" > yield Channel.update({}, { $pull: allow: name }, { multi: true }).exec()</span>
<span class="cstat-no" title="statement not covered" > yield Client.update({}, { $pull: roles: name }, { multi: true }).exec()</span>
<span class="cstat-no" title="statement not covered" > logger.info "User #{this.authenticated.email} deleted role with name '#{name}'"</span>
this.body = 'Successfully deleted role'
catch <span class="cstat-no" title="statement not covered" >e</span>
<span class="cstat-no" title="statement not covered" > logger.error "Could not update role with name '#{name}' via the API: #{e.message}"</span>
<span class="cstat-no" title="statement not covered" > this.body = e.m</span>essage
this.status = 500
</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>