openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
972 lines (971 loc) • 35.1 kB
HTML
<html lang="en">
<head>
<title>Code coverage report for src/api/tasks.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> tasks.coffee
</h1>
<div class='clearfix'>
<div class='fl pad1y space-right2'>
<span class="strong">16.35% </span>
<span class="quiet">Statements</span>
<span class='fraction'>17/104</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Branches</span>
<span class='fraction'>0/16</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">0% </span>
<span class="quiet">Functions</span>
<span class='fraction'>0/13</span>
</div>
<div class='fl pad1y space-right2'>
<span class="strong">16.35% </span>
<span class="quiet">Lines</span>
<span class='fraction'>17/104</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</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-neutral"> </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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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">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-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-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-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-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-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-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-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-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-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></td><td class="text"><pre class="prettyprint lang-js">Task = require('../model/tasks').Task
Transaction = require('../model/transactions').Transaction
AutoRetry = require('../model/autoRetry').AutoRetry
Channels = require('../model/channels')
Channel = Channels.Channel
Q = require 'q'
logger = require 'winston'
authorisation = require './authorisation'
utils = require '../utils'
#####################################################
# Function to check if rerun task creation is valid #
#####################################################
isRerunPermissionsValid = <span class="fstat-no" title="function not covered" >(</span>user, transactions, callback) ->
# if 'admin' - set rerun permissions to true
if authorisation.inGroup("admin", user) is true
# admin user allowed to rerun any transactions
callback null, true
else
Transaction.distinct "channelID", { _id: $in: transactions.tids } , <span class="fstat-no" title="function not covered" >(</span>err, transChannels) ->
Channel.distinct "_id", { txRerunAcl: $in: user.groups } , <span class="fstat-no" title="function not covered" >(</span>err, allowedChannels) ->
# for each transaction channel found to be rerun
<span class="cstat-no" title="statement not covered" > for trx in transChannels</span>
# assume transaction channnel is not allowed at first
<span class="cstat-no" title="statement not covered" > matchFound = f</span>alse
# for each user allowed channel to be rerun
<span class="cstat-no" title="statement not covered" > for chan in allowedChannels</span>
i</span>f trx.equals(chan) then <span class="cstat-no" title="statement not covered" >matchFound = true
# if one channel not allowed then rerun NOT allowed
<span class="cstat-no" title="statement not covered" ></span> return callback null, false if not matchFound
callback null, true
######################################
# Retrieves the list of active tasks #
######################################
exports.getTasks = <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 getTasks denied.", 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
try
<span class="cstat-no" title="statement not covered" > filtersObject = this.request.q</span>uery
#get limit and page values
<span class="cstat-no" title="statement not covered" > filterLimit = filtersObject.f</span>ilterLimit
<span class="cstat-no" title="statement not covered" > filterPage = filtersObject.f</span>ilterPage
#determine skip amount
<span class="cstat-no" title="statement not covered" > filterSkip = filterPage*f</span>ilterLimit
# get filters object
<span class="cstat-no" title="statement not covered" > filters = J</span>SON.parse filtersObject.filters
# parse date to get it into the correct format for querying
if filters['created']
<span class="cstat-no" title="statement not covered" > filters['created'] = JSON.parse filters['created']</span>
# exclude transactions object from tasks list
projectionFiltersObject = { 'transactions': 0 }
<span class="cstat-no" title="statement not covered" > this.body = y</span>ield Task.find({}).exec()
# execute the query
this.body = yield Task
.find filters, projectionFiltersObject
.skip filterSkip
.limit parseInt filterLimit
.sort 'created': -1
.exec()
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not fetch all tasks via the API: #{err}", 'error'
areTransactionChannelsValid = <span class="fstat-no" title="function not covered" >(</span>transactions, callback) ->
Transaction.distinct "channelID", { _id: $in: transactions.tids } , <span class="fstat-no" title="function not covered" >(</span>err, trxChannelIDs) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
Channel.find { _id: $in: trxChannelIDs }, {status: 1}, <span class="fstat-no" title="function not covered" >(</span>err, trxChannels) ->
<span class="cstat-no" title="statement not covered" ></span> return callback err if err
<span class="cstat-no" title="statement not covered" > for chan in trxChannels</span>
if not Channels.isChannelEnabled chan
<span class="cstat-no" title="statement not covered" > return callback null, false</span>
<span class="cstat-no" title="statement not covered" > return c</span>allback null, true
#####################################################
# Creates a new Task
#####################################################
exports.addTask = <span class="fstat-no" title="function not covered" ></span>->
# Get the values to use
<span class="cstat-no" title="statement not covered" > transactions = this.request.b</span>ody
try
<span class="cstat-no" title="statement not covered" > taskObject = {</span>}
<span class="cstat-no" title="statement not covered" > transactionsArr = [</span>]
<span class="cstat-no" title="statement not covered" > taskObject.remainingTransactions = transactions.tids.l</span>ength
<span class="cstat-no" title="statement not covered" > taskObject.user = this.authenticated.e</span>mail
if transactions.batchSize?
if transactions.batchSize <= 0
<span class="cstat-no" title="statement not covered" > return utils.logAndSetResponse this, 400, 'Invalid batch size specified', 'info'</span>
<span class="cstat-no" title="statement not covered" > taskObject.batchSize = transactions.batchSize</span>
if transactions.paused
<span class="cstat-no" title="statement not covered" > taskObject.status = 'Paused'</span>
# check rerun permission and whether to create the rerun task
<span class="cstat-no" title="statement not covered" > isRerunPermsValid = Q</span>.denodeify(isRerunPermissionsValid)
<span class="cstat-no" title="statement not covered" > allowRerunTaskCreation = y</span>ield isRerunPermsValid( this.authenticated, transactions )
# the rerun task may be created
<span class="cstat-no" title="statement not covered" > if allowRerunTaskCreation == true</span>
<span class="cstat-no" title="statement not covered" > areTrxChannelsValid = Q</span>.denodeify(areTransactionChannelsValid)
<span class="cstat-no" title="statement not covered" > trxChannelsValid = y</span>ield areTrxChannelsValid(transactions)
if !trxChannelsValid
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 400, 'Cannot queue task as there are transactions with disabled or deleted channels', 'info'</span>
<span class="cstat-no" title="statement not covered" > return</span>
<span class="cstat-no" title="statement not covered" > transactionsArr.push tid: tid for tid in transactions.tids</span>
<span class="cstat-no" title="statement not covered" > taskObject.transactions = t</span>ransactionsArr
<span class="cstat-no" title="statement not covered" > taskObject.totalTransactions = transactionsArr.l</span>ength
<span class="cstat-no" title="statement not covered" > task = new T</span>ask(taskObject)
<span class="cstat-no" title="statement not covered" > result = y</span>ield Q.ninvoke(task, 'save')
# All ok! So set the result
<span class="cstat-no" title="statement not covered" > utils.logAndSetResponse this, 201, "User #{this.authenticated.email} created task with id #{task.id}", 'info'</span>
# Clear the transactions out of the auto retry queue, in case they're in there
AutoRetry.remove transactionID: $in: transactions.tids, <span class="fstat-no" title="function not covered" >(</span>err) -> logger.err err if err
else
# rerun task creation not allowed
utils.logAndSetResponse this, 403, "Insufficient permissions prevents this rerun task from being created", 'error'
catch <span class="cstat-no" title="statement not covered" >err</span>
# Error! So inform the user
utils.logAndSetResponse this, 500, "Could not add Task via the API: #{err}", 'error'
#############################################
# Retrieves the details for a specific Task #
#############################################
# function to build filtered transactions
buildFilteredTransactionsArray = <span class="fstat-no" title="function not covered" >(</span>filters, transactions) ->
# set tempTransactions array to return
<span class="cstat-no" title="statement not covered" > tempTransactions = [</span>]
<span class="cstat-no" title="statement not covered" > i = 0</span>
<span class="cstat-no" title="statement not covered" > while i < transactions.length</span>
# set filter variable to captured failed filters
<span class="cstat-no" title="statement not covered" > filtersFailed = f</span>alse
if filters.tstatus
# if tstatus doesnt equal filter then set filter failed to true
<span class="cstat-no" title="statement not covered" > if filters.tstatus != transactions[i].tstatus</span>
<span class="cstat-no" title="statement not covered" > filtersFailed = true</span>
if filters.rerunStatus
# if rerunStatus doesnt equal filter then set filter failed to true
<span class="cstat-no" title="statement not covered" > if filters.rerunStatus != transactions[i].rerunStatus</span>
<span class="cstat-no" title="statement not covered" > filtersFailed = true</span>
if filters.hasErrors
# if hasErrors filter 'yes' but no hasErrors exist then set filter failed to true
<span class="cstat-no" title="statement not covered" > if filters.hasErrors == 'yes' && !transactions[i].hasErrors</span>
<span class="cstat-no" title="statement not covered" > filtersFailed = true</span>
# if hasErrors filter 'no' but hasErrors does exist then set filter failed to true
else <span class="cstat-no" title="statement not covered" >if filters.hasErrors == 'no' && transactions[i].hasErrors</span>
<span class="cstat-no" title="statement not covered" > filtersFailed = true</span>
# add transaction if all filters passed successfully
if filtersFailed is false
<span class="cstat-no" title="statement not covered" > tempTransactions.push( transactions[i] )</span>
# increment counter
<span class="cstat-no" title="statement not covered" > i++</span>
<span class="cstat-no" title="statement not covered" > return t</span>empTransactions
exports.getTask = <span class="fstat-no" title="function not covered" >(</span>taskId) ->
# Get the values to use
<span class="cstat-no" title="statement not covered" > taskId = u</span>nescape taskId
try
<span class="cstat-no" title="statement not covered" > filtersObject = this.request.q</span>uery
#get limit and page values
<span class="cstat-no" title="statement not covered" > filterLimit = filtersObject.f</span>ilterLimit
<span class="cstat-no" title="statement not covered" > filterPage = filtersObject.f</span>ilterPage
#determine skip amount
<span class="cstat-no" title="statement not covered" > filterSkip = filterPage*f</span>ilterLimit
# get filters object
<span class="cstat-no" title="statement not covered" > filters = J</span>SON.parse filtersObject.filters
<span class="cstat-no" title="statement not covered" > result = y</span>ield Task.findById(taskId).lean().exec()
<span class="cstat-no" title="statement not covered" > tempTransactions = result.t</span>ransactions
# are filters present
if Object.keys( filters ).length > 0
<span class="cstat-no" title="statement not covered" > tempTransactions = buildFilteredTransactionsArray filters, result.transactions</span>
# get new transactions filters length
<span class="cstat-no" title="statement not covered" > totalFilteredTransactions = tempTransactions.l</span>ength
# assign new transactions filters length to result property
<span class="cstat-no" title="statement not covered" > result.totalFilteredTransactions = t</span>otalFilteredTransactions
# work out where to slice from and till where
<span class="cstat-no" title="statement not covered" > sliceFrom = f</span>ilterSkip
<span class="cstat-no" title="statement not covered" > sliceTo = filterSkip + p</span>arseInt filterLimit
# slice the transactions array to return only the correct amount of records at the correct index
<span class="cstat-no" title="statement not covered" > result.transactions = t</span>empTransactions.slice sliceFrom, sliceTo
# Test if the result if valid
<span class="cstat-no" title="statement not covered" > if result == null</span>
# task not found! So inform the user
utils.logAndSetResponse this, 404, "We could not find a Task with this ID: #{taskId}.", 'info'
else
this.body = result
# All ok! So set the result
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not fetch Task by ID {taskId} via the API: #{err}", 'error'
###########################################
# Updates the details for a specific Task #
###########################################
exports.updateTask = <span class="fstat-no" title="function not covered" >(</span>taskId) ->
# 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 updateTask 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" > taskId = u</span>nescape taskId
<span class="cstat-no" title="statement not covered" > taskData = this.request.b</span>ody
# Ignore _id if it exists, user cannot change the internal id
<span class="cstat-no" title="statement not covered" ></span> delete taskData._id if taskData._id?
try
<span class="cstat-no" title="statement not covered" > yield Task.findOneAndUpdate({ _id: taskId }, taskData).exec()</span>
# All ok! So set the result
<span class="cstat-no" title="statement not covered" > this.body = '</span>The Task was successfully updated'
logger.info "User #{this.authenticated.email} updated task with id #{taskId}"
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not update Task by ID {taskId} via the API: #{err}", 'error'
####################################
# Deletes a specific Tasks details #
####################################
exports.removeTask = <span class="fstat-no" title="function not covered" >(</span>taskId) ->
# 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 removeTask 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" > taskId = u</span>nescape taskId
try
# Try to get the Task (Call the function that emits a promise and Koa will wait for the function to complete)
<span class="cstat-no" title="statement not covered" > yield Task.remove({ _id: taskId }).exec()</span>
# All ok! So set the result
<span class="cstat-no" title="statement not covered" > this.body = '</span>The Task was successfully deleted'
logger.info "User #{this.authenticated.email} removed task with id #{taskId}"
catch <span class="cstat-no" title="statement not covered" >err</span>
utils.logAndSetResponse this, 500, "Could not remove Task by ID {taskId} 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>