@kalisio/kdk 2.6.4 → 2.7.0

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 (398) hide show
  1. package/core/api/application.js +2 -4
  2. package/core/api/authentication.js +2 -3
  3. package/core/api/db.js +10 -2
  4. package/core/api/hooks/hooks.authorisations.js +4 -2
  5. package/core/api/hooks/hooks.push.js +6 -2
  6. package/core/api/hooks/hooks.query.js +29 -12
  7. package/core/api/hooks/hooks.users.js +30 -17
  8. package/core/api/models/configurations.model.mongodb.js +4 -0
  9. package/core/api/services/authorisations/authorisations.service.js +1 -1
  10. package/core/api/services/configurations/configurations.hooks.js +33 -0
  11. package/core/api/services/index.js +41 -7
  12. package/core/api/services/messages/messages.hooks.js +9 -3
  13. package/core/client/api.js +14 -1
  14. package/core/client/capabilities.js +1 -6
  15. package/core/client/components/KAvatar.vue +24 -20
  16. package/core/client/components/account/KProfile.vue +10 -71
  17. package/core/client/components/account/index.js +0 -2
  18. package/core/client/components/app/KSettings.vue +1 -0
  19. package/core/client/components/collection/KBoard.vue +4 -3
  20. package/core/client/components/collection/KCardSection.vue +1 -0
  21. package/core/client/components/collection/KGrid.vue +2 -0
  22. package/core/client/components/collection/KTable.vue +5 -1
  23. package/core/client/components/collection/KTimeLine.vue +9 -1
  24. package/core/client/components/collection/index.js +0 -2
  25. package/core/client/components/form/KChipsField.vue +2 -1
  26. package/core/client/components/form/KEmailField.vue +1 -0
  27. package/core/client/components/form/KFileField.vue +22 -1
  28. package/core/client/components/form/KForm.vue +2 -0
  29. package/core/client/components/form/KItemField.vue +1 -0
  30. package/core/client/components/form/KNumberField.vue +1 -0
  31. package/core/client/components/form/KPasswordField.vue +1 -0
  32. package/core/client/components/form/KPhoneField.vue +1 -0
  33. package/core/client/components/form/KPropertyItemField.vue +1 -0
  34. package/core/client/components/form/KResolutionField.vue +1 -0
  35. package/core/client/components/form/KSelectField.vue +31 -0
  36. package/core/client/components/form/KTagField.vue +1 -0
  37. package/core/client/components/form/KTextField.vue +1 -0
  38. package/core/client/components/form/KTokenField.vue +1 -0
  39. package/core/client/components/form/KUnitField.vue +1 -0
  40. package/core/client/components/form/KUrlField.vue +1 -0
  41. package/core/client/components/graphics/KIcon.vue +3 -4
  42. package/core/client/components/layout/KPage.vue +1 -0
  43. package/core/client/components/layout/KWindow.vue +6 -3
  44. package/core/client/components/messages/KMessageComposer.vue +2 -1
  45. package/core/client/components/messages/KMessagesTimeLine.vue +1 -1
  46. package/core/client/components/time/KDate.vue +1 -2
  47. package/core/client/components/time/KDateTime.vue +11 -11
  48. package/core/client/components/time/KTime.vue +1 -1
  49. package/core/client/composables/collection.js +33 -8
  50. package/core/client/composables/errors.js +1 -1
  51. package/core/client/composables/layout.js +9 -9
  52. package/core/client/configurations.js +50 -0
  53. package/core/client/exporter.js +1 -1
  54. package/core/client/i18n/core_en.json +6 -39
  55. package/core/client/i18n/core_fr.json +6 -39
  56. package/core/client/index.js +2 -0
  57. package/core/client/layout.js +8 -8
  58. package/core/client/mixins/mixin.base-activity.js +5 -2
  59. package/core/client/mixins/mixin.base-field.js +3 -3
  60. package/core/client/search.js +2 -1
  61. package/core/client/utils/utils.collection.js +8 -8
  62. package/core/client/utils/utils.items.js +4 -0
  63. package/core/client/utils/utils.push.js +3 -3
  64. package/core/client/utils/utils.session.js +7 -5
  65. package/core/client/utils/utils.shapes.js +38 -7
  66. package/core/client/utils/utils.time.js +21 -22
  67. package/core/common/schemas/users.update-profile.json +3 -2
  68. package/coverage/core/api/application.js.html +392 -398
  69. package/coverage/core/api/authentication.js.html +352 -187
  70. package/coverage/core/api/db.js.html +165 -126
  71. package/coverage/core/api/hooks/hooks.authentication.js.html +22 -196
  72. package/coverage/core/api/hooks/hooks.authorisations.js.html +383 -662
  73. package/coverage/core/api/hooks/hooks.logger.js.html +41 -41
  74. package/coverage/core/api/hooks/hooks.model.js.html +113 -101
  75. package/coverage/core/api/hooks/hooks.push.js.html +124 -97
  76. package/coverage/core/api/hooks/hooks.query.js.html +292 -217
  77. package/coverage/core/api/hooks/hooks.schemas.js.html +123 -123
  78. package/coverage/core/api/hooks/hooks.service.js.html +1 -1
  79. package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
  80. package/coverage/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  81. package/coverage/core/api/hooks/hooks.users.js.html +255 -447
  82. package/coverage/core/api/hooks/index.html +107 -122
  83. package/coverage/core/api/hooks/index.js.html +4 -10
  84. package/coverage/core/api/index.html +46 -61
  85. package/coverage/core/api/index.js.html +9 -9
  86. package/coverage/core/api/marshall.js.html +9 -9
  87. package/coverage/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  88. package/coverage/core/api/models/index.html +35 -50
  89. package/coverage/core/api/models/messages.model.mongodb.js.html +39 -27
  90. package/coverage/core/api/models/tags.model.mongodb.js.html +26 -32
  91. package/coverage/core/api/models/users.model.mongodb.js.html +10 -10
  92. package/coverage/core/api/services/account/account.hooks.js.html +5 -5
  93. package/coverage/core/api/services/account/account.service.js.html +127 -127
  94. package/coverage/core/api/services/account/index.html +22 -22
  95. package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  96. package/coverage/core/api/services/authorisations/authorisations.service.js.html +213 -222
  97. package/coverage/core/api/services/authorisations/index.html +21 -21
  98. package/coverage/core/api/services/{organisations/organisations.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  99. package/coverage/core/api/services/{groups → configurations}/index.html +8 -8
  100. package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
  101. package/coverage/core/api/services/databases/databases.service.js.html +1 -1
  102. package/coverage/core/api/services/databases/index.html +1 -1
  103. package/coverage/core/api/services/import-export/import-export.hooks.js.html +76 -76
  104. package/coverage/core/api/services/import-export/import-export.service.js.html +32 -32
  105. package/coverage/core/api/services/import-export/index.html +32 -32
  106. package/coverage/core/api/services/index.html +21 -21
  107. package/coverage/core/api/services/index.js.html +313 -142
  108. package/coverage/core/api/services/mailer/index.html +32 -32
  109. package/coverage/core/api/services/mailer/mailer.hooks.js.html +80 -80
  110. package/coverage/core/api/services/mailer/mailer.service.js.html +32 -32
  111. package/coverage/core/api/services/messages/index.html +21 -21
  112. package/coverage/core/api/services/messages/messages.hooks.js.html +112 -76
  113. package/coverage/core/api/services/push/index.html +32 -32
  114. package/coverage/core/api/services/push/push.hooks.js.html +80 -80
  115. package/coverage/core/api/services/push/push.service.js.html +34 -34
  116. package/coverage/core/api/services/storage/index.html +29 -29
  117. package/coverage/core/api/services/storage/storage.hooks.js.html +80 -80
  118. package/coverage/core/api/services/storage/storage.service.js.html +29 -29
  119. package/coverage/core/api/services/tags/index.html +21 -21
  120. package/coverage/core/api/services/tags/tags.hooks.js.html +119 -71
  121. package/coverage/core/api/services/users/index.html +27 -12
  122. package/coverage/core/api/services/users/users.hooks.js.html +14 -11
  123. package/coverage/core/api/services/users/users.service.js.html +100 -0
  124. package/coverage/core/common/errors.js.html +1 -1
  125. package/coverage/core/common/index.html +42 -27
  126. package/coverage/core/common/index.js.html +1 -1
  127. package/coverage/core/common/permissions.js.html +166 -472
  128. package/coverage/core/common/schema.js.html +4 -4
  129. package/coverage/core/common/utils.js.html +31 -25
  130. package/coverage/core/common/utils.offline.js.html +199 -0
  131. package/coverage/index.html +192 -192
  132. package/coverage/lcov-report/core/api/application.js.html +392 -398
  133. package/coverage/lcov-report/core/api/authentication.js.html +352 -187
  134. package/coverage/lcov-report/core/api/db.js.html +165 -126
  135. package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +22 -196
  136. package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +383 -662
  137. package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +41 -41
  138. package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +113 -101
  139. package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +124 -97
  140. package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +292 -217
  141. package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +123 -123
  142. package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
  143. package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
  144. package/coverage/lcov-report/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
  145. package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +255 -447
  146. package/coverage/lcov-report/core/api/hooks/index.html +107 -122
  147. package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
  148. package/coverage/lcov-report/core/api/index.html +46 -61
  149. package/coverage/lcov-report/core/api/index.js.html +9 -9
  150. package/coverage/lcov-report/core/api/marshall.js.html +9 -9
  151. package/coverage/lcov-report/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
  152. package/coverage/lcov-report/core/api/models/index.html +35 -50
  153. package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +39 -27
  154. package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +26 -32
  155. package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +10 -10
  156. package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +5 -5
  157. package/coverage/lcov-report/core/api/services/account/account.service.js.html +127 -127
  158. package/coverage/lcov-report/core/api/services/account/index.html +22 -22
  159. package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
  160. package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +213 -222
  161. package/coverage/lcov-report/core/api/services/authorisations/index.html +21 -21
  162. package/coverage/lcov-report/core/api/services/{groups/groups.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
  163. package/coverage/lcov-report/core/api/services/{groups → configurations}/index.html +8 -8
  164. package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
  165. package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
  166. package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
  167. package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +76 -76
  168. package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +32 -32
  169. package/coverage/lcov-report/core/api/services/import-export/index.html +32 -32
  170. package/coverage/lcov-report/core/api/services/index.html +21 -21
  171. package/coverage/lcov-report/core/api/services/index.js.html +313 -142
  172. package/coverage/lcov-report/core/api/services/mailer/index.html +32 -32
  173. package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +80 -80
  174. package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +32 -32
  175. package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
  176. package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +112 -76
  177. package/coverage/lcov-report/core/api/services/push/index.html +32 -32
  178. package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +80 -80
  179. package/coverage/lcov-report/core/api/services/push/push.service.js.html +34 -34
  180. package/coverage/lcov-report/core/api/services/storage/index.html +29 -29
  181. package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +80 -80
  182. package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +29 -29
  183. package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
  184. package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +119 -71
  185. package/coverage/lcov-report/core/api/services/users/index.html +27 -12
  186. package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +14 -11
  187. package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
  188. package/coverage/lcov-report/core/common/errors.js.html +1 -1
  189. package/coverage/lcov-report/core/common/index.html +42 -27
  190. package/coverage/lcov-report/core/common/index.js.html +1 -1
  191. package/coverage/lcov-report/core/common/permissions.js.html +166 -472
  192. package/coverage/lcov-report/core/common/schema.js.html +4 -4
  193. package/coverage/lcov-report/core/common/utils.js.html +31 -25
  194. package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
  195. package/coverage/lcov-report/index.html +192 -192
  196. package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +169 -31
  197. package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
  198. package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +215 -35
  199. package/coverage/lcov-report/map/api/hooks/index.html +7 -7
  200. package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
  201. package/coverage/lcov-report/map/api/index.html +1 -1
  202. package/coverage/lcov-report/map/api/index.js.html +1 -1
  203. package/coverage/lcov-report/map/api/marshall.js.html +1 -1
  204. package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
  205. package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +82 -7
  206. package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
  207. package/coverage/lcov-report/map/api/models/index.html +22 -7
  208. package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
  209. package/coverage/lcov-report/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  210. package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
  211. package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
  212. package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
  213. package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +39 -12
  214. package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
  215. package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
  216. package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
  217. package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +86 -11
  218. package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
  219. package/coverage/lcov-report/map/api/services/features/index.html +7 -7
  220. package/coverage/lcov-report/map/api/services/index.html +5 -5
  221. package/coverage/lcov-report/map/api/services/index.js.html +326 -50
  222. package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
  223. package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
  224. package/coverage/{core/api/services/organisations → lcov-report/map/api/services/styles}/index.html +10 -25
  225. package/coverage/lcov-report/{core/api/services/organisations/organisations.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
  226. package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
  227. package/coverage/lcov-report/map/common/errors.js.html +1 -1
  228. package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +7 -10
  229. package/coverage/lcov-report/map/common/grid.js.html +1 -1
  230. package/coverage/lcov-report/map/common/index.html +19 -19
  231. package/coverage/lcov-report/map/common/index.js.html +1 -1
  232. package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
  233. package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
  234. package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
  235. package/coverage/lcov-report/map/common/opendap-utils.js.html +4 -7
  236. package/coverage/lcov-report/map/common/permissions.js.html +10 -4
  237. package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
  238. package/coverage/lcov-report/map/common/tms-utils.js.html +9 -12
  239. package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
  240. package/coverage/lcov-report/map/common/wcs-utils.js.html +12 -15
  241. package/coverage/lcov-report/map/common/weacast-grid-source.js.html +2 -2
  242. package/coverage/lcov-report/map/common/wfs-utils.js.html +14 -17
  243. package/coverage/lcov-report/map/common/wms-utils.js.html +30 -12
  244. package/coverage/lcov-report/map/common/wmts-utils.js.html +10 -13
  245. package/coverage/lcov.info +4157 -3816
  246. package/coverage/map/api/hooks/hooks.catalog.js.html +169 -31
  247. package/coverage/map/api/hooks/hooks.features.js.html +1 -1
  248. package/coverage/map/api/hooks/hooks.query.js.html +215 -35
  249. package/coverage/map/api/hooks/index.html +7 -7
  250. package/coverage/map/api/hooks/index.js.html +1 -1
  251. package/coverage/map/api/index.html +1 -1
  252. package/coverage/map/api/index.js.html +1 -1
  253. package/coverage/map/api/marshall.js.html +1 -1
  254. package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
  255. package/coverage/map/api/models/catalog.model.mongodb.js.html +82 -7
  256. package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
  257. package/coverage/map/api/models/index.html +22 -7
  258. package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
  259. package/coverage/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
  260. package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
  261. package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
  262. package/coverage/map/api/services/alerts/index.html +1 -1
  263. package/coverage/map/api/services/catalog/catalog.hooks.js.html +39 -12
  264. package/coverage/map/api/services/catalog/index.html +5 -5
  265. package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
  266. package/coverage/map/api/services/daptiles/index.html +1 -1
  267. package/coverage/map/api/services/features/features.hooks.js.html +86 -11
  268. package/coverage/map/api/services/features/features.service.js.html +307 -4
  269. package/coverage/map/api/services/features/index.html +7 -7
  270. package/coverage/map/api/services/index.html +5 -5
  271. package/coverage/map/api/services/index.js.html +326 -50
  272. package/coverage/map/api/services/projects/index.html +1 -1
  273. package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
  274. package/coverage/{lcov-report/core/api/services/organisations → map/api/services/styles}/index.html +10 -25
  275. package/coverage/{core/api/services/groups/groups.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
  276. package/coverage/map/common/dynamic-grid-source.js.html +1 -1
  277. package/coverage/map/common/errors.js.html +1 -1
  278. package/coverage/map/common/geotiff-grid-source.js.html +7 -10
  279. package/coverage/map/common/grid.js.html +1 -1
  280. package/coverage/map/common/index.html +19 -19
  281. package/coverage/map/common/index.js.html +1 -1
  282. package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
  283. package/coverage/map/common/moment-utils.js.html +1 -1
  284. package/coverage/map/common/opendap-grid-source.js.html +1 -1
  285. package/coverage/map/common/opendap-utils.js.html +4 -7
  286. package/coverage/map/common/permissions.js.html +10 -4
  287. package/coverage/map/common/time-based-grid-source.js.html +1 -1
  288. package/coverage/map/common/tms-utils.js.html +9 -12
  289. package/coverage/map/common/wcs-grid-source.js.html +3 -3
  290. package/coverage/map/common/wcs-utils.js.html +12 -15
  291. package/coverage/map/common/weacast-grid-source.js.html +2 -2
  292. package/coverage/map/common/wfs-utils.js.html +14 -17
  293. package/coverage/map/common/wms-utils.js.html +30 -12
  294. package/coverage/map/common/wmts-utils.js.html +10 -13
  295. package/coverage/tmp/coverage-1028514-1773134124472-0.json +1 -0
  296. package/coverage/tmp/coverage-1028526-1773134124448-0.json +1 -0
  297. package/coverage/tmp/coverage-1028537-1773134124431-0.json +1 -0
  298. package/coverage/tmp/coverage-1028549-1773134124401-0.json +1 -0
  299. package/coverage/tmp/coverage-1028556-1773134124353-0.json +1 -0
  300. package/extras/configs/widgets.top.js +3 -3
  301. package/extras/tests/core/collection.mjs +2 -9
  302. package/extras/tours/pane.top.js +0 -9
  303. package/map/api/hooks/hooks.catalog.js +18 -4
  304. package/map/api/services/catalog/catalog.hooks.js +3 -0
  305. package/map/api/services/features/features.hooks.js +3 -1
  306. package/map/api/services/index.js +2 -6
  307. package/map/api/services/styles/styles.hooks.js +6 -1
  308. package/map/client/components/KFeatureActionButton.vue +9 -3
  309. package/map/client/components/KFeaturesFilterManager.vue +5 -5
  310. package/map/client/components/KFilterCondition.vue +17 -10
  311. package/map/client/components/KLayerEditor.vue +49 -39
  312. package/map/client/components/KMeasureTool.vue +7 -1
  313. package/map/client/components/KTimezoneMap.vue +29 -9
  314. package/map/client/components/catalog/KLayersPanel.vue +26 -16
  315. package/map/client/components/catalog/KLayersSelector.vue +13 -2
  316. package/map/client/components/catalog/KViewsPanel.vue +5 -4
  317. package/map/client/components/form/KSelectLayersField.vue +28 -17
  318. package/map/client/components/form/KSelectViewsField.vue +18 -9
  319. package/map/client/components/form/KTimezoneField.vue +1 -2
  320. package/map/client/components/legend/KVariablesLegend.vue +10 -1
  321. package/map/client/components/location/KLocationCardSection.vue +7 -2
  322. package/map/client/components/location/KLocationMap.vue +31 -7
  323. package/map/client/components/selection/KSelectedLayerFeatures.vue +2 -2
  324. package/map/client/components/stickies/KZoomControl.vue +1 -1
  325. package/map/client/components/styles/KStyleManager.vue +4 -1
  326. package/map/client/components/widget/KTimeSeries.vue +174 -497
  327. package/map/client/components/widget/KTimeSeriesSelector.vue +72 -0
  328. package/map/client/components/widget/KTimeSeriesToolbar.vue +83 -0
  329. package/map/client/composables/catalog.js +6 -10
  330. package/map/client/composables/highlight.js +12 -9
  331. package/map/client/composables/project.js +1 -1
  332. package/map/client/composables/selection.js +8 -7
  333. package/map/client/composables/weather.js +9 -2
  334. package/map/client/geolocation.js +8 -5
  335. package/map/client/i18n/map_en.json +11 -10
  336. package/map/client/i18n/map_fr.json +10 -9
  337. package/map/client/leaflet/TiledFeatureLayer.js +85 -82
  338. package/map/client/leaflet/utils/utils.geojson.js +3 -3
  339. package/map/client/mixins/globe/mixin.base-globe.js +15 -6
  340. package/map/client/mixins/globe/mixin.geojson-layers.js +27 -18
  341. package/map/client/mixins/map/mixin.edit-layers.js +9 -1
  342. package/map/client/mixins/map/mixin.pmtiles-layers.js +118 -29
  343. package/map/client/mixins/map/mixin.tiled-mesh-layers.js +12 -5
  344. package/map/client/mixins/map/mixin.tiled-wind-layers.js +19 -10
  345. package/map/client/mixins/mixin.activity.js +23 -30
  346. package/map/client/mixins/mixin.feature-selection.js +41 -5
  347. package/map/client/planets.js +1 -1
  348. package/map/client/readers/reader.kml.js +2 -3
  349. package/map/client/utils/utils.catalog.js +36 -10
  350. package/map/client/utils/utils.layers.js +39 -8
  351. package/map/client/utils/utils.project.js +4 -0
  352. package/map/client/utils/utils.style.js +37 -7
  353. package/map/client/utils/utils.time-series.js +215 -6
  354. package/map/common/schemas/catalog.update.json +1 -1
  355. package/map/common/weacast-grid-source.js +1 -1
  356. package/package.json +3 -3
  357. package/scripts/kash/CHANGELOG.md +0 -4
  358. package/scripts/kash/README.md +0 -9
  359. package/scripts/kash/kash.sh +45 -40
  360. package/scripts/kash/scripts/run_tests.sh +1 -4
  361. package/test/api/core/authentication.test.js +9 -4
  362. package/test/api/core/config/default.cjs +1 -0
  363. package/test/api/core/hooks.test.js +6 -0
  364. package/test/api/core/index.test.js +43 -18
  365. package/test/api/core/push.test.js +8 -8
  366. package/test/api/core/test-log-2026-03-10.log +60 -0
  367. package/test/api/core/users.test.js +384 -0
  368. package/test/api/map/grid-sources.test.js +1 -1
  369. package/test/api/map/test-log-2026-03-10.log +56 -0
  370. package/vite/package.json +11 -2
  371. package/vite/test/core/composables.test.js +77 -0
  372. package/vite/vitest.config.js +13 -0
  373. package/vite/yarn.lock +1096 -18
  374. package/.vscode/settings.json +0 -5
  375. package/core/client/components/account/KAccount.vue +0 -68
  376. package/core/client/components/account/KDeleteAccountManager.vue +0 -62
  377. package/core/client/components/account/KEmailManager.vue +0 -128
  378. package/core/client/components/account/KPasswordManager.vue +0 -90
  379. package/core/client/components/account/KVerifyEmailManager.vue +0 -105
  380. package/core/client/components/collection/KColumn.vue +0 -227
  381. package/core/client/components/collection/KHistory.vue +0 -113
  382. package/core/client/components/collection/KHistoryEntry.vue +0 -109
  383. package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
  384. package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
  385. package/coverage/core/api/utils.js.html +0 -118
  386. package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
  387. package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
  388. package/coverage/lcov-report/core/api/utils.js.html +0 -118
  389. package/coverage/tmp/coverage-151166-1723543324307-0.json +0 -1
  390. package/coverage/tmp/coverage-151178-1723543324283-0.json +0 -1
  391. package/coverage/tmp/coverage-151189-1723543324271-0.json +0 -1
  392. package/coverage/tmp/coverage-151201-1723543324248-0.json +0 -1
  393. package/coverage/tmp/coverage-151208-1723543324227-0.json +0 -1
  394. package/scripts/kash/LICENSE +0 -21
  395. package/test/api/core/test-log-2024-04-22.log +0 -84
  396. package/test/api/core/test-log-2024-04-23.log +0 -23
  397. package/test/api/core/test-log-2024-08-13.log +0 -3
  398. package/test/api/map/test-log-2025-03-08.log +0 -0
@@ -23,30 +23,30 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">25.67% </span>
26
+ <span class="strong">91.03% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>38/148</span>
28
+ <span class='fraction'>132/145</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">100% </span>
33
+ <span class="strong">70% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>1/1</span>
35
+ <span class='fraction'>21/30</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">85.71% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>0/6</span>
42
+ <span class='fraction'>6/7</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">25.67% </span>
47
+ <span class="strong">91.03% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>38/148</span>
49
+ <span class='fraction'>132/145</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 high'></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>
@@ -208,10 +208,11 @@
208
208
  <a name='L143'></a><a href='#L143'>143</a>
209
209
  <a name='L144'></a><a href='#L144'>144</a>
210
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
211
+ <a name='L146'></a><a href='#L146'>146</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
212
+ <span class="cline-any cline-yes">1x</span>
213
+ <span class="cline-any cline-yes">1x</span>
214
+ <span class="cline-any cline-yes">1x</span>
215
+ <span class="cline-any cline-yes">1x</span>
215
216
  <span class="cline-any cline-yes">1x</span>
216
217
  <span class="cline-any cline-yes">1x</span>
217
218
  <span class="cline-any cline-yes">1x</span>
@@ -226,92 +227,15 @@
226
227
  <span class="cline-any cline-yes">1x</span>
227
228
  <span class="cline-any cline-yes">1x</span>
228
229
  <span class="cline-any cline-yes">1x</span>
229
- <span class="cline-any cline-no">&nbsp;</span>
230
- <span class="cline-any cline-no">&nbsp;</span>
231
- <span class="cline-any cline-no">&nbsp;</span>
232
- <span class="cline-any cline-no">&nbsp;</span>
233
- <span class="cline-any cline-no">&nbsp;</span>
234
- <span class="cline-any cline-no">&nbsp;</span>
235
- <span class="cline-any cline-no">&nbsp;</span>
236
- <span class="cline-any cline-no">&nbsp;</span>
237
- <span class="cline-any cline-no">&nbsp;</span>
238
- <span class="cline-any cline-no">&nbsp;</span>
239
- <span class="cline-any cline-no">&nbsp;</span>
240
- <span class="cline-any cline-no">&nbsp;</span>
241
- <span class="cline-any cline-no">&nbsp;</span>
242
- <span class="cline-any cline-no">&nbsp;</span>
243
- <span class="cline-any cline-no">&nbsp;</span>
244
- <span class="cline-any cline-no">&nbsp;</span>
245
- <span class="cline-any cline-no">&nbsp;</span>
246
- <span class="cline-any cline-no">&nbsp;</span>
247
- <span class="cline-any cline-no">&nbsp;</span>
248
- <span class="cline-any cline-no">&nbsp;</span>
249
- <span class="cline-any cline-no">&nbsp;</span>
250
- <span class="cline-any cline-no">&nbsp;</span>
251
- <span class="cline-any cline-no">&nbsp;</span>
252
- <span class="cline-any cline-no">&nbsp;</span>
253
- <span class="cline-any cline-no">&nbsp;</span>
254
- <span class="cline-any cline-no">&nbsp;</span>
255
- <span class="cline-any cline-no">&nbsp;</span>
256
- <span class="cline-any cline-no">&nbsp;</span>
257
- <span class="cline-any cline-no">&nbsp;</span>
258
- <span class="cline-any cline-no">&nbsp;</span>
259
- <span class="cline-any cline-no">&nbsp;</span>
260
- <span class="cline-any cline-no">&nbsp;</span>
261
- <span class="cline-any cline-no">&nbsp;</span>
262
- <span class="cline-any cline-no">&nbsp;</span>
263
- <span class="cline-any cline-no">&nbsp;</span>
264
- <span class="cline-any cline-no">&nbsp;</span>
265
- <span class="cline-any cline-no">&nbsp;</span>
266
230
  <span class="cline-any cline-yes">1x</span>
267
231
  <span class="cline-any cline-yes">1x</span>
268
232
  <span class="cline-any cline-yes">1x</span>
269
233
  <span class="cline-any cline-yes">1x</span>
270
234
  <span class="cline-any cline-yes">1x</span>
271
235
  <span class="cline-any cline-yes">1x</span>
272
- <span class="cline-any cline-no">&nbsp;</span>
273
- <span class="cline-any cline-no">&nbsp;</span>
274
- <span class="cline-any cline-no">&nbsp;</span>
275
- <span class="cline-any cline-no">&nbsp;</span>
276
- <span class="cline-any cline-no">&nbsp;</span>
277
- <span class="cline-any cline-no">&nbsp;</span>
278
- <span class="cline-any cline-no">&nbsp;</span>
279
- <span class="cline-any cline-no">&nbsp;</span>
280
- <span class="cline-any cline-no">&nbsp;</span>
281
- <span class="cline-any cline-no">&nbsp;</span>
282
- <span class="cline-any cline-no">&nbsp;</span>
283
- <span class="cline-any cline-no">&nbsp;</span>
284
- <span class="cline-any cline-no">&nbsp;</span>
285
- <span class="cline-any cline-no">&nbsp;</span>
286
- <span class="cline-any cline-no">&nbsp;</span>
287
- <span class="cline-any cline-no">&nbsp;</span>
288
- <span class="cline-any cline-no">&nbsp;</span>
289
- <span class="cline-any cline-no">&nbsp;</span>
290
- <span class="cline-any cline-no">&nbsp;</span>
291
- <span class="cline-any cline-no">&nbsp;</span>
292
- <span class="cline-any cline-no">&nbsp;</span>
293
- <span class="cline-any cline-no">&nbsp;</span>
294
- <span class="cline-any cline-no">&nbsp;</span>
295
- <span class="cline-any cline-no">&nbsp;</span>
296
- <span class="cline-any cline-no">&nbsp;</span>
297
- <span class="cline-any cline-no">&nbsp;</span>
298
- <span class="cline-any cline-no">&nbsp;</span>
299
- <span class="cline-any cline-no">&nbsp;</span>
300
- <span class="cline-any cline-no">&nbsp;</span>
301
- <span class="cline-any cline-no">&nbsp;</span>
302
236
  <span class="cline-any cline-yes">1x</span>
303
237
  <span class="cline-any cline-yes">1x</span>
304
238
  <span class="cline-any cline-yes">1x</span>
305
- <span class="cline-any cline-no">&nbsp;</span>
306
- <span class="cline-any cline-no">&nbsp;</span>
307
- <span class="cline-any cline-no">&nbsp;</span>
308
- <span class="cline-any cline-no">&nbsp;</span>
309
- <span class="cline-any cline-no">&nbsp;</span>
310
- <span class="cline-any cline-no">&nbsp;</span>
311
- <span class="cline-any cline-no">&nbsp;</span>
312
- <span class="cline-any cline-no">&nbsp;</span>
313
- <span class="cline-any cline-no">&nbsp;</span>
314
- <span class="cline-any cline-no">&nbsp;</span>
315
239
  <span class="cline-any cline-no">&nbsp;</span>
316
240
  <span class="cline-any cline-no">&nbsp;</span>
317
241
  <span class="cline-any cline-yes">1x</span>
@@ -319,25 +243,28 @@
319
243
  <span class="cline-any cline-yes">1x</span>
320
244
  <span class="cline-any cline-yes">1x</span>
321
245
  <span class="cline-any cline-yes">1x</span>
322
- <span class="cline-any cline-no">&nbsp;</span>
323
- <span class="cline-any cline-no">&nbsp;</span>
324
- <span class="cline-any cline-no">&nbsp;</span>
325
- <span class="cline-any cline-no">&nbsp;</span>
326
- <span class="cline-any cline-no">&nbsp;</span>
327
- <span class="cline-any cline-no">&nbsp;</span>
328
- <span class="cline-any cline-no">&nbsp;</span>
329
- <span class="cline-any cline-no">&nbsp;</span>
330
- <span class="cline-any cline-no">&nbsp;</span>
331
- <span class="cline-any cline-no">&nbsp;</span>
332
- <span class="cline-any cline-no">&nbsp;</span>
333
- <span class="cline-any cline-no">&nbsp;</span>
334
- <span class="cline-any cline-no">&nbsp;</span>
335
- <span class="cline-any cline-no">&nbsp;</span>
336
- <span class="cline-any cline-no">&nbsp;</span>
337
- <span class="cline-any cline-no">&nbsp;</span>
338
- <span class="cline-any cline-no">&nbsp;</span>
339
- <span class="cline-any cline-no">&nbsp;</span>
340
- <span class="cline-any cline-no">&nbsp;</span>
246
+ <span class="cline-any cline-yes">1x</span>
247
+ <span class="cline-any cline-yes">1x</span>
248
+ <span class="cline-any cline-yes">1x</span>
249
+ <span class="cline-any cline-yes">1x</span>
250
+ <span class="cline-any cline-yes">1x</span>
251
+ <span class="cline-any cline-yes">1x</span>
252
+ <span class="cline-any cline-yes">1x</span>
253
+ <span class="cline-any cline-yes">1x</span>
254
+ <span class="cline-any cline-yes">1x</span>
255
+ <span class="cline-any cline-yes">1x</span>
256
+ <span class="cline-any cline-yes">1x</span>
257
+ <span class="cline-any cline-yes">1x</span>
258
+ <span class="cline-any cline-yes">1x</span>
259
+ <span class="cline-any cline-yes">1x</span>
260
+ <span class="cline-any cline-yes">1x</span>
261
+ <span class="cline-any cline-yes">1x</span>
262
+ <span class="cline-any cline-yes">1x</span>
263
+ <span class="cline-any cline-yes">1x</span>
264
+ <span class="cline-any cline-yes">1x</span>
265
+ <span class="cline-any cline-yes">1x</span>
266
+ <span class="cline-any cline-yes">1x</span>
267
+ <span class="cline-any cline-yes">1x</span>
341
268
  <span class="cline-any cline-yes">1x</span>
342
269
  <span class="cline-any cline-yes">1x</span>
343
270
  <span class="cline-any cline-yes">1x</span>
@@ -345,17 +272,84 @@
345
272
  <span class="cline-any cline-no">&nbsp;</span>
346
273
  <span class="cline-any cline-no">&nbsp;</span>
347
274
  <span class="cline-any cline-no">&nbsp;</span>
275
+ <span class="cline-any cline-yes">1x</span>
276
+ <span class="cline-any cline-yes">1x</span>
277
+ <span class="cline-any cline-yes">1x</span>
278
+ <span class="cline-any cline-yes">1x</span>
279
+ <span class="cline-any cline-yes">1x</span>
280
+ <span class="cline-any cline-yes">1x</span>
281
+ <span class="cline-any cline-yes">1x</span>
282
+ <span class="cline-any cline-yes">1x</span>
283
+ <span class="cline-any cline-yes">1x</span>
284
+ <span class="cline-any cline-yes">1x</span>
285
+ <span class="cline-any cline-yes">1x</span>
286
+ <span class="cline-any cline-yes">1x</span>
287
+ <span class="cline-any cline-yes">1x</span>
288
+ <span class="cline-any cline-yes">1x</span>
289
+ <span class="cline-any cline-yes">1x</span>
290
+ <span class="cline-any cline-yes">1x</span>
348
291
  <span class="cline-any cline-no">&nbsp;</span>
292
+ <span class="cline-any cline-yes">1x</span>
293
+ <span class="cline-any cline-yes">1x</span>
294
+ <span class="cline-any cline-yes">1x</span>
295
+ <span class="cline-any cline-yes">1x</span>
296
+ <span class="cline-any cline-yes">8x</span>
297
+ <span class="cline-any cline-yes">8x</span>
298
+ <span class="cline-any cline-yes">8x</span>
299
+ <span class="cline-any cline-yes">8x</span>
300
+ <span class="cline-any cline-yes">8x</span>
301
+ <span class="cline-any cline-yes">8x</span>
302
+ <span class="cline-any cline-yes">8x</span>
303
+ <span class="cline-any cline-yes">8x</span>
304
+ <span class="cline-any cline-yes">8x</span>
305
+ <span class="cline-any cline-yes">8x</span>
306
+ <span class="cline-any cline-yes">8x</span>
349
307
  <span class="cline-any cline-no">&nbsp;</span>
350
308
  <span class="cline-any cline-no">&nbsp;</span>
351
- <span class="cline-any cline-no">&nbsp;</span>
352
- <span class="cline-any cline-no">&nbsp;</span>
353
- <span class="cline-any cline-no">&nbsp;</span>
354
- <span class="cline-any cline-no">&nbsp;</span>
355
309
  <span class="cline-any cline-yes">1x</span>
356
310
  <span class="cline-any cline-yes">1x</span>
357
311
  <span class="cline-any cline-yes">1x</span>
312
+ <span class="cline-any cline-yes">48x</span>
313
+ <span class="cline-any cline-yes">48x</span>
314
+ <span class="cline-any cline-yes">48x</span>
315
+ <span class="cline-any cline-yes">48x</span>
316
+ <span class="cline-any cline-yes">48x</span>
317
+ <span class="cline-any cline-yes">48x</span>
318
+ <span class="cline-any cline-yes">1x</span>
319
+ <span class="cline-any cline-yes">1x</span>
320
+ <span class="cline-any cline-yes">1x</span>
321
+ <span class="cline-any cline-yes">1x</span>
322
+ <span class="cline-any cline-yes">1x</span>
323
+ <span class="cline-any cline-yes">26x</span>
324
+ <span class="cline-any cline-yes">26x</span>
325
+ <span class="cline-any cline-yes">23x</span>
326
+ <span class="cline-any cline-yes">23x</span>
327
+ <span class="cline-any cline-yes">23x</span>
328
+ <span class="cline-any cline-yes">23x</span>
329
+ <span class="cline-any cline-yes">23x</span>
330
+ <span class="cline-any cline-yes">23x</span>
331
+ <span class="cline-any cline-yes">23x</span>
332
+ <span class="cline-any cline-yes">23x</span>
333
+ <span class="cline-any cline-yes">23x</span>
334
+ <span class="cline-any cline-yes">23x</span>
358
335
  <span class="cline-any cline-yes">1x</span>
336
+ <span class="cline-any cline-yes">1x</span>
337
+ <span class="cline-any cline-yes">1x</span>
338
+ <span class="cline-any cline-yes">1x</span>
339
+ <span class="cline-any cline-yes">22x</span>
340
+ <span class="cline-any cline-yes">22x</span>
341
+ <span class="cline-any cline-yes">22x</span>
342
+ <span class="cline-any cline-yes">22x</span>
343
+ <span class="cline-any cline-yes">22x</span>
344
+ <span class="cline-any cline-yes">22x</span>
345
+ <span class="cline-any cline-yes">22x</span>
346
+ <span class="cline-any cline-yes">1x</span>
347
+ <span class="cline-any cline-yes">1x</span>
348
+ <span class="cline-any cline-yes">1x</span>
349
+ <span class="cline-any cline-yes">1x</span>
350
+ <span class="cline-any cline-no">&nbsp;</span>
351
+ <span class="cline-any cline-no">&nbsp;</span>
352
+ <span class="cline-any cline-no">&nbsp;</span>
359
353
  <span class="cline-any cline-no">&nbsp;</span>
360
354
  <span class="cline-any cline-no">&nbsp;</span>
361
355
  <span class="cline-any cline-yes">1x</span>
@@ -373,138 +367,135 @@ export default {
373
367
  // Used to change permissions for a subject on a resource
374
368
  // We pass parameters in the query/data object
375
369
  // The params object should be already filled by populate hooks
376
- <span class="fstat-no" title="function not covered" > create (data, params) {</span>
377
- <span class="cstat-no" title="statement not covered" > const query = params.query</span>
378
- <span class="cstat-no" title="statement not covered" > const context = params.resourcesService.context</span>
379
- <span class="cstat-no" title="statement not covered" > // Make hook usable with query params as well</span>
380
- <span class="cstat-no" title="statement not covered" > const scopeName = data.scope || query.scope // Get scope name first</span>
381
- <span class="cstat-no" title="statement not covered" > return Promise.all(params.subjects.map(async subject =&gt; {</span>
382
- <span class="cstat-no" title="statement not covered" > // Then retrieve the right scope on the subject</span>
383
- <span class="cstat-no" title="statement not covered" > const scope = _.get(subject, scopeName, [])</span>
384
- <span class="cstat-no" title="statement not covered" > // Then the target resource</span>
385
- <span class="cstat-no" title="statement not covered" > let resource = _.find(scope, resource =&gt; resource._id &amp;&amp; (resource._id.toString() === params.resource._id.toString()))</span>
386
- <span class="cstat-no" title="statement not covered" > if (!resource) {</span>
387
- <span class="cstat-no" title="statement not covered" > // Fallback as name</span>
388
- <span class="cstat-no" title="statement not covered" > resource = _.find(scope, resource =&gt; resource.name &amp;&amp; (resource.name === params.resource.name))</span>
389
- <span class="cstat-no" title="statement not covered" > }</span>
390
- <span class="cstat-no" title="statement not covered" > // On first authorisation create the resource in scope</span>
391
- <span class="cstat-no" title="statement not covered" > if (!resource) {</span>
392
- <span class="cstat-no" title="statement not covered" > resource = Object.assign({}, params.resource)</span>
393
- <span class="cstat-no" title="statement not covered" > if (context) {</span>
370
+ create (data, params) {
371
+ const query = params.query
372
+ const context = params.resourcesService.context
373
+ // Make hook usable with query params as well
374
+ const scopeName = data.scope <span class="branch-0 cbranch-no" title="branch not covered" >|| query.scope </span>// Get scope name first
375
+ return Promise.all(params.subjects.map(async subject =&gt; {
376
+ // Then retrieve the right scope on the subject
377
+ const scope = _.get(subject, scopeName, [])
378
+ // Then the target resource
379
+ let resource = _.find(scope, resource =&gt; resource._id &amp;&amp; (resource._id.toString() === params.resource._id.toString()))
380
+ // On first authorisation create the resource in scope
381
+ if (!resource) {
382
+ resource = Object.assign({}, params.resource)
383
+ if (context) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
394
384
  <span class="cstat-no" title="statement not covered" > resource.context = (typeof context === 'object' ? context._id.toString() : context.toString())</span>
395
385
  <span class="cstat-no" title="statement not covered" > }</span>
396
- <span class="cstat-no" title="statement not covered" > scope.push(resource)</span>
397
- <span class="cstat-no" title="statement not covered" > }</span>
398
- <span class="cstat-no" title="statement not covered" > // Hooks should have populate subject/resource,</span>
399
- <span class="cstat-no" title="statement not covered" > // now we have to set permissions on the given subject's scope</span>
400
- <span class="cstat-no" title="statement not covered" > resource.permissions = data.permissions || query.permissions</span>
401
- <span class="cstat-no" title="statement not covered" > // This cover the case when we create the scope on the first auth,</span>
402
- <span class="cstat-no" title="statement not covered" > // so that if the caller want to get back the update subject he can have it</span>
403
- <span class="cstat-no" title="statement not covered" > _.set(subject, scopeName, scope)</span>
404
- <span class="cstat-no" title="statement not covered" > debug('Updating scope ' + scopeName + ' for subject ' + subject._id + ' on resource ' + params.resource._id + ':', scope)</span>
405
- <span class="cstat-no" title="statement not covered" > subject = await params.subjectsService.patch(subject._id, {</span>
406
- <span class="cstat-no" title="statement not covered" > [scopeName]: scope</span>
407
- <span class="cstat-no" title="statement not covered" > }, {</span>
408
- <span class="cstat-no" title="statement not covered" > user: params.user</span>
409
- <span class="cstat-no" title="statement not covered" > })</span>
410
- <span class="cstat-no" title="statement not covered" > await this.updateAbilities(subject)</span>
411
- <span class="cstat-no" title="statement not covered" > debug('Authorisation ' + data.permissions + ' set for subject ' + subject._id + ' on resource ' + params.resource._id + ' with scope ' + scopeName)</span>
412
- <span class="cstat-no" title="statement not covered" > return subject</span>
413
- <span class="cstat-no" title="statement not covered" > }))</span>
386
+ scope.push(resource)
387
+ }
388
+ // Hooks should have populate subject/resource,
389
+ // now we have to set permissions on the given subject's scope
390
+ resource.permissions = data.permissions <span class="branch-0 cbranch-no" title="branch not covered" >|| query.permissions</span>
391
+ // This cover the case when we create the scope on the first auth,
392
+ // so that if the caller want to get back the update subject he can have it
393
+ _.set(subject, scopeName, scope)
394
+ debug('Updating scope ' + scopeName + ' for subject ' + subject._id + ' on resource ' + params.resource._id + ':', scope)
395
+ subject = await params.subjectsService.patch(subject._id, {
396
+ [scopeName]: scope
397
+ }, {
398
+ user: params.user
399
+ })
400
+ debug('Authorisation ' + data.permissions + ' set for subject ' + subject._id + ' on resource ' + params.resource._id + ' with scope ' + scopeName)
401
+ return subject
402
+ }))
414
403
  },
415
404
  &nbsp;
416
405
  // Used to remove permissions for a subject on a resource
417
406
  // We use ID as target resource and pass parameters in the query object
418
407
  // The params object should be already filled by populate hooks
419
- <span class="fstat-no" title="function not covered" > remove (id, params) {</span>
420
- <span class="cstat-no" title="statement not covered" > const query = params.query</span>
421
- <span class="cstat-no" title="statement not covered" > const scopeName = query.scope // Get scope name first</span>
422
- <span class="cstat-no" title="statement not covered" > return Promise.all(params.subjects.map(async subject =&gt; {</span>
423
- <span class="cstat-no" title="statement not covered" > // Then retrieve the right scope on the subject</span>
424
- <span class="cstat-no" title="statement not covered" > const scope = _.get(subject, scopeName, [])</span>
425
- <span class="cstat-no" title="statement not covered" > // Remove the target resource if any</span>
426
- <span class="cstat-no" title="statement not covered" > let resources = _.remove(scope, resource =&gt; resource._id &amp;&amp; (resource._id.toString() === id.toString()))</span>
427
- <span class="cstat-no" title="statement not covered" > if (resources.length === 0) {</span>
408
+ remove (id, params) {
409
+ const query = params.query
410
+ const scopeName = query.scope // Get scope name first
411
+ return Promise.all(params.subjects.map(async subject =&gt; {
412
+ // Then retrieve the right scope on the subject
413
+ const scope = _.get(subject, scopeName, [])
414
+ // Remove the target resource if any
415
+ let resources = _.remove(scope, resource =&gt; resource._id &amp;&amp; (resource._id.toString() === id.toString()))
416
+ if (resources.length === 0) <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
428
417
  <span class="cstat-no" title="statement not covered" > // Fallback as name</span>
429
- <span class="cstat-no" title="statement not covered" > resources = _.remove(scope, resource =&gt; resource.name &amp;&amp; (resource.name === id))</span>
430
- <span class="cstat-no" title="statement not covered" > }</span>
431
- <span class="cstat-no" title="statement not covered" > if (resources.length &gt; 0) {</span>
432
- <span class="cstat-no" title="statement not covered" > // This cover the case when we create the scope on the first auth,</span>
433
- <span class="cstat-no" title="statement not covered" > // so that if the caller want to get back the update subject he can have it</span>
434
- <span class="cstat-no" title="statement not covered" > _.set(subject, scopeName, scope)</span>
435
- <span class="cstat-no" title="statement not covered" > // Skip patching if the subject is currently deleted</span>
436
- <span class="cstat-no" title="statement not covered" > if (!subject.deleted) {</span>
437
- <span class="cstat-no" title="statement not covered" > debug('Updating scope ' + scopeName + ' for subject ' + subject._id + ' on resource ' + id + ':', scope)</span>
438
- <span class="cstat-no" title="statement not covered" > subject = await params.subjectsService.patch(subject._id, {</span>
439
- <span class="cstat-no" title="statement not covered" > [scopeName]: scope</span>
440
- <span class="cstat-no" title="statement not covered" > }, {</span>
441
- <span class="cstat-no" title="statement not covered" > user: params.user</span>
442
- <span class="cstat-no" title="statement not covered" > })</span>
443
- <span class="cstat-no" title="statement not covered" > await this.updateAbilities(subject)</span>
444
- <span class="cstat-no" title="statement not covered" > debug('Authorisation unset for subject ' + subject._id + ' on resource ' + id + ' with scope ' + scopeName)</span>
445
- <span class="cstat-no" title="statement not covered" > return subject</span>
446
- <span class="cstat-no" title="statement not covered" > }</span>
418
+ <span class="cstat-no" title="statement not covered" > resources = _.remove(scope, resource =&gt; resource.name &amp;&amp; (resource.name === id.toString()))</span>
447
419
  <span class="cstat-no" title="statement not covered" > }</span>
448
- <span class="cstat-no" title="statement not covered" > return subject</span>
449
- <span class="cstat-no" title="statement not covered" > }))</span>
420
+ if (resources.length &gt; 0) {
421
+ // This cover the case when we create the scope on the first auth,
422
+ // so that if the caller want to get back the update subject he can have it
423
+ _.set(subject, scopeName, scope)
424
+ // Skip patching if the subject is currently deleted
425
+ if (!subject.deleted) {
426
+ debug('Updating scope ' + scopeName + ' for subject ' + subject._id + ' on resource ' + id + ':', scope)
427
+ subject = await params.subjectsService.patch(subject._id, {
428
+ [scopeName]: scope
429
+ }, {
430
+ user: params.user
431
+ })
432
+ debug('Authorisation unset for subject ' + subject._id + ' on resource ' + id + ' with scope ' + scopeName)
433
+ return subject
434
+ }
435
+ }
436
+ <span class="cstat-no" title="statement not covered" ><span class="branch-0 cbranch-no" title="branch not covered" > return subject</span></span>
437
+ }))
450
438
  },
451
439
  &nbsp;
452
- <span class="fstat-no" title="function not covered" > setup (app) {</span>
453
- <span class="cstat-no" title="statement not covered" > const config = app.get('authorisation')</span>
454
- <span class="cstat-no" title="statement not covered" > if (config &amp;&amp; config.cache) {</span>
455
- <span class="cstat-no" title="statement not covered" > // Store abilities of the N most active users in LRU cache (defaults to 1000)</span>
456
- <span class="cstat-no" title="statement not covered" > const max = config.cache.maxUsers || 1000</span>
457
- <span class="cstat-no" title="statement not covered" > // LRU cache lib switched from positional parameters to options object at some point</span>
458
- <span class="cstat-no" title="statement not covered" > // so that now we directly pass the options to it while before we used the max argument</span>
459
- <span class="cstat-no" title="statement not covered" > if (!config.cache.max &amp;&amp; !config.cache.ttl &amp;&amp; !config.cache.maxSize) config.cache.max = max</span>
460
- <span class="cstat-no" title="statement not covered" > this.cache = new LRUCache(config.cache)</span>
461
- <span class="cstat-no" title="statement not covered" > debug('Using LRU cache for user abilities')</span>
462
- <span class="cstat-no" title="statement not covered" > } else {</span>
440
+ setup (app) {
441
+ const config = app.get('authorisation')
442
+ if (config &amp;&amp; config.cache) {
443
+ this.cacheConfig = config.cache
444
+ // Store abilities of the N most active users in LRU cache (defaults to 1000)
445
+ const max = this.cacheConfig.maxUsers <span class="branch-0 cbranch-no" title="branch not covered" >|| 1000</span>
446
+ // LRU cache lib switched from positional parameters to options object at some point
447
+ // so that now we directly pass the options to it while before we used the max argument
448
+ if (!this.cacheConfig.max &amp;&amp; !this.cacheConfig.ttl &amp;&amp; !this.cacheConfig.maxSize) this.cacheConfig.max = max
449
+ this.cache = new LRUCache(this.cacheConfig)
450
+ debug('Using LRU cache for user abilities')
451
+ }<span class="branch-0 cbranch-no" title="branch not covered" > else {</span>
463
452
  <span class="cstat-no" title="statement not covered" > debug('Do not use LRU cache for user abilities')</span>
464
453
  <span class="cstat-no" title="statement not covered" > }</span>
465
454
  },
455
+ &nbsp;
456
+ getCacheKey (subject) {
457
+ if (!this.cache) <span class="branch-0 cbranch-no" title="branch not covered" >return null</span>
458
+ let cacheKey
459
+ // Compute cache key based on provided function or user ID
460
+ if (typeof this.cacheConfig.key === 'function') <span class="branch-0 cbranch-no" title="branch not covered" >cacheKey = this.cacheConfig.key(subject)</span>
461
+ if (!cacheKey &amp;&amp; subject &amp;&amp; subject._id) cacheKey = subject._id.toString()
462
+ return cacheKey || ANONYMOUS_USER
463
+ },
466
464
  &nbsp;
467
465
  // Compute abilities for a given user and set it in cache the first time
468
466
  // or get it from cache if found
469
- <span class="fstat-no" title="function not covered" > async getAbilities (subject) {</span>
470
- <span class="cstat-no" title="statement not covered" > if (this.cache) {</span>
471
- <span class="cstat-no" title="statement not covered" > if (subject &amp;&amp; subject._id) {</span>
472
- <span class="cstat-no" title="statement not covered" > if (this.cache.has(subject._id.toString())) return this.cache.get(subject._id.toString())</span>
473
- <span class="cstat-no" title="statement not covered" > } else {</span>
474
- <span class="cstat-no" title="statement not covered" > if (this.cache.has(ANONYMOUS_USER)) return this.cache.get(ANONYMOUS_USER)</span>
475
- <span class="cstat-no" title="statement not covered" > }</span>
476
- <span class="cstat-no" title="statement not covered" > }</span>
477
- <span class="cstat-no" title="statement not covered" > // Provide app for any complex use case requiring to make requests</span>
478
- <span class="cstat-no" title="statement not covered" > const abilities = await defineAbilities(subject, this.app)</span>
479
- <span class="cstat-no" title="statement not covered" ></span>
480
- <span class="cstat-no" title="statement not covered" > if (this.cache) {</span>
481
- <span class="cstat-no" title="statement not covered" > if (subject &amp;&amp; subject._id) {</span>
482
- <span class="cstat-no" title="statement not covered" > this.cache.set(subject._id.toString(), abilities)</span>
483
- <span class="cstat-no" title="statement not covered" > } else {</span>
484
- <span class="cstat-no" title="statement not covered" > this.cache.set(ANONYMOUS_USER, abilities)</span>
485
- <span class="cstat-no" title="statement not covered" > }</span>
486
- <span class="cstat-no" title="statement not covered" > }</span>
487
- <span class="cstat-no" title="statement not covered" ></span>
488
- <span class="cstat-no" title="statement not covered" > return abilities</span>
467
+ async getAbilities (subject) {
468
+ const cacheKey = this.getCacheKey(subject)
469
+ if (cacheKey &amp;&amp; this.cache.has(cacheKey)) return this.cache.get(cacheKey)
470
+
471
+ // Provide app for any complex use case requiring to make requests
472
+ const abilities = await defineAbilities(subject, this.app)
473
+ &nbsp;
474
+ if (cacheKey) {
475
+ debug('Updating abilities of subject ' + (subject ? subject._id : ANONYMOUS_USER) + ' with cache key ' + cacheKey)
476
+ this.cache.set(cacheKey, abilities)
477
+ }
478
+ &nbsp;
479
+ return abilities
489
480
  },
490
481
  &nbsp;
491
482
  // Compute abilities for a given user and update it in cache
492
- <span class="fstat-no" title="function not covered" > async updateAbilities (subject) {</span>
493
- <span class="cstat-no" title="statement not covered" > if (this.cache) {</span>
494
- <span class="cstat-no" title="statement not covered" > if (subject &amp;&amp; subject._id) {</span>
495
- <span class="cstat-no" title="statement not covered" > this.cache.delete(subject._id.toString())</span>
496
- <span class="cstat-no" title="statement not covered" > } else {</span>
497
- <span class="cstat-no" title="statement not covered" > this.cache.delete(ANONYMOUS_USER)</span>
498
- <span class="cstat-no" title="statement not covered" > }</span>
499
- <span class="cstat-no" title="statement not covered" > }</span>
500
- <span class="cstat-no" title="statement not covered" ></span>
501
- <span class="cstat-no" title="statement not covered" > const abilities = await this.getAbilities(subject)</span>
502
- <span class="cstat-no" title="statement not covered" > return abilities</span>
483
+ async updateAbilities (subject) {
484
+ const cacheKey = this.getCacheKey(subject)
485
+
486
+ // Remove abilities from cache so that next call will populate it again
487
+ if (cacheKey &amp;&amp; this.cache.has(cacheKey)) this.cache.delete(cacheKey)
488
+
489
+ const abilities = await this.getAbilities(subject)
490
+ return abilities
503
491
  },
504
492
  &nbsp;
505
493
  // Clear abilities
506
494
  <span class="fstat-no" title="function not covered" > clearAbilities() {</span>
507
- <span class="cstat-no" title="statement not covered" > if (this.cache) this.cache.clear()</span>
495
+ <span class="cstat-no" title="statement not covered" > if (this.cache) {</span>
496
+ <span class="cstat-no" title="statement not covered" > debug('Clearing user abilities cache')</span>
497
+ <span class="cstat-no" title="statement not covered" > this.cache.clear()</span>
498
+ <span class="cstat-no" title="statement not covered" > }</span>
508
499
  <span class="cstat-no" title="statement not covered" > }</span>
509
500
  }
510
501
  &nbsp;</pre></td></tr></table></pre>
@@ -514,7 +505,7 @@ export default {
514
505
  <div class='footer quiet pad2 space-top1 center small'>
515
506
  Code coverage generated by
516
507
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
517
- at 2024-08-13T10:02:04.872Z
508
+ at 2026-03-10T09:15:24.774Z
518
509
  </div>
519
510
  <script src="../../../../prettify.js"></script>
520
511
  <script>