@kalisio/kdk 2.6.4 → 2.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/api/hooks/hooks.model.js +1 -1
- package/package.json +1 -1
- package/test/api/core/test-log-2025-07-31.log +15 -0
- package/test/api/core/{test-log-2024-04-23.log → test-log-2025-10-03.log} +4 -9
- package/test/api/core/test-log-2025-11-12.log +117 -0
- package/test/api/core/test-log-2025-11-27.log +0 -0
- package/test/api/core/test-log-2025-11-28.log +17 -0
- package/test/api/core/test-log-2025-12-09.log +148 -0
- package/test/api/core/test-log-2025-12-17.log +58 -0
- package/test/api/core/test-log-2026-01-29.log +17 -0
- package/test/api/core/test-log-2026-03-26.log +0 -0
- package/test/api/map/test-log-2025-07-23.log +1 -0
- package/test/api/map/test-log-2025-11-28.log +33 -0
- package/test/api/map/test-log-2025-12-10.log +2 -0
- package/test/api/map/test-log-2026-01-06.log +26 -0
- package/.vscode/settings.json +0 -5
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/core/api/application.js.html +0 -1870
- package/coverage/core/api/authentication.js.html +0 -742
- package/coverage/core/api/db.js.html +0 -778
- package/coverage/core/api/hooks/hooks.authentication.js.html +0 -313
- package/coverage/core/api/hooks/hooks.authorisations.js.html +0 -1243
- package/coverage/core/api/hooks/hooks.groups.js.html +0 -229
- package/coverage/core/api/hooks/hooks.logger.js.html +0 -163
- package/coverage/core/api/hooks/hooks.model.js.html +0 -955
- package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
- package/coverage/core/api/hooks/hooks.push.js.html +0 -253
- package/coverage/core/api/hooks/hooks.query.js.html +0 -862
- package/coverage/core/api/hooks/hooks.schemas.js.html +0 -298
- package/coverage/core/api/hooks/hooks.service.js.html +0 -319
- package/coverage/core/api/hooks/hooks.storage.js.html +0 -193
- package/coverage/core/api/hooks/hooks.users.js.html +0 -868
- package/coverage/core/api/hooks/index.html +0 -296
- package/coverage/core/api/hooks/index.js.html +0 -121
- package/coverage/core/api/index.html +0 -191
- package/coverage/core/api/index.js.html +0 -148
- package/coverage/core/api/marshall.js.html +0 -448
- package/coverage/core/api/models/groups.model.mongodb.js.html +0 -109
- package/coverage/core/api/models/index.html +0 -176
- package/coverage/core/api/models/messages.model.mongodb.js.html +0 -109
- package/coverage/core/api/models/organisations.model.mongodb.js.html +0 -94
- package/coverage/core/api/models/tags.model.mongodb.js.html +0 -115
- package/coverage/core/api/models/users.model.mongodb.js.html +0 -115
- package/coverage/core/api/services/account/account.hooks.js.html +0 -208
- package/coverage/core/api/services/account/account.service.js.html +0 -436
- package/coverage/core/api/services/account/index.html +0 -131
- package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +0 -184
- package/coverage/core/api/services/authorisations/authorisations.service.js.html +0 -529
- package/coverage/core/api/services/authorisations/index.html +0 -131
- package/coverage/core/api/services/databases/databases.hooks.js.html +0 -193
- package/coverage/core/api/services/databases/databases.service.js.html +0 -100
- package/coverage/core/api/services/databases/index.html +0 -131
- package/coverage/core/api/services/groups/groups.hooks.js.html +0 -178
- package/coverage/core/api/services/groups/index.html +0 -116
- package/coverage/core/api/services/import-export/import-export.hooks.js.html +0 -184
- package/coverage/core/api/services/import-export/import-export.service.js.html +0 -118
- package/coverage/core/api/services/import-export/index.html +0 -131
- package/coverage/core/api/services/index.html +0 -116
- package/coverage/core/api/services/index.js.html +0 -556
- package/coverage/core/api/services/mailer/index.html +0 -131
- package/coverage/core/api/services/mailer/mailer.hooks.js.html +0 -190
- package/coverage/core/api/services/mailer/mailer.service.js.html +0 -118
- package/coverage/core/api/services/messages/index.html +0 -116
- package/coverage/core/api/services/messages/messages.hooks.js.html +0 -184
- package/coverage/core/api/services/organisations/index.html +0 -131
- package/coverage/core/api/services/organisations/organisations.hooks.js.html +0 -178
- package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
- package/coverage/core/api/services/push/index.html +0 -131
- package/coverage/core/api/services/push/push.hooks.js.html +0 -190
- package/coverage/core/api/services/push/push.service.js.html +0 -121
- package/coverage/core/api/services/storage/index.html +0 -131
- package/coverage/core/api/services/storage/storage.hooks.js.html +0 -190
- package/coverage/core/api/services/storage/storage.service.js.html +0 -172
- package/coverage/core/api/services/tags/index.html +0 -116
- package/coverage/core/api/services/tags/tags.hooks.js.html +0 -178
- package/coverage/core/api/services/users/index.html +0 -116
- package/coverage/core/api/services/users/users.hooks.js.html +0 -307
- package/coverage/core/api/utils.js.html +0 -118
- package/coverage/core/common/errors.js.html +0 -88
- package/coverage/core/common/index.html +0 -176
- package/coverage/core/common/index.js.html +0 -115
- package/coverage/core/common/permissions.js.html +0 -1048
- package/coverage/core/common/schema.js.html +0 -190
- package/coverage/core/common/utils.js.html +0 -220
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -506
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/core/api/application.js.html +0 -1870
- package/coverage/lcov-report/core/api/authentication.js.html +0 -742
- package/coverage/lcov-report/core/api/db.js.html +0 -778
- package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +0 -313
- package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +0 -1243
- package/coverage/lcov-report/core/api/hooks/hooks.groups.js.html +0 -229
- package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +0 -163
- package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +0 -955
- package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
- package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +0 -253
- package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +0 -862
- package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +0 -298
- package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +0 -319
- package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +0 -193
- package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +0 -868
- package/coverage/lcov-report/core/api/hooks/index.html +0 -296
- package/coverage/lcov-report/core/api/hooks/index.js.html +0 -121
- package/coverage/lcov-report/core/api/index.html +0 -191
- package/coverage/lcov-report/core/api/index.js.html +0 -148
- package/coverage/lcov-report/core/api/marshall.js.html +0 -448
- package/coverage/lcov-report/core/api/models/groups.model.mongodb.js.html +0 -109
- package/coverage/lcov-report/core/api/models/index.html +0 -176
- package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +0 -109
- package/coverage/lcov-report/core/api/models/organisations.model.mongodb.js.html +0 -94
- package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +0 -115
- package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +0 -115
- package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +0 -208
- package/coverage/lcov-report/core/api/services/account/account.service.js.html +0 -436
- package/coverage/lcov-report/core/api/services/account/index.html +0 -131
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +0 -184
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +0 -529
- package/coverage/lcov-report/core/api/services/authorisations/index.html +0 -131
- package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +0 -193
- package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +0 -100
- package/coverage/lcov-report/core/api/services/databases/index.html +0 -131
- package/coverage/lcov-report/core/api/services/groups/groups.hooks.js.html +0 -178
- package/coverage/lcov-report/core/api/services/groups/index.html +0 -116
- package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +0 -184
- package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +0 -118
- package/coverage/lcov-report/core/api/services/import-export/index.html +0 -131
- package/coverage/lcov-report/core/api/services/index.html +0 -116
- package/coverage/lcov-report/core/api/services/index.js.html +0 -556
- package/coverage/lcov-report/core/api/services/mailer/index.html +0 -131
- package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +0 -190
- package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +0 -118
- package/coverage/lcov-report/core/api/services/messages/index.html +0 -116
- package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +0 -184
- package/coverage/lcov-report/core/api/services/organisations/index.html +0 -131
- package/coverage/lcov-report/core/api/services/organisations/organisations.hooks.js.html +0 -178
- package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
- package/coverage/lcov-report/core/api/services/push/index.html +0 -131
- package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +0 -190
- package/coverage/lcov-report/core/api/services/push/push.service.js.html +0 -121
- package/coverage/lcov-report/core/api/services/storage/index.html +0 -131
- package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +0 -190
- package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +0 -172
- package/coverage/lcov-report/core/api/services/tags/index.html +0 -116
- package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +0 -178
- package/coverage/lcov-report/core/api/services/users/index.html +0 -116
- package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +0 -307
- package/coverage/lcov-report/core/api/utils.js.html +0 -118
- package/coverage/lcov-report/core/common/errors.js.html +0 -88
- package/coverage/lcov-report/core/common/index.html +0 -176
- package/coverage/lcov-report/core/common/index.js.html +0 -115
- package/coverage/lcov-report/core/common/permissions.js.html +0 -1048
- package/coverage/lcov-report/core/common/schema.js.html +0 -190
- package/coverage/lcov-report/core/common/utils.js.html +0 -220
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -506
- package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +0 -457
- package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +0 -397
- package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +0 -1309
- package/coverage/lcov-report/map/api/hooks/index.html +0 -161
- package/coverage/lcov-report/map/api/hooks/index.js.html +0 -94
- package/coverage/lcov-report/map/api/index.html +0 -131
- package/coverage/lcov-report/map/api/index.js.html +0 -139
- package/coverage/lcov-report/map/api/marshall.js.html +0 -178
- package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +0 -106
- package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +0 -127
- package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +0 -196
- package/coverage/lcov-report/map/api/models/index.html +0 -161
- package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +0 -109
- package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +0 -274
- package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +0 -610
- package/coverage/lcov-report/map/api/services/alerts/index.html +0 -131
- package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +0 -310
- package/coverage/lcov-report/map/api/services/catalog/index.html +0 -116
- package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +0 -1510
- package/coverage/lcov-report/map/api/services/daptiles/index.html +0 -116
- package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +0 -241
- package/coverage/lcov-report/map/api/services/features/features.service.js.html +0 -241
- package/coverage/lcov-report/map/api/services/features/index.html +0 -131
- package/coverage/lcov-report/map/api/services/index.html +0 -116
- package/coverage/lcov-report/map/api/services/index.js.html +0 -817
- package/coverage/lcov-report/map/api/services/projects/index.html +0 -116
- package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +0 -439
- package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +0 -466
- package/coverage/lcov-report/map/common/errors.js.html +0 -94
- package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +0 -541
- package/coverage/lcov-report/map/common/grid.js.html +0 -1612
- package/coverage/lcov-report/map/common/index.html +0 -371
- package/coverage/lcov-report/map/common/index.js.html +0 -172
- package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +0 -556
- package/coverage/lcov-report/map/common/moment-utils.js.html +0 -157
- package/coverage/lcov-report/map/common/opendap-grid-source.js.html +0 -868
- package/coverage/lcov-report/map/common/opendap-utils.js.html +0 -826
- package/coverage/lcov-report/map/common/permissions.js.html +0 -124
- package/coverage/lcov-report/map/common/time-based-grid-source.js.html +0 -418
- package/coverage/lcov-report/map/common/tms-utils.js.html +0 -274
- package/coverage/lcov-report/map/common/wcs-grid-source.js.html +0 -364
- package/coverage/lcov-report/map/common/wcs-utils.js.html +0 -586
- package/coverage/lcov-report/map/common/weacast-grid-source.js.html +0 -1033
- package/coverage/lcov-report/map/common/wfs-utils.js.html +0 -574
- package/coverage/lcov-report/map/common/wms-utils.js.html +0 -451
- package/coverage/lcov-report/map/common/wmts-utils.js.html +0 -547
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -10749
- package/coverage/map/api/hooks/hooks.catalog.js.html +0 -457
- package/coverage/map/api/hooks/hooks.features.js.html +0 -397
- package/coverage/map/api/hooks/hooks.query.js.html +0 -1309
- package/coverage/map/api/hooks/index.html +0 -161
- package/coverage/map/api/hooks/index.js.html +0 -94
- package/coverage/map/api/index.html +0 -131
- package/coverage/map/api/index.js.html +0 -139
- package/coverage/map/api/marshall.js.html +0 -178
- package/coverage/map/api/models/alerts.model.mongodb.js.html +0 -106
- package/coverage/map/api/models/catalog.model.mongodb.js.html +0 -127
- package/coverage/map/api/models/features.model.mongodb.js.html +0 -196
- package/coverage/map/api/models/index.html +0 -161
- package/coverage/map/api/models/projects.model.mongodb.js.html +0 -109
- package/coverage/map/api/services/alerts/alerts.hooks.js.html +0 -274
- package/coverage/map/api/services/alerts/alerts.service.js.html +0 -610
- package/coverage/map/api/services/alerts/index.html +0 -131
- package/coverage/map/api/services/catalog/catalog.hooks.js.html +0 -310
- package/coverage/map/api/services/catalog/index.html +0 -116
- package/coverage/map/api/services/daptiles/daptiles.service.js.html +0 -1510
- package/coverage/map/api/services/daptiles/index.html +0 -116
- package/coverage/map/api/services/features/features.hooks.js.html +0 -241
- package/coverage/map/api/services/features/features.service.js.html +0 -241
- package/coverage/map/api/services/features/index.html +0 -131
- package/coverage/map/api/services/index.html +0 -116
- package/coverage/map/api/services/index.js.html +0 -817
- package/coverage/map/api/services/projects/index.html +0 -116
- package/coverage/map/api/services/projects/projects.hooks.js.html +0 -439
- package/coverage/map/common/dynamic-grid-source.js.html +0 -466
- package/coverage/map/common/errors.js.html +0 -94
- package/coverage/map/common/geotiff-grid-source.js.html +0 -541
- package/coverage/map/common/grid.js.html +0 -1612
- package/coverage/map/common/index.html +0 -371
- package/coverage/map/common/index.js.html +0 -172
- package/coverage/map/common/meteo-model-grid-source.js.html +0 -556
- package/coverage/map/common/moment-utils.js.html +0 -157
- package/coverage/map/common/opendap-grid-source.js.html +0 -868
- package/coverage/map/common/opendap-utils.js.html +0 -826
- package/coverage/map/common/permissions.js.html +0 -124
- package/coverage/map/common/time-based-grid-source.js.html +0 -418
- package/coverage/map/common/tms-utils.js.html +0 -274
- package/coverage/map/common/wcs-grid-source.js.html +0 -364
- package/coverage/map/common/wcs-utils.js.html +0 -586
- package/coverage/map/common/weacast-grid-source.js.html +0 -1033
- package/coverage/map/common/wfs-utils.js.html +0 -574
- package/coverage/map/common/wms-utils.js.html +0 -451
- package/coverage/map/common/wmts-utils.js.html +0 -547
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/coverage/tmp/coverage-151166-1723543324307-0.json +0 -1
- package/coverage/tmp/coverage-151178-1723543324283-0.json +0 -1
- package/coverage/tmp/coverage-151189-1723543324271-0.json +0 -1
- package/coverage/tmp/coverage-151201-1723543324248-0.json +0 -1
- package/coverage/tmp/coverage-151208-1723543324227-0.json +0 -1
- package/test/api/core/test-log-2024-04-22.log +0 -84
- package/test/api/core/test-log-2024-08-13.log +0 -3
- /package/test/api/{map/test-log-2025-03-08.log → core/test-log-2025-11-10.log} +0 -0
|
@@ -1,1048 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for core/common/permissions.js</title>
|
|
7
|
-
<meta charset="utf-8" />
|
|
8
|
-
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
-
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
-
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
-
<style type='text/css'>
|
|
13
|
-
.coverage-summary .sorter {
|
|
14
|
-
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
-
}
|
|
16
|
-
</style>
|
|
17
|
-
</head>
|
|
18
|
-
|
|
19
|
-
<body>
|
|
20
|
-
<div class='wrapper'>
|
|
21
|
-
<div class='pad1'>
|
|
22
|
-
<h1><a href="../../index.html">All files</a> / <a href="index.html">core/common</a> permissions.js</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">30.21% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>97/321</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">100% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>3/3</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">3.7% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>1/27</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">30.21% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>97/321</span>
|
|
50
|
-
</div>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
</div>
|
|
54
|
-
<p class="quiet">
|
|
55
|
-
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
-
</p>
|
|
57
|
-
<template id="filterTemplate">
|
|
58
|
-
<div class="quiet">
|
|
59
|
-
Filter:
|
|
60
|
-
<input oninput="onInput()" type="search" id="fileSearch">
|
|
61
|
-
</div>
|
|
62
|
-
</template>
|
|
63
|
-
</div>
|
|
64
|
-
<div class='status-line low'></div>
|
|
65
|
-
<pre><table class="coverage">
|
|
66
|
-
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
-
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
-
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
-
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
-
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
-
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
-
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
-
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
-
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
-
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
-
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
-
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
-
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
-
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
-
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
-
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
-
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
-
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
-
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
-
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
-
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
-
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
-
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
-
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
-
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
-
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
-
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
-
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
-
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
-
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
-
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
-
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
-
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
-
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
-
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
-
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
-
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
-
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
-
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
-
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
-
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
-
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
-
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
-
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
-
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
-
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
-
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
-
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
-
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
-
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
-
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
-
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
-
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
-
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
-
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
-
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
-
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
-
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
-
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
-
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
-
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
-
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
-
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
-
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
-
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
-
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
-
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
-
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
-
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
-
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
-
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
-
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
-
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
-
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
-
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
-
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
-
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
-
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
-
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
-
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
-
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
-
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
-
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
-
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
-
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
-
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
-
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
-
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
-
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
-
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
-
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
-
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
-
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
-
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
-
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
-
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
-
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
-
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
-
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
-
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
-
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
-
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
-
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
-
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
-
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
-
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
-
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
-
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
-
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
-
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
-
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
-
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
-
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
-
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
-
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
-
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
-
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
-
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
-
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
-
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
-
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
-
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
-
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
-
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
-
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
-
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
-
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
-
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
-
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
-
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
-
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
-
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
-
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
-
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
-
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
-
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
-
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
-
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
-
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
-
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
-
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
-
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
-
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
-
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
-
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
-
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
-
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
-
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
-
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
-
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
-
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
-
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
-
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
-
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
-
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
-
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
-
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
-
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
-
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
-
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
-
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
-
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
-
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
-
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
-
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
-
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
-
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
-
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
-
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
-
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
-
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
-
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
-
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
-
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
-
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
-
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
-
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
-
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
-
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
-
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
-
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
-
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
-
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
-
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
-
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
-
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
-
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
-
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
-
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
-
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
-
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
-
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
-
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
-
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
-
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
-
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
-
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
-
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
-
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
-
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
-
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
-
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
-
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
-
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
-
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
-
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
-
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
-
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
-
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
-
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
-
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
-
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
-
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
-
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
-
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
-
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
-
<a name='L266'></a><a href='#L266'>266</a>
|
|
332
|
-
<a name='L267'></a><a href='#L267'>267</a>
|
|
333
|
-
<a name='L268'></a><a href='#L268'>268</a>
|
|
334
|
-
<a name='L269'></a><a href='#L269'>269</a>
|
|
335
|
-
<a name='L270'></a><a href='#L270'>270</a>
|
|
336
|
-
<a name='L271'></a><a href='#L271'>271</a>
|
|
337
|
-
<a name='L272'></a><a href='#L272'>272</a>
|
|
338
|
-
<a name='L273'></a><a href='#L273'>273</a>
|
|
339
|
-
<a name='L274'></a><a href='#L274'>274</a>
|
|
340
|
-
<a name='L275'></a><a href='#L275'>275</a>
|
|
341
|
-
<a name='L276'></a><a href='#L276'>276</a>
|
|
342
|
-
<a name='L277'></a><a href='#L277'>277</a>
|
|
343
|
-
<a name='L278'></a><a href='#L278'>278</a>
|
|
344
|
-
<a name='L279'></a><a href='#L279'>279</a>
|
|
345
|
-
<a name='L280'></a><a href='#L280'>280</a>
|
|
346
|
-
<a name='L281'></a><a href='#L281'>281</a>
|
|
347
|
-
<a name='L282'></a><a href='#L282'>282</a>
|
|
348
|
-
<a name='L283'></a><a href='#L283'>283</a>
|
|
349
|
-
<a name='L284'></a><a href='#L284'>284</a>
|
|
350
|
-
<a name='L285'></a><a href='#L285'>285</a>
|
|
351
|
-
<a name='L286'></a><a href='#L286'>286</a>
|
|
352
|
-
<a name='L287'></a><a href='#L287'>287</a>
|
|
353
|
-
<a name='L288'></a><a href='#L288'>288</a>
|
|
354
|
-
<a name='L289'></a><a href='#L289'>289</a>
|
|
355
|
-
<a name='L290'></a><a href='#L290'>290</a>
|
|
356
|
-
<a name='L291'></a><a href='#L291'>291</a>
|
|
357
|
-
<a name='L292'></a><a href='#L292'>292</a>
|
|
358
|
-
<a name='L293'></a><a href='#L293'>293</a>
|
|
359
|
-
<a name='L294'></a><a href='#L294'>294</a>
|
|
360
|
-
<a name='L295'></a><a href='#L295'>295</a>
|
|
361
|
-
<a name='L296'></a><a href='#L296'>296</a>
|
|
362
|
-
<a name='L297'></a><a href='#L297'>297</a>
|
|
363
|
-
<a name='L298'></a><a href='#L298'>298</a>
|
|
364
|
-
<a name='L299'></a><a href='#L299'>299</a>
|
|
365
|
-
<a name='L300'></a><a href='#L300'>300</a>
|
|
366
|
-
<a name='L301'></a><a href='#L301'>301</a>
|
|
367
|
-
<a name='L302'></a><a href='#L302'>302</a>
|
|
368
|
-
<a name='L303'></a><a href='#L303'>303</a>
|
|
369
|
-
<a name='L304'></a><a href='#L304'>304</a>
|
|
370
|
-
<a name='L305'></a><a href='#L305'>305</a>
|
|
371
|
-
<a name='L306'></a><a href='#L306'>306</a>
|
|
372
|
-
<a name='L307'></a><a href='#L307'>307</a>
|
|
373
|
-
<a name='L308'></a><a href='#L308'>308</a>
|
|
374
|
-
<a name='L309'></a><a href='#L309'>309</a>
|
|
375
|
-
<a name='L310'></a><a href='#L310'>310</a>
|
|
376
|
-
<a name='L311'></a><a href='#L311'>311</a>
|
|
377
|
-
<a name='L312'></a><a href='#L312'>312</a>
|
|
378
|
-
<a name='L313'></a><a href='#L313'>313</a>
|
|
379
|
-
<a name='L314'></a><a href='#L314'>314</a>
|
|
380
|
-
<a name='L315'></a><a href='#L315'>315</a>
|
|
381
|
-
<a name='L316'></a><a href='#L316'>316</a>
|
|
382
|
-
<a name='L317'></a><a href='#L317'>317</a>
|
|
383
|
-
<a name='L318'></a><a href='#L318'>318</a>
|
|
384
|
-
<a name='L319'></a><a href='#L319'>319</a>
|
|
385
|
-
<a name='L320'></a><a href='#L320'>320</a>
|
|
386
|
-
<a name='L321'></a><a href='#L321'>321</a>
|
|
387
|
-
<a name='L322'></a><a href='#L322'>322</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
388
|
-
<span class="cline-any cline-yes">1x</span>
|
|
389
|
-
<span class="cline-any cline-yes">1x</span>
|
|
390
|
-
<span class="cline-any cline-yes">1x</span>
|
|
391
|
-
<span class="cline-any cline-yes">1x</span>
|
|
392
|
-
<span class="cline-any cline-yes">1x</span>
|
|
393
|
-
<span class="cline-any cline-yes">1x</span>
|
|
394
|
-
<span class="cline-any cline-yes">1x</span>
|
|
395
|
-
<span class="cline-any cline-yes">1x</span>
|
|
396
|
-
<span class="cline-any cline-yes">1x</span>
|
|
397
|
-
<span class="cline-any cline-yes">1x</span>
|
|
398
|
-
<span class="cline-any cline-yes">1x</span>
|
|
399
|
-
<span class="cline-any cline-yes">1x</span>
|
|
400
|
-
<span class="cline-any cline-yes">1x</span>
|
|
401
|
-
<span class="cline-any cline-yes">1x</span>
|
|
402
|
-
<span class="cline-any cline-yes">1x</span>
|
|
403
|
-
<span class="cline-any cline-yes">1x</span>
|
|
404
|
-
<span class="cline-any cline-yes">1x</span>
|
|
405
|
-
<span class="cline-any cline-yes">1x</span>
|
|
406
|
-
<span class="cline-any cline-yes">1x</span>
|
|
407
|
-
<span class="cline-any cline-yes">1x</span>
|
|
408
|
-
<span class="cline-any cline-yes">1x</span>
|
|
409
|
-
<span class="cline-any cline-yes">1x</span>
|
|
410
|
-
<span class="cline-any cline-yes">1x</span>
|
|
411
|
-
<span class="cline-any cline-yes">1x</span>
|
|
412
|
-
<span class="cline-any cline-yes">1x</span>
|
|
413
|
-
<span class="cline-any cline-yes">1x</span>
|
|
414
|
-
<span class="cline-any cline-yes">1x</span>
|
|
415
|
-
<span class="cline-any cline-yes">1x</span>
|
|
416
|
-
<span class="cline-any cline-yes">1x</span>
|
|
417
|
-
<span class="cline-any cline-yes">1x</span>
|
|
418
|
-
<span class="cline-any cline-yes">1x</span>
|
|
419
|
-
<span class="cline-any cline-no"> </span>
|
|
420
|
-
<span class="cline-any cline-no"> </span>
|
|
421
|
-
<span class="cline-any cline-no"> </span>
|
|
422
|
-
<span class="cline-any cline-no"> </span>
|
|
423
|
-
<span class="cline-any cline-no"> </span>
|
|
424
|
-
<span class="cline-any cline-no"> </span>
|
|
425
|
-
<span class="cline-any cline-no"> </span>
|
|
426
|
-
<span class="cline-any cline-no"> </span>
|
|
427
|
-
<span class="cline-any cline-no"> </span>
|
|
428
|
-
<span class="cline-any cline-no"> </span>
|
|
429
|
-
<span class="cline-any cline-no"> </span>
|
|
430
|
-
<span class="cline-any cline-no"> </span>
|
|
431
|
-
<span class="cline-any cline-no"> </span>
|
|
432
|
-
<span class="cline-any cline-yes">1x</span>
|
|
433
|
-
<span class="cline-any cline-yes">1x</span>
|
|
434
|
-
<span class="cline-any cline-yes">1x</span>
|
|
435
|
-
<span class="cline-any cline-no"> </span>
|
|
436
|
-
<span class="cline-any cline-no"> </span>
|
|
437
|
-
<span class="cline-any cline-no"> </span>
|
|
438
|
-
<span class="cline-any cline-no"> </span>
|
|
439
|
-
<span class="cline-any cline-no"> </span>
|
|
440
|
-
<span class="cline-any cline-no"> </span>
|
|
441
|
-
<span class="cline-any cline-no"> </span>
|
|
442
|
-
<span class="cline-any cline-no"> </span>
|
|
443
|
-
<span class="cline-any cline-no"> </span>
|
|
444
|
-
<span class="cline-any cline-no"> </span>
|
|
445
|
-
<span class="cline-any cline-no"> </span>
|
|
446
|
-
<span class="cline-any cline-no"> </span>
|
|
447
|
-
<span class="cline-any cline-no"> </span>
|
|
448
|
-
<span class="cline-any cline-no"> </span>
|
|
449
|
-
<span class="cline-any cline-no"> </span>
|
|
450
|
-
<span class="cline-any cline-no"> </span>
|
|
451
|
-
<span class="cline-any cline-no"> </span>
|
|
452
|
-
<span class="cline-any cline-no"> </span>
|
|
453
|
-
<span class="cline-any cline-no"> </span>
|
|
454
|
-
<span class="cline-any cline-no"> </span>
|
|
455
|
-
<span class="cline-any cline-no"> </span>
|
|
456
|
-
<span class="cline-any cline-no"> </span>
|
|
457
|
-
<span class="cline-any cline-no"> </span>
|
|
458
|
-
<span class="cline-any cline-no"> </span>
|
|
459
|
-
<span class="cline-any cline-no"> </span>
|
|
460
|
-
<span class="cline-any cline-no"> </span>
|
|
461
|
-
<span class="cline-any cline-no"> </span>
|
|
462
|
-
<span class="cline-any cline-no"> </span>
|
|
463
|
-
<span class="cline-any cline-no"> </span>
|
|
464
|
-
<span class="cline-any cline-no"> </span>
|
|
465
|
-
<span class="cline-any cline-no"> </span>
|
|
466
|
-
<span class="cline-any cline-no"> </span>
|
|
467
|
-
<span class="cline-any cline-no"> </span>
|
|
468
|
-
<span class="cline-any cline-yes">1x</span>
|
|
469
|
-
<span class="cline-any cline-yes">1x</span>
|
|
470
|
-
<span class="cline-any cline-yes">1x</span>
|
|
471
|
-
<span class="cline-any cline-no"> </span>
|
|
472
|
-
<span class="cline-any cline-no"> </span>
|
|
473
|
-
<span class="cline-any cline-no"> </span>
|
|
474
|
-
<span class="cline-any cline-no"> </span>
|
|
475
|
-
<span class="cline-any cline-no"> </span>
|
|
476
|
-
<span class="cline-any cline-no"> </span>
|
|
477
|
-
<span class="cline-any cline-no"> </span>
|
|
478
|
-
<span class="cline-any cline-no"> </span>
|
|
479
|
-
<span class="cline-any cline-no"> </span>
|
|
480
|
-
<span class="cline-any cline-no"> </span>
|
|
481
|
-
<span class="cline-any cline-no"> </span>
|
|
482
|
-
<span class="cline-any cline-no"> </span>
|
|
483
|
-
<span class="cline-any cline-no"> </span>
|
|
484
|
-
<span class="cline-any cline-no"> </span>
|
|
485
|
-
<span class="cline-any cline-no"> </span>
|
|
486
|
-
<span class="cline-any cline-no"> </span>
|
|
487
|
-
<span class="cline-any cline-no"> </span>
|
|
488
|
-
<span class="cline-any cline-no"> </span>
|
|
489
|
-
<span class="cline-any cline-no"> </span>
|
|
490
|
-
<span class="cline-any cline-yes">1x</span>
|
|
491
|
-
<span class="cline-any cline-yes">1x</span>
|
|
492
|
-
<span class="cline-any cline-yes">8x</span>
|
|
493
|
-
<span class="cline-any cline-yes">3x</span>
|
|
494
|
-
<span class="cline-any cline-yes">3x</span>
|
|
495
|
-
<span class="cline-any cline-yes">8x</span>
|
|
496
|
-
<span class="cline-any cline-yes">1x</span>
|
|
497
|
-
<span class="cline-any cline-yes">1x</span>
|
|
498
|
-
<span class="cline-any cline-no"> </span>
|
|
499
|
-
<span class="cline-any cline-no"> </span>
|
|
500
|
-
<span class="cline-any cline-yes">1x</span>
|
|
501
|
-
<span class="cline-any cline-yes">1x</span>
|
|
502
|
-
<span class="cline-any cline-no"> </span>
|
|
503
|
-
<span class="cline-any cline-no"> </span>
|
|
504
|
-
<span class="cline-any cline-no"> </span>
|
|
505
|
-
<span class="cline-any cline-no"> </span>
|
|
506
|
-
<span class="cline-any cline-no"> </span>
|
|
507
|
-
<span class="cline-any cline-no"> </span>
|
|
508
|
-
<span class="cline-any cline-no"> </span>
|
|
509
|
-
<span class="cline-any cline-no"> </span>
|
|
510
|
-
<span class="cline-any cline-no"> </span>
|
|
511
|
-
<span class="cline-any cline-no"> </span>
|
|
512
|
-
<span class="cline-any cline-yes">1x</span>
|
|
513
|
-
<span class="cline-any cline-yes">1x</span>
|
|
514
|
-
<span class="cline-any cline-no"> </span>
|
|
515
|
-
<span class="cline-any cline-no"> </span>
|
|
516
|
-
<span class="cline-any cline-no"> </span>
|
|
517
|
-
<span class="cline-any cline-no"> </span>
|
|
518
|
-
<span class="cline-any cline-no"> </span>
|
|
519
|
-
<span class="cline-any cline-no"> </span>
|
|
520
|
-
<span class="cline-any cline-no"> </span>
|
|
521
|
-
<span class="cline-any cline-no"> </span>
|
|
522
|
-
<span class="cline-any cline-no"> </span>
|
|
523
|
-
<span class="cline-any cline-no"> </span>
|
|
524
|
-
<span class="cline-any cline-no"> </span>
|
|
525
|
-
<span class="cline-any cline-yes">1x</span>
|
|
526
|
-
<span class="cline-any cline-yes">1x</span>
|
|
527
|
-
<span class="cline-any cline-yes">1x</span>
|
|
528
|
-
<span class="cline-any cline-no"> </span>
|
|
529
|
-
<span class="cline-any cline-no"> </span>
|
|
530
|
-
<span class="cline-any cline-no"> </span>
|
|
531
|
-
<span class="cline-any cline-no"> </span>
|
|
532
|
-
<span class="cline-any cline-no"> </span>
|
|
533
|
-
<span class="cline-any cline-no"> </span>
|
|
534
|
-
<span class="cline-any cline-no"> </span>
|
|
535
|
-
<span class="cline-any cline-no"> </span>
|
|
536
|
-
<span class="cline-any cline-no"> </span>
|
|
537
|
-
<span class="cline-any cline-no"> </span>
|
|
538
|
-
<span class="cline-any cline-no"> </span>
|
|
539
|
-
<span class="cline-any cline-no"> </span>
|
|
540
|
-
<span class="cline-any cline-no"> </span>
|
|
541
|
-
<span class="cline-any cline-no"> </span>
|
|
542
|
-
<span class="cline-any cline-no"> </span>
|
|
543
|
-
<span class="cline-any cline-no"> </span>
|
|
544
|
-
<span class="cline-any cline-no"> </span>
|
|
545
|
-
<span class="cline-any cline-no"> </span>
|
|
546
|
-
<span class="cline-any cline-no"> </span>
|
|
547
|
-
<span class="cline-any cline-yes">1x</span>
|
|
548
|
-
<span class="cline-any cline-yes">1x</span>
|
|
549
|
-
<span class="cline-any cline-yes">1x</span>
|
|
550
|
-
<span class="cline-any cline-yes">1x</span>
|
|
551
|
-
<span class="cline-any cline-no"> </span>
|
|
552
|
-
<span class="cline-any cline-no"> </span>
|
|
553
|
-
<span class="cline-any cline-no"> </span>
|
|
554
|
-
<span class="cline-any cline-no"> </span>
|
|
555
|
-
<span class="cline-any cline-no"> </span>
|
|
556
|
-
<span class="cline-any cline-no"> </span>
|
|
557
|
-
<span class="cline-any cline-no"> </span>
|
|
558
|
-
<span class="cline-any cline-yes">1x</span>
|
|
559
|
-
<span class="cline-any cline-no"> </span>
|
|
560
|
-
<span class="cline-any cline-no"> </span>
|
|
561
|
-
<span class="cline-any cline-no"> </span>
|
|
562
|
-
<span class="cline-any cline-no"> </span>
|
|
563
|
-
<span class="cline-any cline-no"> </span>
|
|
564
|
-
<span class="cline-any cline-no"> </span>
|
|
565
|
-
<span class="cline-any cline-no"> </span>
|
|
566
|
-
<span class="cline-any cline-yes">1x</span>
|
|
567
|
-
<span class="cline-any cline-yes">1x</span>
|
|
568
|
-
<span class="cline-any cline-no"> </span>
|
|
569
|
-
<span class="cline-any cline-no"> </span>
|
|
570
|
-
<span class="cline-any cline-no"> </span>
|
|
571
|
-
<span class="cline-any cline-no"> </span>
|
|
572
|
-
<span class="cline-any cline-no"> </span>
|
|
573
|
-
<span class="cline-any cline-yes">1x</span>
|
|
574
|
-
<span class="cline-any cline-yes">1x</span>
|
|
575
|
-
<span class="cline-any cline-no"> </span>
|
|
576
|
-
<span class="cline-any cline-no"> </span>
|
|
577
|
-
<span class="cline-any cline-no"> </span>
|
|
578
|
-
<span class="cline-any cline-no"> </span>
|
|
579
|
-
<span class="cline-any cline-no"> </span>
|
|
580
|
-
<span class="cline-any cline-no"> </span>
|
|
581
|
-
<span class="cline-any cline-no"> </span>
|
|
582
|
-
<span class="cline-any cline-yes">1x</span>
|
|
583
|
-
<span class="cline-any cline-yes">1x</span>
|
|
584
|
-
<span class="cline-any cline-yes">1x</span>
|
|
585
|
-
<span class="cline-any cline-no"> </span>
|
|
586
|
-
<span class="cline-any cline-no"> </span>
|
|
587
|
-
<span class="cline-any cline-no"> </span>
|
|
588
|
-
<span class="cline-any cline-no"> </span>
|
|
589
|
-
<span class="cline-any cline-no"> </span>
|
|
590
|
-
<span class="cline-any cline-no"> </span>
|
|
591
|
-
<span class="cline-any cline-no"> </span>
|
|
592
|
-
<span class="cline-any cline-no"> </span>
|
|
593
|
-
<span class="cline-any cline-no"> </span>
|
|
594
|
-
<span class="cline-any cline-no"> </span>
|
|
595
|
-
<span class="cline-any cline-no"> </span>
|
|
596
|
-
<span class="cline-any cline-no"> </span>
|
|
597
|
-
<span class="cline-any cline-no"> </span>
|
|
598
|
-
<span class="cline-any cline-no"> </span>
|
|
599
|
-
<span class="cline-any cline-no"> </span>
|
|
600
|
-
<span class="cline-any cline-no"> </span>
|
|
601
|
-
<span class="cline-any cline-no"> </span>
|
|
602
|
-
<span class="cline-any cline-no"> </span>
|
|
603
|
-
<span class="cline-any cline-no"> </span>
|
|
604
|
-
<span class="cline-any cline-no"> </span>
|
|
605
|
-
<span class="cline-any cline-no"> </span>
|
|
606
|
-
<span class="cline-any cline-no"> </span>
|
|
607
|
-
<span class="cline-any cline-no"> </span>
|
|
608
|
-
<span class="cline-any cline-no"> </span>
|
|
609
|
-
<span class="cline-any cline-no"> </span>
|
|
610
|
-
<span class="cline-any cline-no"> </span>
|
|
611
|
-
<span class="cline-any cline-no"> </span>
|
|
612
|
-
<span class="cline-any cline-no"> </span>
|
|
613
|
-
<span class="cline-any cline-no"> </span>
|
|
614
|
-
<span class="cline-any cline-no"> </span>
|
|
615
|
-
<span class="cline-any cline-no"> </span>
|
|
616
|
-
<span class="cline-any cline-no"> </span>
|
|
617
|
-
<span class="cline-any cline-no"> </span>
|
|
618
|
-
<span class="cline-any cline-no"> </span>
|
|
619
|
-
<span class="cline-any cline-no"> </span>
|
|
620
|
-
<span class="cline-any cline-no"> </span>
|
|
621
|
-
<span class="cline-any cline-no"> </span>
|
|
622
|
-
<span class="cline-any cline-no"> </span>
|
|
623
|
-
<span class="cline-any cline-no"> </span>
|
|
624
|
-
<span class="cline-any cline-yes">1x</span>
|
|
625
|
-
<span class="cline-any cline-yes">1x</span>
|
|
626
|
-
<span class="cline-any cline-yes">1x</span>
|
|
627
|
-
<span class="cline-any cline-no"> </span>
|
|
628
|
-
<span class="cline-any cline-no"> </span>
|
|
629
|
-
<span class="cline-any cline-no"> </span>
|
|
630
|
-
<span class="cline-any cline-no"> </span>
|
|
631
|
-
<span class="cline-any cline-no"> </span>
|
|
632
|
-
<span class="cline-any cline-no"> </span>
|
|
633
|
-
<span class="cline-any cline-no"> </span>
|
|
634
|
-
<span class="cline-any cline-no"> </span>
|
|
635
|
-
<span class="cline-any cline-no"> </span>
|
|
636
|
-
<span class="cline-any cline-no"> </span>
|
|
637
|
-
<span class="cline-any cline-no"> </span>
|
|
638
|
-
<span class="cline-any cline-no"> </span>
|
|
639
|
-
<span class="cline-any cline-no"> </span>
|
|
640
|
-
<span class="cline-any cline-no"> </span>
|
|
641
|
-
<span class="cline-any cline-no"> </span>
|
|
642
|
-
<span class="cline-any cline-no"> </span>
|
|
643
|
-
<span class="cline-any cline-no"> </span>
|
|
644
|
-
<span class="cline-any cline-no"> </span>
|
|
645
|
-
<span class="cline-any cline-yes">1x</span>
|
|
646
|
-
<span class="cline-any cline-yes">1x</span>
|
|
647
|
-
<span class="cline-any cline-yes">1x</span>
|
|
648
|
-
<span class="cline-any cline-no"> </span>
|
|
649
|
-
<span class="cline-any cline-no"> </span>
|
|
650
|
-
<span class="cline-any cline-yes">1x</span>
|
|
651
|
-
<span class="cline-any cline-yes">1x</span>
|
|
652
|
-
<span class="cline-any cline-no"> </span>
|
|
653
|
-
<span class="cline-any cline-no"> </span>
|
|
654
|
-
<span class="cline-any cline-yes">1x</span>
|
|
655
|
-
<span class="cline-any cline-yes">1x</span>
|
|
656
|
-
<span class="cline-any cline-yes">1x</span>
|
|
657
|
-
<span class="cline-any cline-no"> </span>
|
|
658
|
-
<span class="cline-any cline-no"> </span>
|
|
659
|
-
<span class="cline-any cline-yes">1x</span>
|
|
660
|
-
<span class="cline-any cline-yes">1x</span>
|
|
661
|
-
<span class="cline-any cline-no"> </span>
|
|
662
|
-
<span class="cline-any cline-no"> </span>
|
|
663
|
-
<span class="cline-any cline-yes">1x</span>
|
|
664
|
-
<span class="cline-any cline-yes">1x</span>
|
|
665
|
-
<span class="cline-any cline-yes">1x</span>
|
|
666
|
-
<span class="cline-any cline-no"> </span>
|
|
667
|
-
<span class="cline-any cline-no"> </span>
|
|
668
|
-
<span class="cline-any cline-yes">1x</span>
|
|
669
|
-
<span class="cline-any cline-yes">1x</span>
|
|
670
|
-
<span class="cline-any cline-no"> </span>
|
|
671
|
-
<span class="cline-any cline-no"> </span>
|
|
672
|
-
<span class="cline-any cline-yes">1x</span>
|
|
673
|
-
<span class="cline-any cline-yes">1x</span>
|
|
674
|
-
<span class="cline-any cline-no"> </span>
|
|
675
|
-
<span class="cline-any cline-no"> </span>
|
|
676
|
-
<span class="cline-any cline-no"> </span>
|
|
677
|
-
<span class="cline-any cline-no"> </span>
|
|
678
|
-
<span class="cline-any cline-yes">1x</span>
|
|
679
|
-
<span class="cline-any cline-yes">1x</span>
|
|
680
|
-
<span class="cline-any cline-no"> </span>
|
|
681
|
-
<span class="cline-any cline-no"> </span>
|
|
682
|
-
<span class="cline-any cline-no"> </span>
|
|
683
|
-
<span class="cline-any cline-no"> </span>
|
|
684
|
-
<span class="cline-any cline-yes">1x</span>
|
|
685
|
-
<span class="cline-any cline-yes">1x</span>
|
|
686
|
-
<span class="cline-any cline-no"> </span>
|
|
687
|
-
<span class="cline-any cline-no"> </span>
|
|
688
|
-
<span class="cline-any cline-yes">1x</span>
|
|
689
|
-
<span class="cline-any cline-yes">1x</span>
|
|
690
|
-
<span class="cline-any cline-no"> </span>
|
|
691
|
-
<span class="cline-any cline-no"> </span>
|
|
692
|
-
<span class="cline-any cline-yes">1x</span>
|
|
693
|
-
<span class="cline-any cline-yes">1x</span>
|
|
694
|
-
<span class="cline-any cline-no"> </span>
|
|
695
|
-
<span class="cline-any cline-no"> </span>
|
|
696
|
-
<span class="cline-any cline-yes">1x</span>
|
|
697
|
-
<span class="cline-any cline-yes">1x</span>
|
|
698
|
-
<span class="cline-any cline-no"> </span>
|
|
699
|
-
<span class="cline-any cline-no"> </span>
|
|
700
|
-
<span class="cline-any cline-no"> </span>
|
|
701
|
-
<span class="cline-any cline-no"> </span>
|
|
702
|
-
<span class="cline-any cline-yes">1x</span>
|
|
703
|
-
<span class="cline-any cline-yes">1x</span>
|
|
704
|
-
<span class="cline-any cline-no"> </span>
|
|
705
|
-
<span class="cline-any cline-no"> </span>
|
|
706
|
-
<span class="cline-any cline-no"> </span>
|
|
707
|
-
<span class="cline-any cline-no"> </span>
|
|
708
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
|
|
709
|
-
import { AbilityBuilder, Ability, createAliasResolver } from '@casl/ability'
|
|
710
|
-
import { toMongoQuery } from '@casl/mongoose'
|
|
711
|
-
|
|
712
|
-
// Define some alias to simplify ability definitions
|
|
713
|
-
const resolveAction = createAliasResolver({
|
|
714
|
-
update: ['patch'],
|
|
715
|
-
read: ['get', 'find'],
|
|
716
|
-
remove: ['delete'],
|
|
717
|
-
all: ['read', 'create', 'update', 'remove']
|
|
718
|
-
})
|
|
719
|
-
|
|
720
|
-
export const Roles = {
|
|
721
|
-
member: 0,
|
|
722
|
-
manager: 1,
|
|
723
|
-
owner: 2
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
export const RoleNames = [
|
|
727
|
-
'member',
|
|
728
|
-
'manager',
|
|
729
|
-
'owner'
|
|
730
|
-
]
|
|
731
|
-
|
|
732
|
-
// Hooks that can be added to customize abilities computation
|
|
733
|
-
let hooks = []
|
|
734
|
-
|
|
735
|
-
// Get the unique global symbol to store resource type / context on a resource object
|
|
736
|
-
export const RESOURCE_TYPE = 'type'
|
|
737
|
-
export const RESOURCE_TYPE_KEY = Symbol.for(RESOURCE_TYPE)
|
|
738
|
-
|
|
739
|
-
export <span class="fstat-no" title="function not covered" >function defineResourceRules (subject, resource, resourceService, can) {</span>
|
|
740
|
-
<span class="cstat-no" title="statement not covered" > const role = Roles[resource.permissions]</span>
|
|
741
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
742
|
-
<span class="cstat-no" title="statement not covered" > if (role >= Roles.member) {</span>
|
|
743
|
-
<span class="cstat-no" title="statement not covered" > can('read', resourceService, { _id: resource._id })</span>
|
|
744
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
745
|
-
<span class="cstat-no" title="statement not covered" > if (role >= Roles.manager) {</span>
|
|
746
|
-
<span class="cstat-no" title="statement not covered" > can('update', resourceService, { _id: resource._id })</span>
|
|
747
|
-
<span class="cstat-no" title="statement not covered" > can(['create', 'remove'], 'authorisations', { resource: resource._id })</span>
|
|
748
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
749
|
-
<span class="cstat-no" title="statement not covered" > if (role >= Roles.owner) {</span>
|
|
750
|
-
<span class="cstat-no" title="statement not covered" > can('remove', resourceService, { _id: resource._id })</span>
|
|
751
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
752
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
753
|
-
|
|
754
|
-
// Hook computing default abilities for a given user
|
|
755
|
-
export <span class="fstat-no" title="function not covered" >function defineUserAbilities (subject, can, cannot) {</span>
|
|
756
|
-
<span class="cstat-no" title="statement not covered" > // Allow user registration</span>
|
|
757
|
-
<span class="cstat-no" title="statement not covered" > can('service', 'users')</span>
|
|
758
|
-
<span class="cstat-no" title="statement not covered" > can('create', 'users')</span>
|
|
759
|
-
<span class="cstat-no" title="statement not covered" > // Verification email, reset password, etc.</span>
|
|
760
|
-
<span class="cstat-no" title="statement not covered" > can('service', 'account')</span>
|
|
761
|
-
<span class="cstat-no" title="statement not covered" > can(['create', 'verifyEmail'], 'account')</span>
|
|
762
|
-
<span class="cstat-no" title="statement not covered" > // Allow import/export</span>
|
|
763
|
-
<span class="cstat-no" title="statement not covered" > can('service', 'import-export')</span>
|
|
764
|
-
<span class="cstat-no" title="statement not covered" > can('create', 'import-export')</span>
|
|
765
|
-
<span class="cstat-no" title="statement not covered" > // Allow push registration</span>
|
|
766
|
-
<span class="cstat-no" title="statement not covered" > can('service', 'push')</span>
|
|
767
|
-
<span class="cstat-no" title="statement not covered" > can('create', 'push')</span>
|
|
768
|
-
<span class="cstat-no" title="statement not covered" > if (subject && subject._id) {</span>
|
|
769
|
-
<span class="cstat-no" title="statement not covered" > // Read user profiles for authorizing</span>
|
|
770
|
-
<span class="cstat-no" title="statement not covered" > can('read', 'users')</span>
|
|
771
|
-
<span class="cstat-no" title="statement not covered" > // Update user profile and destroy it</span>
|
|
772
|
-
<span class="cstat-no" title="statement not covered" > can(['update', 'remove'], 'users', { _id: subject._id })</span>
|
|
773
|
-
<span class="cstat-no" title="statement not covered" > // Access authorisation service, then rights will be granted on a per-resource basis</span>
|
|
774
|
-
<span class="cstat-no" title="statement not covered" > can('service', 'authorisations')</span>
|
|
775
|
-
<span class="cstat-no" title="statement not covered" > // Access storage service, then rights will be granted on a per-resource basis</span>
|
|
776
|
-
<span class="cstat-no" title="statement not covered" > can('service', 'storage')</span>
|
|
777
|
-
<span class="cstat-no" title="statement not covered" > // This is for the user avatar</span>
|
|
778
|
-
<span class="cstat-no" title="statement not covered" > // take care that the storage service uses 'id' as input but produces _id as output</span>
|
|
779
|
-
<span class="cstat-no" title="statement not covered" > can('create', 'storage', { id: 'avatars/' + subject._id.toString() })</span>
|
|
780
|
-
<span class="cstat-no" title="statement not covered" > can('create', 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })</span>
|
|
781
|
-
<span class="cstat-no" title="statement not covered" > can(['createMultipartUpload', 'completeMultipartUpload', 'uploadPart', 'putObject'], 'storage', { id: 'avatars/' + subject._id.toString() })</span>
|
|
782
|
-
<span class="cstat-no" title="statement not covered" > can(['createMultipartUpload', 'completeMultipartUpload', 'uploadPart', 'putObject'], 'storage', { id: 'avatars/' + subject._id.toString() + '.thumbnail' })</span>
|
|
783
|
-
<span class="cstat-no" title="statement not covered" > can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() })</span>
|
|
784
|
-
<span class="cstat-no" title="statement not covered" > can('remove', 'storage', { _id: 'avatars/' + subject._id.toString() + '.thumbnail' })</span>
|
|
785
|
-
<span class="cstat-no" title="statement not covered" > // Avatar is part of user profiles so that they can be read by any</span>
|
|
786
|
-
<span class="cstat-no" title="statement not covered" > can('read', 'storage', { _id: { $regex: '^avatars/*' } })</span>
|
|
787
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
788
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
789
|
-
|
|
790
|
-
// Compute abilities for a given user
|
|
791
|
-
export <span class="fstat-no" title="function not covered" >async function defineAbilities (subject, ...args) {</span>
|
|
792
|
-
<span class="cstat-no" title="statement not covered" > const { build, can, cannot } = new AbilityBuilder(Ability)</span>
|
|
793
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
794
|
-
<span class="cstat-no" title="statement not covered" > // Run registered hooks providing any additional arguments used to handle complex use cases</span>
|
|
795
|
-
<span class="cstat-no" title="statement not covered" > await Promise.all(hooks.map(async hook => {</span>
|
|
796
|
-
<span class="cstat-no" title="statement not covered" > await hook(subject, can, cannot, ...args)</span>
|
|
797
|
-
<span class="cstat-no" title="statement not covered" > }))</span>
|
|
798
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
799
|
-
<span class="cstat-no" title="statement not covered" > // CASL cannot infer the object type from the object itself so we need</span>
|
|
800
|
-
<span class="cstat-no" title="statement not covered" > // to tell it how he can find the object type, i.e. service name.</span>
|
|
801
|
-
<span class="cstat-no" title="statement not covered" > return build({</span>
|
|
802
|
-
<span class="cstat-no" title="statement not covered" > detectSubjectType: resource => {</span>
|
|
803
|
-
<span class="cstat-no" title="statement not covered" > if (!resource || typeof resource === 'string') {</span>
|
|
804
|
-
<span class="cstat-no" title="statement not covered" > return resource</span>
|
|
805
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
806
|
-
<span class="cstat-no" title="statement not covered" > return resource[RESOURCE_TYPE_KEY]</span>
|
|
807
|
-
<span class="cstat-no" title="statement not covered" > },</span>
|
|
808
|
-
<span class="cstat-no" title="statement not covered" > resolveAction</span>
|
|
809
|
-
<span class="cstat-no" title="statement not covered" > })</span>
|
|
810
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
811
|
-
|
|
812
|
-
defineAbilities.registerHook = function (hook) {
|
|
813
|
-
if (!hooks.includes(hook)) {
|
|
814
|
-
hooks.push(hook)
|
|
815
|
-
}
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
defineAbilities.unregisterHook = <span class="fstat-no" title="function not covered" >function (hook) {</span>
|
|
819
|
-
<span class="cstat-no" title="statement not covered" > hooks = hooks.filter(registeredHook => registeredHook !== hook)</span>
|
|
820
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
821
|
-
|
|
822
|
-
export <span class="fstat-no" title="function not covered" >function hasServiceAbilities (abilities, service) {</span>
|
|
823
|
-
<span class="cstat-no" title="statement not covered" > if (!abilities) return false</span>
|
|
824
|
-
<span class="cstat-no" title="statement not covered" > // The unique identifier of a service is its path not its name.</span>
|
|
825
|
-
<span class="cstat-no" title="statement not covered" > // Indeed we have for instance a 'groups' service in each organisation</span>
|
|
826
|
-
<span class="cstat-no" title="statement not covered" > // Take care that in client we have the service path while on server we have the actual object</span>
|
|
827
|
-
<span class="cstat-no" title="statement not covered" > const path = typeof service === 'string' ? service : service.getPath()</span>
|
|
828
|
-
<span class="cstat-no" title="statement not covered" > // */groups will allow to access any groups service in any context</span>
|
|
829
|
-
<span class="cstat-no" title="statement not covered" > return abilities.can('service', path) ||</span>
|
|
830
|
-
<span class="cstat-no" title="statement not covered" > abilities.can('service', `*/${path}`) ||</span>
|
|
831
|
-
<span class="cstat-no" title="statement not covered" > abilities.can('service', _.replace(path, /^.*\//, '*/'))</span>
|
|
832
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
833
|
-
|
|
834
|
-
export <span class="fstat-no" title="function not covered" >function hasResourceAbilities (abilities, operation, resourceType, context, resource) {</span>
|
|
835
|
-
<span class="cstat-no" title="statement not covered" > if (!abilities) return false</span>
|
|
836
|
-
<span class="cstat-no" title="statement not covered" > // Create a shallow copy adding context and type</span>
|
|
837
|
-
<span class="cstat-no" title="statement not covered" > const object = Object.assign({}, resource)</span>
|
|
838
|
-
<span class="cstat-no" title="statement not covered" > object[RESOURCE_TYPE_KEY] = resourceType</span>
|
|
839
|
-
<span class="cstat-no" title="statement not covered" > // Add a virtual context to take it into account for object having no link to it</span>
|
|
840
|
-
<span class="cstat-no" title="statement not covered" > if (context) object.context = (typeof context === 'object' ? context._id.toString() : context.toString())</span>
|
|
841
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
842
|
-
<span class="cstat-no" title="statement not covered" > const result = abilities.can(operation, object)</span>
|
|
843
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
844
|
-
<span class="cstat-no" title="statement not covered" > return result</span>
|
|
845
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
846
|
-
|
|
847
|
-
// Utility function used to remove the virtual context from query
|
|
848
|
-
export <span class="fstat-no" title="function not covered" >function removeContext (query) {</span>
|
|
849
|
-
<span class="cstat-no" title="statement not covered" > _.forOwn(query, (value, key) => {</span>
|
|
850
|
-
<span class="cstat-no" title="statement not covered" > // Process current attributes or recurse</span>
|
|
851
|
-
<span class="cstat-no" title="statement not covered" > // Take care to nested fields like 'field._id'</span>
|
|
852
|
-
<span class="cstat-no" title="statement not covered" > if (key === 'context') {</span>
|
|
853
|
-
<span class="cstat-no" title="statement not covered" > delete query.context</span>
|
|
854
|
-
<span class="cstat-no" title="statement not covered" > } else if (Array.isArray(value)) {</span>
|
|
855
|
-
<span class="cstat-no" title="statement not covered" > value.forEach(item => removeContext(item))</span>
|
|
856
|
-
<span class="cstat-no" title="statement not covered" > // Remove empty objects from array</span>
|
|
857
|
-
<span class="cstat-no" title="statement not covered" > // _.remove(value, item => _.isEmpty(item))</span>
|
|
858
|
-
<span class="cstat-no" title="statement not covered" > // Remove empty arrays from query</span>
|
|
859
|
-
<span class="cstat-no" title="statement not covered" > if (_.isEmpty(value)) delete query[key]</span>
|
|
860
|
-
<span class="cstat-no" title="statement not covered" > } else if (typeof value === 'object') {</span>
|
|
861
|
-
<span class="cstat-no" title="statement not covered" > removeContext(value)</span>
|
|
862
|
-
<span class="cstat-no" title="statement not covered" > // Remove empty objects from query</span>
|
|
863
|
-
<span class="cstat-no" title="statement not covered" > if (_.isEmpty(value)) delete query[key]</span>
|
|
864
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
865
|
-
<span class="cstat-no" title="statement not covered" > })</span>
|
|
866
|
-
<span class="cstat-no" title="statement not covered" > return query</span>
|
|
867
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
868
|
-
|
|
869
|
-
// Get the query used to filter the objects according to given abilities
|
|
870
|
-
// A null query indicates that access should not be granted
|
|
871
|
-
export <span class="fstat-no" title="function not covered" >function getQueryForAbilities (abilities, operation, resourceType) {</span>
|
|
872
|
-
<span class="cstat-no" title="statement not covered" > if (!abilities) return null</span>
|
|
873
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
874
|
-
<span class="cstat-no" title="statement not covered" > const query = toMongoQuery(abilities, resourceType, operation)</span>
|
|
875
|
-
<span class="cstat-no" title="statement not covered" > // Remove any context to avoid taking it into account because it is not really stored on objects</span>
|
|
876
|
-
<span class="cstat-no" title="statement not covered" > // We clone the object here because of references to the abilities rules (see https://github.com/kalisio/kdk/issues/384)</span>
|
|
877
|
-
<span class="cstat-no" title="statement not covered" > return (query ? removeContext(_.cloneDeep(query)) : null)</span>
|
|
878
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
879
|
-
|
|
880
|
-
<span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function buildSubjectsQueryForResource (resourceScope, resourceId, role) {</span></span>
|
|
881
|
-
<span class="cstat-no" title="statement not covered" > const query = { [resourceScope]: { $elemMatch: { _id: resourceId } } }</span>
|
|
882
|
-
<span class="cstat-no" title="statement not covered" > if (role) {</span>
|
|
883
|
-
<span class="cstat-no" title="statement not covered" > _.set(query[resourceScope], '$elemMatch.permissions', (typeof role === 'string' ? role : RoleNames[role]))</span>
|
|
884
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
885
|
-
<span class="cstat-no" title="statement not covered" > return query</span>
|
|
886
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
887
|
-
|
|
888
|
-
export <span class="fstat-no" title="function not covered" >function findSubjectsForResource (subjectService, resourceScope, resourceId, role) {</span>
|
|
889
|
-
<span class="cstat-no" title="statement not covered" > // Build the query</span>
|
|
890
|
-
<span class="cstat-no" title="statement not covered" > const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)</span>
|
|
891
|
-
<span class="cstat-no" title="statement not covered" > // Execute the query</span>
|
|
892
|
-
<span class="cstat-no" title="statement not covered" > return subjectService.find({ query })</span>
|
|
893
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
894
|
-
|
|
895
|
-
export <span class="fstat-no" title="function not covered" >function countSubjectsForResource (subjectService, resourceScope, resourceId, role) {</span>
|
|
896
|
-
<span class="cstat-no" title="statement not covered" > // Build the query</span>
|
|
897
|
-
<span class="cstat-no" title="statement not covered" > const query = buildSubjectsQueryForResource(resourceScope, resourceId, role)</span>
|
|
898
|
-
<span class="cstat-no" title="statement not covered" > // Indicate we'd only like to count</span>
|
|
899
|
-
<span class="cstat-no" title="statement not covered" > query.$limit = 0</span>
|
|
900
|
-
<span class="cstat-no" title="statement not covered" > // Execute the query</span>
|
|
901
|
-
<span class="cstat-no" title="statement not covered" > return subjectService.find({ query })</span>
|
|
902
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
903
|
-
|
|
904
|
-
// Hook computing organisation abilities for a given user
|
|
905
|
-
export <span class="fstat-no" title="function not covered" >function defineOrganisationAbilities (subject, can, cannot) {</span>
|
|
906
|
-
<span class="cstat-no" title="statement not covered" > if (subject) {</span>
|
|
907
|
-
<span class="cstat-no" title="statement not covered" > // Create new organisations</span>
|
|
908
|
-
<span class="cstat-no" title="statement not covered" > can('service', 'organisations')</span>
|
|
909
|
-
<span class="cstat-no" title="statement not covered" > can('create', 'organisations')</span>
|
|
910
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
911
|
-
<span class="cstat-no" title="statement not covered" > if (subject.organisations) {</span>
|
|
912
|
-
<span class="cstat-no" title="statement not covered" > subject.organisations.forEach(organisation => {</span>
|
|
913
|
-
<span class="cstat-no" title="statement not covered" > if (organisation._id) {</span>
|
|
914
|
-
<span class="cstat-no" title="statement not covered" > // Generic rules for resources</span>
|
|
915
|
-
<span class="cstat-no" title="statement not covered" > defineResourceRules(subject, organisation, 'organisations', can)</span>
|
|
916
|
-
<span class="cstat-no" title="statement not covered" > // Specific rules for organisations</span>
|
|
917
|
-
<span class="cstat-no" title="statement not covered" > const role = Roles[organisation.permissions]</span>
|
|
918
|
-
<span class="cstat-no" title="statement not covered" > if (role >= Roles.member) {</span>
|
|
919
|
-
<span class="cstat-no" title="statement not covered" > // The unique identifier of a service is its path not its name.</span>
|
|
920
|
-
<span class="cstat-no" title="statement not covered" > // Indeed we have for instance a 'groups' service in each organisation.</span>
|
|
921
|
-
<span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/members')</span>
|
|
922
|
-
<span class="cstat-no" title="statement not covered" > can('read', 'members', { context: organisation._id })</span>
|
|
923
|
-
<span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/tags')</span>
|
|
924
|
-
<span class="cstat-no" title="statement not covered" > // Tags are public</span>
|
|
925
|
-
<span class="cstat-no" title="statement not covered" > can('read', 'tags', { context: organisation._id })</span>
|
|
926
|
-
<span class="cstat-no" title="statement not covered" > // Groups are private</span>
|
|
927
|
-
<span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/groups')</span>
|
|
928
|
-
<span class="cstat-no" title="statement not covered" > can('service', organisation._id.toString() + '/storage')</span>
|
|
929
|
-
<span class="cstat-no" title="statement not covered" > can(['read', 'create', 'remove', 'createMultipartUpload', 'completeMultipartUpload', 'uploadPart', 'putObject'], 'storage', { context: organisation._id })</span>
|
|
930
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
931
|
-
<span class="cstat-no" title="statement not covered" > if (role >= Roles.manager) {</span>
|
|
932
|
-
<span class="cstat-no" title="statement not covered" > can('update', 'members', { context: organisation._id })</span>
|
|
933
|
-
<span class="cstat-no" title="statement not covered" > // Managers can manage all groups/tags</span>
|
|
934
|
-
<span class="cstat-no" title="statement not covered" > can('all', 'groups', { context: organisation._id })</span>
|
|
935
|
-
<span class="cstat-no" title="statement not covered" > can(['create', 'remove'], 'authorisations', { resourcesService: organisation._id.toString() + '/groups', scope: 'groups' })</span>
|
|
936
|
-
<span class="cstat-no" title="statement not covered" > can('all', 'tags', { context: organisation._id })</span>
|
|
937
|
-
<span class="cstat-no" title="statement not covered" > // Remove invited members</span>
|
|
938
|
-
<span class="cstat-no" title="statement not covered" > can(['remove'], 'users', { 'sponsor.organisationId': organisation._id })</span>
|
|
939
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
940
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
941
|
-
<span class="cstat-no" title="statement not covered" > })</span>
|
|
942
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
943
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
944
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
945
|
-
|
|
946
|
-
// Hook computing group abilities for a given user
|
|
947
|
-
export <span class="fstat-no" title="function not covered" >function defineGroupAbilities (subject, can, cannot) {</span>
|
|
948
|
-
<span class="cstat-no" title="statement not covered" > if (subject) {</span>
|
|
949
|
-
<span class="cstat-no" title="statement not covered" > if (subject.groups) {</span>
|
|
950
|
-
<span class="cstat-no" title="statement not covered" > subject.groups.forEach(group => {</span>
|
|
951
|
-
<span class="cstat-no" title="statement not covered" > if (group._id) {</span>
|
|
952
|
-
<span class="cstat-no" title="statement not covered" > // Specific rules for groups</span>
|
|
953
|
-
<span class="cstat-no" title="statement not covered" > const role = Roles[group.permissions]</span>
|
|
954
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
955
|
-
<span class="cstat-no" title="statement not covered" > if (role >= Roles.member) {</span>
|
|
956
|
-
<span class="cstat-no" title="statement not covered" > can('read', 'groups', { _id: group._id })</span>
|
|
957
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
958
|
-
<span class="cstat-no" title="statement not covered" > if (role >= Roles.manager) {</span>
|
|
959
|
-
<span class="cstat-no" title="statement not covered" > can(['create', 'remove'], 'authorisations', { resource: group._id, permissions: 'member' })</span>
|
|
960
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
961
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
962
|
-
<span class="cstat-no" title="statement not covered" > })</span>
|
|
963
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
964
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
965
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
966
|
-
|
|
967
|
-
// Helper functions to find the members of a given organisation
|
|
968
|
-
export <span class="fstat-no" title="function not covered" >function findMembersOfOrganisation (usersService, organisationId, role) {</span>
|
|
969
|
-
<span class="cstat-no" title="statement not covered" > return findSubjectsForResource(usersService, 'organisations', organisationId, role)</span>
|
|
970
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
971
|
-
|
|
972
|
-
export <span class="fstat-no" title="function not covered" >function countMembersOfOrganisation (usersService, organisationId, role) {</span>
|
|
973
|
-
<span class="cstat-no" title="statement not covered" > return countSubjectsForResource(usersService, 'organisations', organisationId, role)</span>
|
|
974
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
975
|
-
|
|
976
|
-
// Helper functions to find the members of a given group
|
|
977
|
-
export <span class="fstat-no" title="function not covered" >function findMembersOfGroup (membersService, groupId, role) {</span>
|
|
978
|
-
<span class="cstat-no" title="statement not covered" > return findSubjectsForResource(membersService, 'groups', groupId, role)</span>
|
|
979
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
980
|
-
|
|
981
|
-
export <span class="fstat-no" title="function not covered" >function countMembersOfGroup (membersService, groupId, role) {</span>
|
|
982
|
-
<span class="cstat-no" title="statement not covered" > return countSubjectsForResource(membersService, 'groups', groupId, role)</span>
|
|
983
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
984
|
-
|
|
985
|
-
// Helper functions to find the members with a given tag
|
|
986
|
-
export <span class="fstat-no" title="function not covered" >function findMembersWithTag (membersService, tagId) {</span>
|
|
987
|
-
<span class="cstat-no" title="statement not covered" > return findSubjectsForResource(membersService, 'tags', tagId)</span>
|
|
988
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
989
|
-
|
|
990
|
-
export <span class="fstat-no" title="function not covered" >function countMembersWithTag (membersService, tagId) {</span>
|
|
991
|
-
<span class="cstat-no" title="statement not covered" > return countSubjectsForResource(membersService, 'tags', tagId)</span>
|
|
992
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
993
|
-
|
|
994
|
-
export <span class="fstat-no" title="function not covered" >function getRoleForOrganisation (user, organisationId) {</span>
|
|
995
|
-
<span class="cstat-no" title="statement not covered" > const result = _.find(user.organisations, { _id: organisationId })</span>
|
|
996
|
-
<span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) return result.permissions</span>
|
|
997
|
-
<span class="cstat-no" title="statement not covered" > return undefined</span>
|
|
998
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
999
|
-
|
|
1000
|
-
export <span class="fstat-no" title="function not covered" >function getRoleForGroup (user, organisationId, groupId) {</span>
|
|
1001
|
-
<span class="cstat-no" title="statement not covered" > const result = _.find(user.groups, { context: organisationId, _id: groupId })</span>
|
|
1002
|
-
<span class="cstat-no" title="statement not covered" > if (!_.isUndefined(result)) return result.permissions</span>
|
|
1003
|
-
<span class="cstat-no" title="statement not covered" > return undefined</span>
|
|
1004
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1005
|
-
|
|
1006
|
-
export <span class="fstat-no" title="function not covered" >function findGroupsWithRole (user, organisationId, role) {</span>
|
|
1007
|
-
<span class="cstat-no" title="statement not covered" > return _.filter(user.groups || [], { context: organisationId, permissions: (typeof role === 'string' ? role : RoleNames[role]) })</span>
|
|
1008
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1009
|
-
|
|
1010
|
-
export <span class="fstat-no" title="function not covered" >function isSeniorRole (roleName, juniorName) {</span>
|
|
1011
|
-
<span class="cstat-no" title="statement not covered" > return Roles[roleName] >= Roles[juniorName]</span>
|
|
1012
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1013
|
-
|
|
1014
|
-
export <span class="fstat-no" title="function not covered" >function isJuniorRole (roleName, seniorName) {</span>
|
|
1015
|
-
<span class="cstat-no" title="statement not covered" > return Roles[roleName] < Roles[seniorName]</span>
|
|
1016
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1017
|
-
|
|
1018
|
-
export <span class="fstat-no" title="function not covered" >function getSeniorRoles (roleName) {</span>
|
|
1019
|
-
<span class="cstat-no" title="statement not covered" > const seniorRoles = []</span>
|
|
1020
|
-
<span class="cstat-no" title="statement not covered" > _.forEach(Roles, role => { if (Roles[roleName] < role) seniorRoles.push(RoleNames[role]) })</span>
|
|
1021
|
-
<span class="cstat-no" title="statement not covered" > return seniorRoles</span>
|
|
1022
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1023
|
-
|
|
1024
|
-
export <span class="fstat-no" title="function not covered" >function getJuniorRoles (roleName) {</span>
|
|
1025
|
-
<span class="cstat-no" title="statement not covered" > const juniorRoles = []</span>
|
|
1026
|
-
<span class="cstat-no" title="statement not covered" > _.forEach(Roles, role => { if (Roles[roleName] >= role) juniorRoles.push(RoleNames[role]) })</span>
|
|
1027
|
-
<span class="cstat-no" title="statement not covered" > return juniorRoles</span>
|
|
1028
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
1029
|
-
</pre></td></tr></table></pre>
|
|
1030
|
-
|
|
1031
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
1032
|
-
</div><!-- /wrapper -->
|
|
1033
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
1034
|
-
Code coverage generated by
|
|
1035
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1036
|
-
at 2024-08-13T10:02:04.843Z
|
|
1037
|
-
</div>
|
|
1038
|
-
<script src="../../prettify.js"></script>
|
|
1039
|
-
<script>
|
|
1040
|
-
window.onload = function () {
|
|
1041
|
-
prettyPrint();
|
|
1042
|
-
};
|
|
1043
|
-
</script>
|
|
1044
|
-
<script src="../../sorter.js"></script>
|
|
1045
|
-
<script src="../../block-navigation.js"></script>
|
|
1046
|
-
</body>
|
|
1047
|
-
</html>
|
|
1048
|
-
|