@kalisio/kdk 2.5.1 → 2.5.3

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.
Files changed (255) hide show
  1. package/core/api/hooks/hooks.authorisations.js +1 -2
  2. package/core/api/services/authorisations/authorisations.service.js +1 -3
  3. package/core/api/services/index.js +5 -1
  4. package/core/api/services/users/users.hooks.js +4 -3
  5. package/core/client/components/input/KShapePicker.vue +4 -4
  6. package/core/client/utils/index.js +1 -0
  7. package/coverage/core/api/application.js.html +344 -344
  8. package/coverage/core/api/authentication.js.html +79 -79
  9. package/coverage/core/api/db.js.html +167 -167
  10. package/coverage/core/api/hooks/hooks.authentication.js.html +12 -12
  11. package/coverage/core/api/hooks/hooks.authorisations.js.html +154 -157
  12. package/coverage/core/api/hooks/hooks.logger.js.html +18 -18
  13. package/coverage/core/api/hooks/hooks.model.js.html +275 -275
  14. package/coverage/core/api/hooks/hooks.push.js.html +34 -34
  15. package/coverage/core/api/hooks/hooks.query.js.html +89 -89
  16. package/coverage/core/api/hooks/hooks.schemas.js.html +13 -13
  17. package/coverage/core/api/hooks/hooks.service.js.html +28 -28
  18. package/coverage/core/api/hooks/hooks.storage.js.html +7 -7
  19. package/coverage/core/api/hooks/hooks.users.js.html +50 -50
  20. package/coverage/core/api/hooks/index.html +51 -51
  21. package/coverage/core/api/hooks/index.js.html +11 -11
  22. package/coverage/core/api/index.html +42 -42
  23. package/coverage/core/api/index.js.html +22 -22
  24. package/coverage/core/api/marshall.js.html +127 -127
  25. package/coverage/core/api/models/index.html +1 -1
  26. package/coverage/core/api/models/messages.model.mongodb.js.html +1 -1
  27. package/coverage/core/api/models/users.model.mongodb.js.html +11 -11
  28. package/coverage/core/api/services/account/account.hooks.js.html +42 -42
  29. package/coverage/core/api/services/account/account.service.js.html +34 -34
  30. package/coverage/core/api/services/account/index.html +1 -1
  31. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  32. package/coverage/core/api/services/authorisations/authorisations.service.js.html +87 -93
  33. package/coverage/core/api/services/authorisations/index.html +19 -19
  34. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  35. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  36. package/coverage/core/api/services/databases/index.html +1 -1
  37. package/coverage/core/api/services/import-export/import-export.hooks.js.html +1 -1
  38. package/coverage/core/api/services/import-export/import-export.service.js.html +1 -1
  39. package/coverage/core/api/services/import-export/index.html +1 -1
  40. package/coverage/core/api/services/index.html +15 -15
  41. package/coverage/core/api/services/index.js.html +97 -85
  42. package/coverage/core/api/services/mailer/index.html +1 -1
  43. package/coverage/core/api/services/mailer/mailer.hooks.js.html +1 -1
  44. package/coverage/core/api/services/mailer/mailer.service.js.html +1 -1
  45. package/coverage/core/api/services/messages/index.html +1 -1
  46. package/coverage/core/api/services/messages/messages.hooks.js.html +1 -1
  47. package/coverage/core/api/services/push/index.html +1 -1
  48. package/coverage/core/api/services/push/push.hooks.js.html +1 -1
  49. package/coverage/core/api/services/push/push.service.js.html +1 -1
  50. package/coverage/core/api/services/storage/index.html +1 -1
  51. package/coverage/core/api/services/storage/storage.hooks.js.html +36 -36
  52. package/coverage/core/api/services/storage/storage.service.js.html +30 -30
  53. package/coverage/core/api/services/users/index.html +7 -7
  54. package/coverage/core/api/services/users/users.hooks.js.html +83 -80
  55. package/coverage/core/api/services/users/users.service.js.html +4 -4
  56. package/coverage/core/common/errors.js.html +2 -2
  57. package/coverage/core/common/index.html +30 -30
  58. package/coverage/core/common/index.js.html +11 -11
  59. package/coverage/core/common/permissions.js.html +187 -187
  60. package/coverage/core/common/schema.js.html +26 -26
  61. package/coverage/core/common/utils.js.html +61 -61
  62. package/coverage/core/common/utils.offline.js.html +6 -6
  63. package/coverage/index.html +173 -173
  64. package/coverage/lcov-report/core/api/application.js.html +344 -344
  65. package/coverage/lcov-report/core/api/authentication.js.html +79 -79
  66. package/coverage/lcov-report/core/api/db.js.html +167 -167
  67. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +12 -12
  68. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +154 -157
  69. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +18 -18
  70. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +275 -275
  71. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +34 -34
  72. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +89 -89
  73. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +13 -13
  74. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +28 -28
  75. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +7 -7
  76. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +50 -50
  77. package/coverage/lcov-report/core/api/hooks/index.html +51 -51
  78. package/coverage/lcov-report/core/api/hooks/index.js.html +11 -11
  79. package/coverage/lcov-report/core/api/index.html +42 -42
  80. package/coverage/lcov-report/core/api/index.js.html +22 -22
  81. package/coverage/lcov-report/core/api/marshall.js.html +127 -127
  82. package/coverage/lcov-report/core/api/models/index.html +1 -1
  83. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +1 -1
  84. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +11 -11
  85. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +42 -42
  86. package/coverage/lcov-report/core/api/services/account/account.service.js.html +34 -34
  87. package/coverage/lcov-report/core/api/services/account/index.html +1 -1
  88. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +34 -34
  89. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +87 -93
  90. package/coverage/lcov-report/core/api/services/authorisations/index.html +19 -19
  91. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  92. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  93. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  94. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +1 -1
  95. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +1 -1
  96. package/coverage/lcov-report/core/api/services/import-export/index.html +1 -1
  97. package/coverage/lcov-report/core/api/services/index.html +15 -15
  98. package/coverage/lcov-report/core/api/services/index.js.html +97 -85
  99. package/coverage/lcov-report/core/api/services/mailer/index.html +1 -1
  100. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +1 -1
  101. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +1 -1
  102. package/coverage/lcov-report/core/api/services/messages/index.html +1 -1
  103. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +1 -1
  104. package/coverage/lcov-report/core/api/services/push/index.html +1 -1
  105. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +1 -1
  106. package/coverage/lcov-report/core/api/services/push/push.service.js.html +1 -1
  107. package/coverage/lcov-report/core/api/services/storage/index.html +1 -1
  108. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +36 -36
  109. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +30 -30
  110. package/coverage/lcov-report/core/api/services/users/index.html +7 -7
  111. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +83 -80
  112. package/coverage/lcov-report/core/api/services/users/users.service.js.html +4 -4
  113. package/coverage/lcov-report/core/common/errors.js.html +2 -2
  114. package/coverage/lcov-report/core/common/index.html +30 -30
  115. package/coverage/lcov-report/core/common/index.js.html +11 -11
  116. package/coverage/lcov-report/core/common/permissions.js.html +187 -187
  117. package/coverage/lcov-report/core/common/schema.js.html +26 -26
  118. package/coverage/lcov-report/core/common/utils.js.html +61 -61
  119. package/coverage/lcov-report/core/common/utils.offline.js.html +6 -6
  120. package/coverage/lcov-report/index.html +173 -173
  121. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +316 -316
  122. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +218 -218
  123. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +798 -789
  124. package/coverage/lcov-report/map/api/hooks/index.html +54 -54
  125. package/coverage/lcov-report/map/api/hooks/index.js.html +16 -16
  126. package/coverage/lcov-report/map/api/index.html +32 -32
  127. package/coverage/lcov-report/map/api/index.js.html +46 -46
  128. package/coverage/lcov-report/map/api/marshall.js.html +72 -72
  129. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +24 -24
  130. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +44 -44
  131. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +80 -80
  132. package/coverage/lcov-report/map/api/models/index.html +65 -65
  133. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +26 -26
  134. package/coverage/lcov-report/map/api/models/styles.model.mongodb.js.html +28 -28
  135. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +136 -136
  136. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +343 -343
  137. package/coverage/lcov-report/map/api/services/alerts/index.html +32 -32
  138. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +172 -172
  139. package/coverage/lcov-report/map/api/services/catalog/index.html +21 -21
  140. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  141. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  142. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +160 -160
  143. package/coverage/lcov-report/map/api/services/features/features.service.js.html +117 -117
  144. package/coverage/lcov-report/map/api/services/features/index.html +31 -31
  145. package/coverage/lcov-report/map/api/services/index.html +21 -21
  146. package/coverage/lcov-report/map/api/services/index.js.html +334 -334
  147. package/coverage/lcov-report/map/api/services/projects/index.html +21 -21
  148. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +237 -237
  149. package/coverage/lcov-report/map/api/services/styles/index.html +21 -21
  150. package/coverage/lcov-report/map/api/services/styles/styles.hooks.js.html +84 -84
  151. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +68 -68
  152. package/coverage/lcov-report/map/common/errors.js.html +16 -16
  153. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +267 -267
  154. package/coverage/lcov-report/map/common/grid.js.html +554 -554
  155. package/coverage/lcov-report/map/common/index.html +159 -159
  156. package/coverage/lcov-report/map/common/index.js.html +68 -68
  157. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +73 -73
  158. package/coverage/lcov-report/map/common/moment-utils.js.html +18 -18
  159. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +484 -484
  160. package/coverage/lcov-report/map/common/opendap-utils.js.html +353 -353
  161. package/coverage/lcov-report/map/common/permissions.js.html +40 -40
  162. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +59 -59
  163. package/coverage/lcov-report/map/common/tms-utils.js.html +1 -1
  164. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +190 -190
  165. package/coverage/lcov-report/map/common/wcs-utils.js.html +338 -338
  166. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +345 -345
  167. package/coverage/lcov-report/map/common/wfs-utils.js.html +1 -1
  168. package/coverage/lcov-report/map/common/wms-utils.js.html +1 -1
  169. package/coverage/lcov-report/map/common/wmts-utils.js.html +1 -1
  170. package/coverage/lcov.info +6880 -5908
  171. package/coverage/map/api/hooks/hooks.catalog.js.html +316 -316
  172. package/coverage/map/api/hooks/hooks.features.js.html +218 -218
  173. package/coverage/map/api/hooks/hooks.query.js.html +798 -789
  174. package/coverage/map/api/hooks/index.html +54 -54
  175. package/coverage/map/api/hooks/index.js.html +16 -16
  176. package/coverage/map/api/index.html +32 -32
  177. package/coverage/map/api/index.js.html +46 -46
  178. package/coverage/map/api/marshall.js.html +72 -72
  179. package/coverage/map/api/models/alerts.model.mongodb.js.html +24 -24
  180. package/coverage/map/api/models/catalog.model.mongodb.js.html +44 -44
  181. package/coverage/map/api/models/features.model.mongodb.js.html +80 -80
  182. package/coverage/map/api/models/index.html +65 -65
  183. package/coverage/map/api/models/projects.model.mongodb.js.html +26 -26
  184. package/coverage/map/api/models/styles.model.mongodb.js.html +28 -28
  185. package/coverage/map/api/services/alerts/alerts.hooks.js.html +136 -136
  186. package/coverage/map/api/services/alerts/alerts.service.js.html +343 -343
  187. package/coverage/map/api/services/alerts/index.html +32 -32
  188. package/coverage/map/api/services/catalog/catalog.hooks.js.html +172 -172
  189. package/coverage/map/api/services/catalog/index.html +21 -21
  190. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  191. package/coverage/map/api/services/daptiles/index.html +1 -1
  192. package/coverage/map/api/services/features/features.hooks.js.html +160 -160
  193. package/coverage/map/api/services/features/features.service.js.html +117 -117
  194. package/coverage/map/api/services/features/index.html +31 -31
  195. package/coverage/map/api/services/index.html +21 -21
  196. package/coverage/map/api/services/index.js.html +334 -334
  197. package/coverage/map/api/services/projects/index.html +21 -21
  198. package/coverage/map/api/services/projects/projects.hooks.js.html +237 -237
  199. package/coverage/map/api/services/styles/index.html +21 -21
  200. package/coverage/map/api/services/styles/styles.hooks.js.html +84 -84
  201. package/coverage/map/common/dynamic-grid-source.js.html +68 -68
  202. package/coverage/map/common/errors.js.html +16 -16
  203. package/coverage/map/common/geotiff-grid-source.js.html +267 -267
  204. package/coverage/map/common/grid.js.html +554 -554
  205. package/coverage/map/common/index.html +159 -159
  206. package/coverage/map/common/index.js.html +68 -68
  207. package/coverage/map/common/meteo-model-grid-source.js.html +73 -73
  208. package/coverage/map/common/moment-utils.js.html +18 -18
  209. package/coverage/map/common/opendap-grid-source.js.html +484 -484
  210. package/coverage/map/common/opendap-utils.js.html +353 -353
  211. package/coverage/map/common/permissions.js.html +40 -40
  212. package/coverage/map/common/time-based-grid-source.js.html +59 -59
  213. package/coverage/map/common/tms-utils.js.html +1 -1
  214. package/coverage/map/common/wcs-grid-source.js.html +190 -190
  215. package/coverage/map/common/wcs-utils.js.html +338 -338
  216. package/coverage/map/common/weacast-grid-source.js.html +345 -345
  217. package/coverage/map/common/wfs-utils.js.html +1 -1
  218. package/coverage/map/common/wms-utils.js.html +1 -1
  219. package/coverage/map/common/wmts-utils.js.html +1 -1
  220. package/coverage/tmp/coverage-151198-1753351220086-0.json +1 -0
  221. package/coverage/tmp/coverage-151210-1753351220070-0.json +1 -0
  222. package/coverage/tmp/coverage-151221-1753351129816-0.json +1 -0
  223. package/coverage/tmp/coverage-151233-1753351129803-0.json +1 -0
  224. package/coverage/tmp/coverage-151240-1753351129770-0.json +1 -0
  225. package/coverage/tmp/coverage-151307-1753351220058-0.json +1 -0
  226. package/coverage/tmp/coverage-151319-1753351220044-0.json +1 -0
  227. package/coverage/tmp/coverage-151326-1753351220010-0.json +1 -0
  228. package/map/api/hooks/hooks.query.js +7 -4
  229. package/map/api/services/styles/styles.hooks.js +1 -1
  230. package/map/client/components/KLayerEditor.vue +4 -0
  231. package/map/client/components/catalog/KLayerCategories.vue +2 -0
  232. package/map/client/components/stickies/KAttribution.vue +8 -7
  233. package/map/client/components/stickies/KLevelSlider.vue +10 -8
  234. package/map/client/components/styles/KStyleEditor.vue +1 -1
  235. package/map/client/components/styles/KStyleManager.vue +7 -1
  236. package/map/client/composables/highlight.js +5 -1
  237. package/map/client/i18n/map_en.json +4 -1
  238. package/map/client/i18n/map_fr.json +5 -2
  239. package/map/client/leaflet/utils/utils.geojson.js +5 -4
  240. package/map/client/mixins/globe/mixin.geojson-layers.js +11 -5
  241. package/map/client/mixins/mixin.activity.js +9 -0
  242. package/map/client/utils/utils.layers.js +0 -2
  243. package/package.json +1 -1
  244. package/test/api/core/index.test.js +49 -60
  245. package/test/api/core/push.test.js +1 -1
  246. package/test/api/core/test-log-2025-06-25.log +9 -0
  247. package/test/api/core/test-log-2025-07-24.log +44 -0
  248. package/test/api/map/test-log-2025-05-27.log +13 -0
  249. package/test/api/map/test-log-2025-06-23.log +7 -0
  250. package/test/api/map/test-log-2025-07-24.log +11 -0
  251. package/coverage/tmp/coverage-323534-1747828879483-0.json +0 -1
  252. package/coverage/tmp/coverage-323546-1747828879453-0.json +0 -1
  253. package/coverage/tmp/coverage-323557-1747828879439-0.json +0 -1
  254. package/coverage/tmp/coverage-323569-1747828879416-0.json +0 -1
  255. package/coverage/tmp/coverage-323576-1747828879390-0.json +0 -1
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">0% </span>
26
+ <span class="strong">50.15% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/323</span>
28
+ <span class='fraction'>162/323</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">0% </span>
33
+ <span class="strong">76.92% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>0/1</span>
35
+ <span class='fraction'>10/13</span>
36
36
  </div>
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">0% </span>
40
+ <span class="strong">37.5% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/1</span>
42
+ <span class='fraction'>6/16</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">0% </span>
47
+ <span class="strong">50.15% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/323</span>
49
+ <span class='fraction'>162/323</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line low'></div>
64
+ <div class='status-line medium'></div>
65
65
  <pre><table class="coverage">
66
66
  <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
67
  <a name='L2'></a><a href='#L2'>2</a>
@@ -386,23 +386,113 @@
386
386
  <a name='L321'></a><a href='#L321'>321</a>
387
387
  <a name='L322'></a><a href='#L322'>322</a>
388
388
  <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
389
+ <a name='L324'></a><a href='#L324'>324</a></td><td class="line-coverage quiet"><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">5x</span>
406
+ <span class="cline-any cline-yes">5x</span>
407
+ <span class="cline-any cline-yes">5x</span>
408
+ <span class="cline-any cline-yes">5x</span>
409
+ <span class="cline-any cline-yes">5x</span>
410
+ <span class="cline-any cline-yes">5x</span>
411
+ <span class="cline-any cline-yes">5x</span>
412
+ <span class="cline-any cline-yes">5x</span>
413
+ <span class="cline-any cline-yes">5x</span>
414
+ <span class="cline-any cline-yes">5x</span>
415
+ <span class="cline-any cline-yes">5x</span>
416
+ <span class="cline-any cline-yes">5x</span>
417
+ <span class="cline-any cline-yes">5x</span>
418
+ <span class="cline-any cline-yes">5x</span>
419
+ <span class="cline-any cline-yes">5x</span>
420
+ <span class="cline-any cline-yes">12x</span>
421
+ <span class="cline-any cline-yes">12x</span>
422
+ <span class="cline-any cline-yes">5x</span>
423
+ <span class="cline-any cline-yes">5x</span>
424
+ <span class="cline-any cline-yes">5x</span>
425
+ <span class="cline-any cline-yes">5x</span>
426
+ <span class="cline-any cline-yes">5x</span>
427
+ <span class="cline-any cline-yes">5x</span>
428
+ <span class="cline-any cline-yes">1x</span>
429
+ <span class="cline-any cline-yes">1x</span>
390
430
  <span class="cline-any cline-no">&nbsp;</span>
391
431
  <span class="cline-any cline-no">&nbsp;</span>
392
432
  <span class="cline-any cline-no">&nbsp;</span>
393
433
  <span class="cline-any cline-no">&nbsp;</span>
434
+ <span class="cline-any cline-yes">1x</span>
435
+ <span class="cline-any cline-yes">1x</span>
436
+ <span class="cline-any cline-yes">2x</span>
437
+ <span class="cline-any cline-yes">2x</span>
438
+ <span class="cline-any cline-yes">2x</span>
439
+ <span class="cline-any cline-yes">2x</span>
440
+ <span class="cline-any cline-yes">2x</span>
441
+ <span class="cline-any cline-yes">2x</span>
442
+ <span class="cline-any cline-yes">2x</span>
443
+ <span class="cline-any cline-yes">2x</span>
444
+ <span class="cline-any cline-yes">2x</span>
445
+ <span class="cline-any cline-yes">2x</span>
446
+ <span class="cline-any cline-yes">2x</span>
447
+ <span class="cline-any cline-yes">2x</span>
448
+ <span class="cline-any cline-yes">2x</span>
449
+ <span class="cline-any cline-yes">2x</span>
450
+ <span class="cline-any cline-yes">2x</span>
451
+ <span class="cline-any cline-yes">2x</span>
452
+ <span class="cline-any cline-yes">1x</span>
453
+ <span class="cline-any cline-yes">1x</span>
394
454
  <span class="cline-any cline-no">&nbsp;</span>
395
455
  <span class="cline-any cline-no">&nbsp;</span>
396
456
  <span class="cline-any cline-no">&nbsp;</span>
397
457
  <span class="cline-any cline-no">&nbsp;</span>
458
+ <span class="cline-any cline-yes">1x</span>
459
+ <span class="cline-any cline-yes">1x</span>
460
+ <span class="cline-any cline-yes">1x</span>
461
+ <span class="cline-any cline-yes">1x</span>
462
+ <span class="cline-any cline-yes">1x</span>
463
+ <span class="cline-any cline-yes">1x</span>
464
+ <span class="cline-any cline-yes">1x</span>
465
+ <span class="cline-any cline-yes">1x</span>
466
+ <span class="cline-any cline-yes">1x</span>
467
+ <span class="cline-any cline-yes">1x</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>
398
471
  <span class="cline-any cline-no">&nbsp;</span>
399
472
  <span class="cline-any cline-no">&nbsp;</span>
400
473
  <span class="cline-any cline-no">&nbsp;</span>
401
474
  <span class="cline-any cline-no">&nbsp;</span>
475
+ <span class="cline-any cline-yes">1x</span>
476
+ <span class="cline-any cline-yes">1x</span>
477
+ <span class="cline-any cline-yes">1x</span>
478
+ <span class="cline-any cline-yes">1x</span>
479
+ <span class="cline-any cline-yes">1x</span>
480
+ <span class="cline-any cline-yes">1x</span>
481
+ <span class="cline-any cline-yes">1x</span>
482
+ <span class="cline-any cline-yes">1x</span>
483
+ <span class="cline-any cline-yes">1x</span>
484
+ <span class="cline-any cline-yes">1x</span>
485
+ <span class="cline-any cline-yes">1x</span>
486
+ <span class="cline-any cline-yes">1x</span>
487
+ <span class="cline-any cline-yes">1x</span>
488
+ <span class="cline-any cline-yes">1x</span>
402
489
  <span class="cline-any cline-no">&nbsp;</span>
403
490
  <span class="cline-any cline-no">&nbsp;</span>
404
491
  <span class="cline-any cline-no">&nbsp;</span>
405
492
  <span class="cline-any cline-no">&nbsp;</span>
493
+ <span class="cline-any cline-yes">1x</span>
494
+ <span class="cline-any cline-yes">1x</span>
495
+ <span class="cline-any cline-yes">1x</span>
406
496
  <span class="cline-any cline-no">&nbsp;</span>
407
497
  <span class="cline-any cline-no">&nbsp;</span>
408
498
  <span class="cline-any cline-no">&nbsp;</span>
@@ -424,6 +514,8 @@
424
514
  <span class="cline-any cline-no">&nbsp;</span>
425
515
  <span class="cline-any cline-no">&nbsp;</span>
426
516
  <span class="cline-any cline-no">&nbsp;</span>
517
+ <span class="cline-any cline-yes">1x</span>
518
+ <span class="cline-any cline-yes">1x</span>
427
519
  <span class="cline-any cline-no">&nbsp;</span>
428
520
  <span class="cline-any cline-no">&nbsp;</span>
429
521
  <span class="cline-any cline-no">&nbsp;</span>
@@ -436,6 +528,8 @@
436
528
  <span class="cline-any cline-no">&nbsp;</span>
437
529
  <span class="cline-any cline-no">&nbsp;</span>
438
530
  <span class="cline-any cline-no">&nbsp;</span>
531
+ <span class="cline-any cline-yes">1x</span>
532
+ <span class="cline-any cline-yes">1x</span>
439
533
  <span class="cline-any cline-no">&nbsp;</span>
440
534
  <span class="cline-any cline-no">&nbsp;</span>
441
535
  <span class="cline-any cline-no">&nbsp;</span>
@@ -450,6 +544,10 @@
450
544
  <span class="cline-any cline-no">&nbsp;</span>
451
545
  <span class="cline-any cline-no">&nbsp;</span>
452
546
  <span class="cline-any cline-no">&nbsp;</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>
453
551
  <span class="cline-any cline-no">&nbsp;</span>
454
552
  <span class="cline-any cline-no">&nbsp;</span>
455
553
  <span class="cline-any cline-no">&nbsp;</span>
@@ -532,6 +630,9 @@
532
630
  <span class="cline-any cline-no">&nbsp;</span>
533
631
  <span class="cline-any cline-no">&nbsp;</span>
534
632
  <span class="cline-any cline-no">&nbsp;</span>
633
+ <span class="cline-any cline-yes">1x</span>
634
+ <span class="cline-any cline-yes">1x</span>
635
+ <span class="cline-any cline-yes">1x</span>
535
636
  <span class="cline-any cline-no">&nbsp;</span>
536
637
  <span class="cline-any cline-no">&nbsp;</span>
537
638
  <span class="cline-any cline-no">&nbsp;</span>
@@ -539,283 +640,182 @@
539
640
  <span class="cline-any cline-no">&nbsp;</span>
540
641
  <span class="cline-any cline-no">&nbsp;</span>
541
642
  <span class="cline-any cline-no">&nbsp;</span>
643
+ <span class="cline-any cline-yes">1x</span>
644
+ <span class="cline-any cline-yes">1x</span>
645
+ <span class="cline-any cline-yes">4x</span>
646
+ <span class="cline-any cline-yes">4x</span>
647
+ <span class="cline-any cline-yes">4x</span>
648
+ <span class="cline-any cline-yes">4x</span>
649
+ <span class="cline-any cline-yes">4x</span>
650
+ <span class="cline-any cline-yes">4x</span>
651
+ <span class="cline-any cline-yes">1x</span>
652
+ <span class="cline-any cline-yes">1x</span>
542
653
  <span class="cline-any cline-no">&nbsp;</span>
543
654
  <span class="cline-any cline-no">&nbsp;</span>
544
655
  <span class="cline-any cline-no">&nbsp;</span>
656
+ <span class="cline-any cline-yes">1x</span>
657
+ <span class="cline-any cline-yes">1x</span>
658
+ <span class="cline-any cline-yes">4x</span>
659
+ <span class="cline-any cline-yes">4x</span>
660
+ <span class="cline-any cline-yes">4x</span>
661
+ <span class="cline-any cline-yes">4x</span>
545
662
  <span class="cline-any cline-no">&nbsp;</span>
546
663
  <span class="cline-any cline-no">&nbsp;</span>
664
+ <span class="cline-any cline-yes">4x</span>
665
+ <span class="cline-any cline-yes">4x</span>
547
666
  <span class="cline-any cline-no">&nbsp;</span>
548
667
  <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-yes">4x</span>
669
+ <span class="cline-any cline-yes">4x</span>
670
+ <span class="cline-any cline-yes">14x</span>
671
+ <span class="cline-any cline-yes">1x</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-yes">1x</span>
675
+ <span class="cline-any cline-yes">4x</span>
676
+ <span class="cline-any cline-yes">4x</span>
677
+ <span class="cline-any cline-yes">4x</span>
549
678
  <span class="cline-any cline-no">&nbsp;</span>
550
679
  <span class="cline-any cline-no">&nbsp;</span>
551
- <span class="cline-any cline-no">&nbsp;</span>
552
- <span class="cline-any cline-no">&nbsp;</span>
553
- <span class="cline-any cline-no">&nbsp;</span>
554
- <span class="cline-any cline-no">&nbsp;</span>
555
- <span class="cline-any cline-no">&nbsp;</span>
556
- <span class="cline-any cline-no">&nbsp;</span>
557
- <span class="cline-any cline-no">&nbsp;</span>
558
- <span class="cline-any cline-no">&nbsp;</span>
559
- <span class="cline-any cline-no">&nbsp;</span>
560
- <span class="cline-any cline-no">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-no">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-no">&nbsp;</span>
565
- <span class="cline-any cline-no">&nbsp;</span>
566
- <span class="cline-any cline-no">&nbsp;</span>
567
- <span class="cline-any cline-no">&nbsp;</span>
568
- <span class="cline-any cline-no">&nbsp;</span>
569
- <span class="cline-any cline-no">&nbsp;</span>
570
- <span class="cline-any cline-no">&nbsp;</span>
571
- <span class="cline-any cline-no">&nbsp;</span>
572
- <span class="cline-any cline-no">&nbsp;</span>
573
- <span class="cline-any cline-no">&nbsp;</span>
574
- <span class="cline-any cline-no">&nbsp;</span>
575
- <span class="cline-any cline-no">&nbsp;</span>
576
- <span class="cline-any cline-no">&nbsp;</span>
577
- <span class="cline-any cline-no">&nbsp;</span>
578
- <span class="cline-any cline-no">&nbsp;</span>
579
- <span class="cline-any cline-no">&nbsp;</span>
580
- <span class="cline-any cline-no">&nbsp;</span>
581
- <span class="cline-any cline-no">&nbsp;</span>
582
- <span class="cline-any cline-no">&nbsp;</span>
583
- <span class="cline-any cline-no">&nbsp;</span>
584
- <span class="cline-any cline-no">&nbsp;</span>
585
- <span class="cline-any cline-no">&nbsp;</span>
586
- <span class="cline-any cline-no">&nbsp;</span>
587
- <span class="cline-any cline-no">&nbsp;</span>
588
- <span class="cline-any cline-no">&nbsp;</span>
589
- <span class="cline-any cline-no">&nbsp;</span>
590
- <span class="cline-any cline-no">&nbsp;</span>
591
- <span class="cline-any cline-no">&nbsp;</span>
592
- <span class="cline-any cline-no">&nbsp;</span>
593
- <span class="cline-any cline-no">&nbsp;</span>
594
- <span class="cline-any cline-no">&nbsp;</span>
595
- <span class="cline-any cline-no">&nbsp;</span>
596
- <span class="cline-any cline-no">&nbsp;</span>
597
- <span class="cline-any cline-no">&nbsp;</span>
598
- <span class="cline-any cline-no">&nbsp;</span>
599
- <span class="cline-any cline-no">&nbsp;</span>
600
- <span class="cline-any cline-no">&nbsp;</span>
601
- <span class="cline-any cline-no">&nbsp;</span>
602
- <span class="cline-any cline-no">&nbsp;</span>
603
- <span class="cline-any cline-no">&nbsp;</span>
604
- <span class="cline-any cline-no">&nbsp;</span>
605
- <span class="cline-any cline-no">&nbsp;</span>
606
- <span class="cline-any cline-no">&nbsp;</span>
607
- <span class="cline-any cline-no">&nbsp;</span>
608
- <span class="cline-any cline-no">&nbsp;</span>
609
- <span class="cline-any cline-no">&nbsp;</span>
610
- <span class="cline-any cline-no">&nbsp;</span>
611
- <span class="cline-any cline-no">&nbsp;</span>
612
- <span class="cline-any cline-no">&nbsp;</span>
613
- <span class="cline-any cline-no">&nbsp;</span>
614
- <span class="cline-any cline-no">&nbsp;</span>
615
- <span class="cline-any cline-no">&nbsp;</span>
616
- <span class="cline-any cline-no">&nbsp;</span>
617
- <span class="cline-any cline-no">&nbsp;</span>
618
- <span class="cline-any cline-no">&nbsp;</span>
619
- <span class="cline-any cline-no">&nbsp;</span>
620
- <span class="cline-any cline-no">&nbsp;</span>
621
- <span class="cline-any cline-no">&nbsp;</span>
622
- <span class="cline-any cline-no">&nbsp;</span>
623
- <span class="cline-any cline-no">&nbsp;</span>
624
- <span class="cline-any cline-no">&nbsp;</span>
625
- <span class="cline-any cline-no">&nbsp;</span>
626
- <span class="cline-any cline-no">&nbsp;</span>
627
- <span class="cline-any cline-no">&nbsp;</span>
628
- <span class="cline-any cline-no">&nbsp;</span>
629
- <span class="cline-any cline-no">&nbsp;</span>
630
- <span class="cline-any cline-no">&nbsp;</span>
631
- <span class="cline-any cline-no">&nbsp;</span>
632
- <span class="cline-any cline-no">&nbsp;</span>
633
- <span class="cline-any cline-no">&nbsp;</span>
634
- <span class="cline-any cline-no">&nbsp;</span>
635
- <span class="cline-any cline-no">&nbsp;</span>
636
- <span class="cline-any cline-no">&nbsp;</span>
637
- <span class="cline-any cline-no">&nbsp;</span>
638
- <span class="cline-any cline-no">&nbsp;</span>
639
- <span class="cline-any cline-no">&nbsp;</span>
640
- <span class="cline-any cline-no">&nbsp;</span>
641
- <span class="cline-any cline-no">&nbsp;</span>
642
- <span class="cline-any cline-no">&nbsp;</span>
643
- <span class="cline-any cline-no">&nbsp;</span>
644
- <span class="cline-any cline-no">&nbsp;</span>
645
- <span class="cline-any cline-no">&nbsp;</span>
646
- <span class="cline-any cline-no">&nbsp;</span>
647
- <span class="cline-any cline-no">&nbsp;</span>
648
- <span class="cline-any cline-no">&nbsp;</span>
649
- <span class="cline-any cline-no">&nbsp;</span>
650
- <span class="cline-any cline-no">&nbsp;</span>
651
- <span class="cline-any cline-no">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
- <span class="cline-any cline-no">&nbsp;</span>
654
- <span class="cline-any cline-no">&nbsp;</span>
655
- <span class="cline-any cline-no">&nbsp;</span>
656
- <span class="cline-any cline-no">&nbsp;</span>
657
- <span class="cline-any cline-no">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-no">&nbsp;</span>
660
- <span class="cline-any cline-no">&nbsp;</span>
661
- <span class="cline-any cline-no">&nbsp;</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-no">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-no">&nbsp;</span>
668
- <span class="cline-any cline-no">&nbsp;</span>
669
- <span class="cline-any cline-no">&nbsp;</span>
670
- <span class="cline-any cline-no">&nbsp;</span>
671
- <span class="cline-any cline-no">&nbsp;</span>
672
- <span class="cline-any cline-no">&nbsp;</span>
673
- <span class="cline-any cline-no">&nbsp;</span>
674
- <span class="cline-any cline-no">&nbsp;</span>
675
- <span class="cline-any cline-no">&nbsp;</span>
676
- <span class="cline-any cline-no">&nbsp;</span>
677
- <span class="cline-any cline-no">&nbsp;</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-no">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-no">&nbsp;</span>
685
- <span class="cline-any cline-no">&nbsp;</span>
686
- <span class="cline-any cline-no">&nbsp;</span>
687
- <span class="cline-any cline-no">&nbsp;</span>
688
- <span class="cline-any cline-no">&nbsp;</span>
689
- <span class="cline-any cline-no">&nbsp;</span>
690
- <span class="cline-any cline-no">&nbsp;</span>
691
- <span class="cline-any cline-no">&nbsp;</span>
692
- <span class="cline-any cline-no">&nbsp;</span>
693
- <span class="cline-any cline-no">&nbsp;</span>
694
- <span class="cline-any cline-no">&nbsp;</span>
695
- <span class="cline-any cline-no">&nbsp;</span>
696
- <span class="cline-any cline-no">&nbsp;</span>
697
- <span class="cline-any cline-no">&nbsp;</span>
698
- <span class="cline-any cline-no">&nbsp;</span>
699
- <span class="cline-any cline-no">&nbsp;</span>
700
- <span class="cline-any cline-no">&nbsp;</span>
701
- <span class="cline-any cline-no">&nbsp;</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
- <span class="cline-any cline-no">&nbsp;</span>
704
- <span class="cline-any cline-no">&nbsp;</span>
705
- <span class="cline-any cline-no">&nbsp;</span>
706
- <span class="cline-any cline-no">&nbsp;</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-no">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
- <span class="cline-any cline-no">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import _ from 'lodash'</span></span></span>
713
- <span class="cstat-no" title="statement not covered" >import path from 'path'</span>
714
- <span class="cstat-no" title="statement not covered" >import fs from 'fs-extra'</span>
715
- <span class="cstat-no" title="statement not covered" >import zlib from 'zlib'</span>
716
- <span class="cstat-no" title="statement not covered" >import request from 'superagent'</span>
717
- <span class="cstat-no" title="statement not covered" >import makeDebug from 'debug'</span>
718
- <span class="cstat-no" title="statement not covered" >import { fileURLToPath } from 'url'</span>
719
- <span class="cstat-no" title="statement not covered" >import * as permissions from '../../../core/common/permissions.js'</span>
720
- <span class="cstat-no" title="statement not covered" ></span>
721
- <span class="cstat-no" title="statement not covered" >const __dirname = path.dirname(fileURLToPath(import.meta.url))</span>
722
- <span class="cstat-no" title="statement not covered" >const modelsPath = path.join(__dirname, '..', 'models')</span>
723
- <span class="cstat-no" title="statement not covered" >const servicesPath = path.join(__dirname, '..', 'services')</span>
724
- <span class="cstat-no" title="statement not covered" ></span>
725
- <span class="cstat-no" title="statement not covered" >const debug = makeDebug('kdk:map:services')</span>
726
- <span class="cstat-no" title="statement not covered" ></span>
727
- <span class="cstat-no" title="statement not covered" >export function createFeaturesService (options = {}) {</span>
728
- <span class="cstat-no" title="statement not covered" > const app = this</span>
729
- <span class="cstat-no" title="statement not covered" ></span>
730
- <span class="cstat-no" title="statement not covered" > debug('Creating features service with options', options)</span>
731
- <span class="cstat-no" title="statement not covered" > const service = app.createService(options.collection, Object.assign({</span>
732
- <span class="cstat-no" title="statement not covered" > modelName: 'features',</span>
733
- <span class="cstat-no" title="statement not covered" > servicesPath,</span>
734
- <span class="cstat-no" title="statement not covered" > modelsPath,</span>
735
- <span class="cstat-no" title="statement not covered" > paginate: { default: 5000, max: 5000 },</span>
736
- <span class="cstat-no" title="statement not covered" > // FIXME: no real-time events for now since we create big batches,</span>
737
- <span class="cstat-no" title="statement not covered" > // does not seem to be sufficient also require a hook (see https://github.com/feathersjs/feathers/issues/922)</span>
738
- <span class="cstat-no" title="statement not covered" > events: ['features'],</span>
739
- <span class="cstat-no" title="statement not covered" > methods: ['find', 'get', 'create', 'update', 'patch', 'remove', 'heatmap', 'formatGeoJSON']</span>
740
- <span class="cstat-no" title="statement not covered" > }, options))</span>
741
- <span class="cstat-no" title="statement not covered" > // As a features service can be created dynamically register default permissions for it</span>
742
- <span class="cstat-no" title="statement not covered" > permissions.defineAbilities.registerHook((subject, can, cannot) =&gt; {</span>
743
- <span class="cstat-no" title="statement not covered" > can('service', options.collection)</span>
744
- <span class="cstat-no" title="statement not covered" > can('read', options.collection)</span>
745
- <span class="cstat-no" title="statement not covered" > })</span>
746
- <span class="cstat-no" title="statement not covered" > // We then need to update abilities cache</span>
747
- <span class="cstat-no" title="statement not covered" > const authorisationService = app.getService('authorisations')</span>
748
- <span class="cstat-no" title="statement not covered" > if (authorisationService) authorisationService.clearAbilities()</span>
749
- <span class="cstat-no" title="statement not covered" > return service</span>
750
- <span class="cstat-no" title="statement not covered" >}</span>
751
- <span class="cstat-no" title="statement not covered" ></span>
752
- <span class="cstat-no" title="statement not covered" >export function removeFeaturesService (options = {}) {</span>
680
+ <span class="cline-any cline-yes">4x</span>
681
+ <span class="cline-any cline-yes">4x</span>
682
+ <span class="cline-any cline-yes">4x</span>
683
+ <span class="cline-any cline-yes">4x</span>
684
+ <span class="cline-any cline-yes">4x</span>
685
+ <span class="cline-any cline-yes">4x</span>
686
+ <span class="cline-any cline-yes">4x</span>
687
+ <span class="cline-any cline-yes">4x</span>
688
+ <span class="cline-any cline-yes">4x</span>
689
+ <span class="cline-any cline-yes">4x</span>
690
+ <span class="cline-any cline-yes">4x</span>
691
+ <span class="cline-any cline-yes">4x</span>
692
+ <span class="cline-any cline-yes">4x</span>
693
+ <span class="cline-any cline-yes">4x</span>
694
+ <span class="cline-any cline-yes">4x</span>
695
+ <span class="cline-any cline-yes">4x</span>
696
+ <span class="cline-any cline-yes">4x</span>
697
+ <span class="cline-any cline-yes">4x</span>
698
+ <span class="cline-any cline-yes">4x</span>
699
+ <span class="cline-any cline-yes">4x</span>
700
+ <span class="cline-any cline-yes">4x</span>
701
+ <span class="cline-any cline-yes">4x</span>
702
+ <span class="cline-any cline-yes">4x</span>
703
+ <span class="cline-any cline-yes">4x</span>
704
+ <span class="cline-any cline-yes">4x</span>
705
+ <span class="cline-any cline-yes">4x</span>
706
+ <span class="cline-any cline-yes">4x</span>
707
+ <span class="cline-any cline-yes">4x</span>
708
+ <span class="cline-any cline-yes">4x</span>
709
+ <span class="cline-any cline-yes">4x</span>
710
+ <span class="cline-any cline-yes">4x</span>
711
+ <span class="cline-any cline-yes">4x</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import _ from 'lodash'
713
+ import path from 'path'
714
+ import fs from 'fs-extra'
715
+ import zlib from 'zlib'
716
+ import request from 'superagent'
717
+ import makeDebug from 'debug'
718
+ import { fileURLToPath } from 'url'
719
+ import * as permissions from '../../../core/common/permissions.js'
720
+ &nbsp;
721
+ const __dirname = path.dirname(fileURLToPath(import.meta.url))
722
+ const modelsPath = path.join(__dirname, '..', 'models')
723
+ const servicesPath = path.join(__dirname, '..', 'services')
724
+ &nbsp;
725
+ const debug = makeDebug('kdk:map:services')
726
+ &nbsp;
727
+ export function createFeaturesService (options = {}) {
728
+ const app = this
729
+ &nbsp;
730
+ debug('Creating features service with options', options)
731
+ const service = app.createService(options.collection, Object.assign({
732
+ modelName: 'features',
733
+ servicesPath,
734
+ modelsPath,
735
+ paginate: { default: 5000, max: 5000 },
736
+ // FIXME: no real-time events for now since we create big batches,
737
+ // does not seem to be sufficient also require a hook (see https://github.com/feathersjs/feathers/issues/922)
738
+ events: ['features'],
739
+ methods: ['find', 'get', 'create', 'update', 'patch', 'remove', 'heatmap', 'formatGeoJSON']
740
+ }, options))
741
+ // As a features service can be created dynamically register default permissions for it
742
+ permissions.defineAbilities.registerHook((subject, can, cannot) =&gt; {
743
+ can('service', options.collection)
744
+ can('read', options.collection)
745
+ })
746
+ // We then need to update abilities cache
747
+ const authorisationService = app.getService('authorisations')
748
+ if (authorisationService) authorisationService.clearAbilities()
749
+ return service
750
+ }
751
+ &nbsp;
752
+ export <span class="fstat-no" title="function not covered" >function removeFeaturesService (options = {}) {</span>
753
753
  <span class="cstat-no" title="statement not covered" > const app = this</span>
754
754
  <span class="cstat-no" title="statement not covered" > debug('Removing features service with options', options)</span>
755
755
  <span class="cstat-no" title="statement not covered" > return app.removeService(app.getService(options.collection, options.context))</span>
756
756
  <span class="cstat-no" title="statement not covered" >}</span>
757
- <span class="cstat-no" title="statement not covered" ></span>
758
- <span class="cstat-no" title="statement not covered" >export function createCatalogService (options = {}) {</span>
759
- <span class="cstat-no" title="statement not covered" > const app = this</span>
760
- <span class="cstat-no" title="statement not covered" ></span>
761
- <span class="cstat-no" title="statement not covered" > // Read default categories/sublegends config, which can be overriden by options</span>
762
- <span class="cstat-no" title="statement not covered" > const catalogConfig = app.get('catalog') || {}</span>
763
- <span class="cstat-no" title="statement not covered" > const categories = catalogConfig.categories</span>
764
- <span class="cstat-no" title="statement not covered" > const sublegends = catalogConfig.sublegends</span>
765
- <span class="cstat-no" title="statement not covered" ></span>
766
- <span class="cstat-no" title="statement not covered" > debug('Creating catalog service with options', options)</span>
767
- <span class="cstat-no" title="statement not covered" > return app.createService('catalog', Object.assign({</span>
768
- <span class="cstat-no" title="statement not covered" > servicesPath,</span>
769
- <span class="cstat-no" title="statement not covered" > modelsPath,</span>
770
- <span class="cstat-no" title="statement not covered" > paginate: { default: 1000, max: 1000 },</span>
771
- <span class="cstat-no" title="statement not covered" > categories,</span>
772
- <span class="cstat-no" title="statement not covered" > sublegends</span>
773
- <span class="cstat-no" title="statement not covered" > }, options))</span>
774
- <span class="cstat-no" title="statement not covered" >}</span>
775
- <span class="cstat-no" title="statement not covered" ></span>
776
- <span class="cstat-no" title="statement not covered" >export function removeCatalogService (options = {}) {</span>
757
+ &nbsp;
758
+ export function createCatalogService (options = {}) {
759
+ const app = this
760
+ &nbsp;
761
+ // Read default categories/sublegends config, which can be overriden by options
762
+ const catalogConfig = app.get('catalog') || {}
763
+ const categories = catalogConfig.categories
764
+ const sublegends = catalogConfig.sublegends
765
+ &nbsp;
766
+ debug('Creating catalog service with options', options)
767
+ return app.createService('catalog', Object.assign({
768
+ servicesPath,
769
+ modelsPath,
770
+ paginate: { default: 1000, max: 1000 },
771
+ categories,
772
+ sublegends
773
+ }, options))
774
+ }
775
+ &nbsp;
776
+ export <span class="fstat-no" title="function not covered" >function removeCatalogService (options = {}) {</span>
777
777
  <span class="cstat-no" title="statement not covered" > const app = this</span>
778
778
  <span class="cstat-no" title="statement not covered" > debug('Removing catalog service with options', options)</span>
779
779
  <span class="cstat-no" title="statement not covered" > return app.removeService(app.getService('catalog', options.context))</span>
780
780
  <span class="cstat-no" title="statement not covered" >}</span>
781
- <span class="cstat-no" title="statement not covered" ></span>
782
- <span class="cstat-no" title="statement not covered" >export async function createProjectsService (options = {}) {</span>
783
- <span class="cstat-no" title="statement not covered" > const app = this</span>
784
- <span class="cstat-no" title="statement not covered" ></span>
785
- <span class="cstat-no" title="statement not covered" > debug('Creating projects service with options', options)</span>
786
- <span class="cstat-no" title="statement not covered" > await app.createService('projects', Object.assign({</span>
787
- <span class="cstat-no" title="statement not covered" > servicesPath,</span>
788
- <span class="cstat-no" title="statement not covered" > modelsPath,</span>
789
- <span class="cstat-no" title="statement not covered" > paginate: { default: 20, max: 5000 }</span>
790
- <span class="cstat-no" title="statement not covered" > }, options))</span>
791
- <span class="cstat-no" title="statement not covered" >}</span>
792
- <span class="cstat-no" title="statement not covered" ></span>
793
- <span class="cstat-no" title="statement not covered" >export function removeProjectsService (options = {}) {</span>
781
+ &nbsp;
782
+ export async function createProjectsService (options = {}) {
783
+ const app = this
784
+ &nbsp;
785
+ debug('Creating projects service with options', options)
786
+ await app.createService('projects', Object.assign({
787
+ servicesPath,
788
+ modelsPath,
789
+ paginate: { default: 20, max: 5000 }
790
+ }, options))
791
+ }
792
+ &nbsp;
793
+ export <span class="fstat-no" title="function not covered" >function removeProjectsService (options = {}) {</span>
794
794
  <span class="cstat-no" title="statement not covered" > const app = this</span>
795
795
  <span class="cstat-no" title="statement not covered" > debug('Removing projects service with options', options)</span>
796
796
  <span class="cstat-no" title="statement not covered" > return app.removeService(app.getService('projects', options.context))</span>
797
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" >export function createAlertsService (options = {}) {</span>
800
- <span class="cstat-no" title="statement not covered" > const app = this</span>
801
- <span class="cstat-no" title="statement not covered" ></span>
802
- <span class="cstat-no" title="statement not covered" > debug('Creating alerts service with options', options)</span>
803
- <span class="cstat-no" title="statement not covered" > const paginate = { default: 5000, max: 5000 }</span>
804
- <span class="cstat-no" title="statement not covered" > return app.createService('alerts', Object.assign({</span>
805
- <span class="cstat-no" title="statement not covered" > servicesPath,</span>
806
- <span class="cstat-no" title="statement not covered" > modelsPath,</span>
807
- <span class="cstat-no" title="statement not covered" > paginate</span>
808
- <span class="cstat-no" title="statement not covered" > }, options))</span>
809
- <span class="cstat-no" title="statement not covered" >}</span>
810
- <span class="cstat-no" title="statement not covered" ></span>
811
- <span class="cstat-no" title="statement not covered" >export function removeAlertsService (options = {}) {</span>
798
+ &nbsp;
799
+ export function createAlertsService (options = {}) {
800
+ const app = this
801
+ &nbsp;
802
+ debug('Creating alerts service with options', options)
803
+ const paginate = { default: 5000, max: 5000 }
804
+ return app.createService('alerts', Object.assign({
805
+ servicesPath,
806
+ modelsPath,
807
+ paginate
808
+ }, options))
809
+ }
810
+ &nbsp;
811
+ export <span class="fstat-no" title="function not covered" >function removeAlertsService (options = {}) {</span>
812
812
  <span class="cstat-no" title="statement not covered" > const app = this</span>
813
813
  <span class="cstat-no" title="statement not covered" > debug('Removing alerts service with options', options)</span>
814
814
  <span class="cstat-no" title="statement not covered" > return app.removeService(app.getService('alerts', options.context))</span>
815
815
  <span class="cstat-no" title="statement not covered" >}</span>
816
- <span class="cstat-no" title="statement not covered" ></span>
817
- <span class="cstat-no" title="statement not covered" >// Helper to register service and permissions for a layer</span>
818
- <span class="cstat-no" title="statement not covered" >export async function createFeaturesServiceForLayer (layer, context) {</span>
816
+ &nbsp;
817
+ // Helper to register service and permissions for a layer
818
+ export <span class="fstat-no" title="function not covered" >async function createFeaturesServiceForLayer (layer, context) {</span>
819
819
  <span class="cstat-no" title="statement not covered" > const app = this</span>
820
820
  <span class="cstat-no" title="statement not covered" > // Check if service(s) are associated to this layer</span>
821
821
  <span class="cstat-no" title="statement not covered" > // Avoid create it twice as we can share services between different layers</span>
@@ -837,8 +837,8 @@
837
837
  <span class="cstat-no" title="statement not covered" > }</span>
838
838
  <span class="cstat-no" title="statement not covered" > return service || probeService</span>
839
839
  <span class="cstat-no" title="statement not covered" >}</span>
840
- <span class="cstat-no" title="statement not covered" >// Helper to unregister service for a layer</span>
841
- <span class="cstat-no" title="statement not covered" >export async function removeFeaturesServiceForLayer (layer, context) {</span>
840
+ // Helper to unregister service for a layer
841
+ export <span class="fstat-no" title="function not covered" >async function removeFeaturesServiceForLayer (layer, context) {</span>
842
842
  <span class="cstat-no" title="statement not covered" > const app = this</span>
843
843
  <span class="cstat-no" title="statement not covered" > // Check if service(s) are associated to this layer and remove it</span>
844
844
  <span class="cstat-no" title="statement not covered" > let probeService = (layer.probeService ? app.getService(layer.probeService, context) : null)</span>
@@ -851,8 +851,8 @@
851
851
  <span class="cstat-no" title="statement not covered" > }</span>
852
852
  <span class="cstat-no" title="statement not covered" > return service || probeService</span>
853
853
  <span class="cstat-no" title="statement not covered" >}</span>
854
- <span class="cstat-no" title="statement not covered" >// Helper to create features from source for a layer</span>
855
- <span class="cstat-no" title="statement not covered" >export async function createFeaturesForLayer (features, layer, options = {}) {</span>
854
+ // Helper to create features from source for a layer
855
+ export <span class="fstat-no" title="function not covered" >async function createFeaturesForLayer (features, layer, options = {}) {</span>
856
856
  <span class="cstat-no" title="statement not covered" > const app = this</span>
857
857
  <span class="cstat-no" title="statement not covered" > const featuresService = app.getService(layer.service, options.context)</span>
858
858
  <span class="cstat-no" title="statement not covered" > if (options &amp;&amp; options.filter) features = await options.filter(features, layer, app)</span>
@@ -867,10 +867,10 @@
867
867
  <span class="cstat-no" title="statement not covered" > // and that after an error remaining write operations in the queue will continue anyway</span>
868
868
  <span class="cstat-no" title="statement not covered" > await featuresService.create(features, { mongodb: { ordered: false } })</span>
869
869
  <span class="cstat-no" title="statement not covered" >}</span>
870
- <span class="cstat-no" title="statement not covered" ></span>
871
- <span class="cstat-no" title="statement not covered" >// Read default layers configured and create, if not found in DB, or update it accordingly</span>
872
- <span class="cstat-no" title="statement not covered" >// Will also clean and feed default data (ie features) if provided as input file</span>
873
- <span class="cstat-no" title="statement not covered" >export async function createDefaultCatalogLayers (options = {}) {</span>
870
+ &nbsp;
871
+ // Read default layers configured and create, if not found in DB, or update it accordingly
872
+ // Will also clean and feed default data (ie features) if provided as input file
873
+ export <span class="fstat-no" title="function not covered" >async function createDefaultCatalogLayers (options = {}) {</span>
874
874
  <span class="cstat-no" title="statement not covered" > const app = this</span>
875
875
  <span class="cstat-no" title="statement not covered" > const catalogService = app.getService('catalog', options.context)</span>
876
876
  <span class="cstat-no" title="statement not covered" > const catalog = app.get('catalog')</span>
@@ -953,9 +953,9 @@
953
953
  <span class="cstat-no" title="statement not covered" > }</span>
954
954
  <span class="cstat-no" title="statement not covered" > }</span>
955
955
  <span class="cstat-no" title="statement not covered" >}</span>
956
- <span class="cstat-no" title="statement not covered" ></span>
957
- <span class="cstat-no" title="statement not covered" >// Create the required features services for layers found in catalog</span>
958
- <span class="cstat-no" title="statement not covered" >export async function createCatalogFeaturesServices (options = {}) {</span>
956
+ &nbsp;
957
+ // Create the required features services for layers found in catalog
958
+ export <span class="fstat-no" title="function not covered" >async function createCatalogFeaturesServices (options = {}) {</span>
959
959
  <span class="cstat-no" title="statement not covered" > const app = this</span>
960
960
  <span class="cstat-no" title="statement not covered" > const catalogService = app.getService('catalog', options.context)</span>
961
961
  <span class="cstat-no" title="statement not covered" > const layers = await catalogService.find({ query: { service: { $exists: true } }, paginate: false, $select: ['service'] })</span>
@@ -963,75 +963,75 @@
963
963
  <span class="cstat-no" title="statement not covered" > await createFeaturesServiceForLayer.call(app, layers[i], options.context)</span>
964
964
  <span class="cstat-no" title="statement not covered" > }</span>
965
965
  <span class="cstat-no" title="statement not covered" >}</span>
966
- <span class="cstat-no" title="statement not covered" ></span>
967
- <span class="cstat-no" title="statement not covered" >export function createStylesService (options = {}) {</span>
968
- <span class="cstat-no" title="statement not covered" > const app = this</span>
969
- <span class="cstat-no" title="statement not covered" > return app.createService('styles', Object.assign({</span>
970
- <span class="cstat-no" title="statement not covered" > servicesPath,</span>
971
- <span class="cstat-no" title="statement not covered" > modelsPath</span>
972
- <span class="cstat-no" title="statement not covered" > }, options))</span>
973
- <span class="cstat-no" title="statement not covered" >}</span>
974
- <span class="cstat-no" title="statement not covered" ></span>
975
- <span class="cstat-no" title="statement not covered" >export function removeStylesService (options = {}) {</span>
966
+ &nbsp;
967
+ export function createStylesService (options = {}) {
968
+ const app = this
969
+ return app.createService('styles', Object.assign({
970
+ servicesPath,
971
+ modelsPath
972
+ }, options))
973
+ }
974
+ &nbsp;
975
+ export <span class="fstat-no" title="function not covered" >function removeStylesService (options = {}) {</span>
976
976
  <span class="cstat-no" title="statement not covered" > const app = this</span>
977
977
  <span class="cstat-no" title="statement not covered" > return app.removeService(app.getService('styles', options.context))</span>
978
978
  <span class="cstat-no" title="statement not covered" >}</span>
979
- <span class="cstat-no" title="statement not covered" ></span>
980
- <span class="cstat-no" title="statement not covered" >export default async function () {</span>
981
- <span class="cstat-no" title="statement not covered" > const app = this</span>
982
- <span class="cstat-no" title="statement not covered" ></span>
983
- <span class="cstat-no" title="statement not covered" > const catalogConfig = app.get('catalog')</span>
984
- <span class="cstat-no" title="statement not covered" > if (catalogConfig) {</span>
979
+ &nbsp;
980
+ export default async function () {
981
+ const app = this
982
+ &nbsp;
983
+ const catalogConfig = app.get('catalog')
984
+ if (catalogConfig) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
985
985
  <span class="cstat-no" title="statement not covered" > await createCatalogService.call(app)</span>
986
986
  <span class="cstat-no" title="statement not covered" > }</span>
987
- <span class="cstat-no" title="statement not covered" > const projectsConfig = app.get('projects')</span>
988
- <span class="cstat-no" title="statement not covered" > if (projectsConfig) {</span>
987
+ const projectsConfig = app.get('projects')
988
+ if (projectsConfig) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
989
989
  <span class="cstat-no" title="statement not covered" > await createProjectsService.call(app)</span>
990
990
  <span class="cstat-no" title="statement not covered" > }</span>
991
- <span class="cstat-no" title="statement not covered" > // Add app-specific hooks to required services</span>
992
- <span class="cstat-no" title="statement not covered" > app.on('service', async service =&gt; {</span>
993
- <span class="cstat-no" title="statement not covered" > if (service.name === 'alerts') {</span>
994
- <span class="cstat-no" title="statement not covered" > // On startup restore alerts CRON tasks if service not disabled</span>
995
- <span class="cstat-no" title="statement not covered" > const alerts = await service.find({ paginate: false })</span>
996
- <span class="cstat-no" title="statement not covered" > alerts.forEach(alert =&gt; service.registerAlert(alert, false))</span>
997
- <span class="cstat-no" title="statement not covered" > }</span>
998
- <span class="cstat-no" title="statement not covered" > })</span>
999
- <span class="cstat-no" title="statement not covered" > const alertsConfig = app.get('alerts')</span>
1000
- <span class="cstat-no" title="statement not covered" > if (alertsConfig) {</span>
991
+ // Add app-specific hooks to required services
992
+ app.on('service', async service =&gt; {
993
+ if (service.name === 'alerts') {
994
+ // On startup restore alerts CRON tasks if service not disabled
995
+ const alerts = await service.find({ paginate: false })
996
+ alerts.forEach(alert =&gt; service.registerAlert(alert, false))
997
+ }
998
+ })
999
+ const alertsConfig = app.get('alerts')
1000
+ if (alertsConfig) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1001
1001
  <span class="cstat-no" title="statement not covered" > await createAlertsService.call(app)</span>
1002
1002
  <span class="cstat-no" title="statement not covered" > }</span>
1003
- <span class="cstat-no" title="statement not covered" > const stylesConfig = app.get('styles')</span>
1004
- <span class="cstat-no" title="statement not covered" > if (stylesConfig) {</span>
1005
- <span class="cstat-no" title="statement not covered" > await createStylesService.call(app)</span>
1006
- <span class="cstat-no" title="statement not covered" > debug('\'styles\' service created')</span>
1007
- <span class="cstat-no" title="statement not covered" > }</span>
1008
- <span class="cstat-no" title="statement not covered" ></span>
1009
- <span class="cstat-no" title="statement not covered" > /*</span>
1010
- <span class="cstat-no" title="statement not covered" > app.createService('daptiles', Object.assign({</span>
1011
- <span class="cstat-no" title="statement not covered" > servicesPath,</span>
1012
- <span class="cstat-no" title="statement not covered" > middlewares: {</span>
1013
- <span class="cstat-no" title="statement not covered" > after: [</span>
1014
- <span class="cstat-no" title="statement not covered" > (req, res, next) =&gt; {</span>
1015
- <span class="cstat-no" title="statement not covered" > const buffers = _.get(res.data, 'buffers')</span>
1016
- <span class="cstat-no" title="statement not covered" > if (buffers) {</span>
1017
- <span class="cstat-no" title="statement not covered" > const binary = Buffer.concat(buffers)</span>
1018
- <span class="cstat-no" title="statement not covered" > res.set({</span>
1019
- <span class="cstat-no" title="statement not covered" > 'Content-Type': 'application/octet-stream'</span>
1020
- <span class="cstat-no" title="statement not covered" > }).status(200)</span>
1021
- <span class="cstat-no" title="statement not covered" > // for (const buf of buffers) {</span>
1022
- <span class="cstat-no" title="statement not covered" > // // res.send(buf)</span>
1023
- <span class="cstat-no" title="statement not covered" > // res.write(buf)</span>
1024
- <span class="cstat-no" title="statement not covered" > // }</span>
1025
- <span class="cstat-no" title="statement not covered" > // res.end()</span>
1026
- <span class="cstat-no" title="statement not covered" > res.end(binary)</span>
1027
- <span class="cstat-no" title="statement not covered" > }</span>
1028
- <span class="cstat-no" title="statement not covered" > next()</span>
1029
- <span class="cstat-no" title="statement not covered" > }</span>
1030
- <span class="cstat-no" title="statement not covered" > ]</span>
1031
- <span class="cstat-no" title="statement not covered" > }</span>
1032
- <span class="cstat-no" title="statement not covered" > }))</span>
1033
- <span class="cstat-no" title="statement not covered" > */</span>
1034
- <span class="cstat-no" title="statement not covered" >}</span>
1003
+ const stylesConfig = app.get('styles')
1004
+ if (stylesConfig) {
1005
+ await createStylesService.call(app)
1006
+ debug('\'styles\' service created')
1007
+ }
1008
+ &nbsp;
1009
+ /*
1010
+ app.createService('daptiles', Object.assign({
1011
+ servicesPath,
1012
+ middlewares: {
1013
+ after: [
1014
+ (req, res, next) =&gt; {
1015
+ const buffers = _.get(res.data, 'buffers')
1016
+ if (buffers) {
1017
+ const binary = Buffer.concat(buffers)
1018
+ res.set({
1019
+ 'Content-Type': 'application/octet-stream'
1020
+ }).status(200)
1021
+ // for (const buf of buffers) {
1022
+ // // res.send(buf)
1023
+ // res.write(buf)
1024
+ // }
1025
+ // res.end()
1026
+ res.end(binary)
1027
+ }
1028
+ next()
1029
+ }
1030
+ ]
1031
+ }
1032
+ }))
1033
+ */
1034
+ }
1035
1035
  &nbsp;</pre></td></tr></table></pre>
1036
1036
 
1037
1037
  <div class='push'></div><!-- for sticky footer -->
@@ -1039,7 +1039,7 @@
1039
1039
  <div class='footer quiet pad2 space-top1 center small'>
1040
1040
  Code coverage generated by
1041
1041
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1042
- at 2025-05-21T12:01:19.803Z
1042
+ at 2025-07-24T10:00:20.476Z
1043
1043
  </div>
1044
1044
  <script src="../../../prettify.js"></script>
1045
1045
  <script>