@kalisio/kdk 2.6.2 → 2.6.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.
- package/client/css/core.variables.scss +72 -0
- package/client/i18n/core_en.json +744 -0
- package/client/i18n/core_fr.json +744 -0
- package/client/i18n/map_en.json +800 -0
- package/client/i18n/map_fr.json +800 -0
- package/client/kdk.client.css +47 -0
- package/client/kdk.client.js +41097 -0
- package/client/kdk.client.map.css +47 -0
- package/client/kdk.client.map.js +38182 -0
- package/client/kdk.client.map.min.css +1 -0
- package/client/kdk.client.map.min.js +27032 -0
- package/client/kdk.client.min.css +1 -0
- package/client/kdk.client.min.js +29074 -0
- package/client/schemas/capture.create.json +132 -0
- package/client/schemas/catalog.update.json +44 -0
- package/client/schemas/messages.update.json +16 -0
- package/client/schemas/projects.create.json +52 -0
- package/client/schemas/projects.update.json +52 -0
- package/client/schemas/settings.update.json +286 -0
- package/client/schemas/tags.update.json +35 -0
- package/client/schemas/users.update-profile.json +34 -0
- package/core/api/authentication.js +13 -1
- package/core/api/hooks/hooks.query.js +9 -0
- package/core/client/capabilities.js +6 -1
- package/core/client/components/KChip.vue +27 -6
- package/core/client/components/collection/KCard.vue +2 -2
- package/core/client/utils/utils.session.js +5 -1
- package/coverage/core/api/application.js.html +392 -398
- package/coverage/core/api/authentication.js.html +352 -187
- package/coverage/core/api/db.js.html +165 -126
- package/coverage/core/api/hooks/hooks.authentication.js.html +22 -196
- package/coverage/core/api/hooks/hooks.authorisations.js.html +383 -662
- package/coverage/core/api/hooks/hooks.logger.js.html +41 -41
- package/coverage/core/api/hooks/hooks.model.js.html +113 -101
- package/coverage/core/api/hooks/hooks.push.js.html +112 -97
- package/coverage/core/api/hooks/hooks.query.js.html +270 -222
- package/coverage/core/api/hooks/hooks.schemas.js.html +123 -123
- package/coverage/core/api/hooks/hooks.service.js.html +1 -1
- package/coverage/core/api/hooks/hooks.storage.js.html +1 -1
- package/coverage/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
- package/coverage/core/api/hooks/hooks.users.js.html +255 -447
- package/coverage/core/api/hooks/index.html +107 -122
- package/coverage/core/api/hooks/index.js.html +4 -10
- package/coverage/core/api/index.html +46 -61
- package/coverage/core/api/index.js.html +9 -9
- package/coverage/core/api/marshall.js.html +9 -9
- package/coverage/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
- package/coverage/core/api/models/index.html +35 -50
- package/coverage/core/api/models/messages.model.mongodb.js.html +39 -27
- package/coverage/core/api/models/tags.model.mongodb.js.html +26 -32
- package/coverage/core/api/models/users.model.mongodb.js.html +10 -10
- package/coverage/core/api/services/account/account.hooks.js.html +5 -5
- package/coverage/core/api/services/account/account.service.js.html +127 -127
- package/coverage/core/api/services/account/index.html +22 -22
- package/coverage/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
- package/coverage/core/api/services/authorisations/authorisations.service.js.html +213 -222
- package/coverage/core/api/services/authorisations/index.html +21 -21
- package/coverage/core/api/services/{groups/groups.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
- package/coverage/{lcov-report/core/api/services/groups → core/api/services/configurations}/index.html +8 -8
- package/coverage/core/api/services/databases/databases.hooks.js.html +1 -1
- package/coverage/core/api/services/databases/databases.service.js.html +1 -1
- package/coverage/core/api/services/databases/index.html +1 -1
- package/coverage/core/api/services/import-export/import-export.hooks.js.html +76 -76
- package/coverage/core/api/services/import-export/import-export.service.js.html +32 -32
- package/coverage/core/api/services/import-export/index.html +32 -32
- package/coverage/core/api/services/index.html +21 -21
- package/coverage/core/api/services/index.js.html +313 -142
- package/coverage/core/api/services/mailer/index.html +32 -32
- package/coverage/core/api/services/mailer/mailer.hooks.js.html +80 -80
- package/coverage/core/api/services/mailer/mailer.service.js.html +32 -32
- package/coverage/core/api/services/messages/index.html +21 -21
- package/coverage/core/api/services/messages/messages.hooks.js.html +112 -76
- package/coverage/core/api/services/push/index.html +32 -32
- package/coverage/core/api/services/push/push.hooks.js.html +80 -80
- package/coverage/core/api/services/push/push.service.js.html +34 -34
- package/coverage/core/api/services/storage/index.html +29 -29
- package/coverage/core/api/services/storage/storage.hooks.js.html +80 -80
- package/coverage/core/api/services/storage/storage.service.js.html +29 -29
- package/coverage/core/api/services/tags/index.html +21 -21
- package/coverage/core/api/services/tags/tags.hooks.js.html +119 -71
- package/coverage/core/api/services/users/index.html +27 -12
- package/coverage/core/api/services/users/users.hooks.js.html +14 -11
- package/coverage/core/api/services/users/users.service.js.html +100 -0
- package/coverage/core/common/errors.js.html +1 -1
- package/coverage/core/common/index.html +42 -27
- package/coverage/core/common/index.js.html +1 -1
- package/coverage/core/common/permissions.js.html +166 -472
- package/coverage/core/common/schema.js.html +4 -4
- package/coverage/core/common/utils.js.html +31 -25
- package/coverage/core/common/utils.offline.js.html +199 -0
- package/coverage/index.html +192 -192
- package/coverage/lcov-report/core/api/application.js.html +392 -398
- package/coverage/lcov-report/core/api/authentication.js.html +352 -187
- package/coverage/lcov-report/core/api/db.js.html +165 -126
- package/coverage/lcov-report/core/api/hooks/hooks.authentication.js.html +22 -196
- package/coverage/lcov-report/core/api/hooks/hooks.authorisations.js.html +383 -662
- package/coverage/lcov-report/core/api/hooks/hooks.logger.js.html +41 -41
- package/coverage/lcov-report/core/api/hooks/hooks.model.js.html +113 -101
- package/coverage/lcov-report/core/api/hooks/hooks.push.js.html +112 -97
- package/coverage/lcov-report/core/api/hooks/hooks.query.js.html +270 -222
- package/coverage/lcov-report/core/api/hooks/hooks.schemas.js.html +123 -123
- package/coverage/lcov-report/core/api/hooks/hooks.service.js.html +1 -1
- package/coverage/lcov-report/core/api/hooks/hooks.storage.js.html +1 -1
- package/coverage/lcov-report/core/api/hooks/{hooks.groups.js.html → hooks.tags.js.html} +100 -76
- package/coverage/lcov-report/core/api/hooks/hooks.users.js.html +255 -447
- package/coverage/lcov-report/core/api/hooks/index.html +107 -122
- package/coverage/lcov-report/core/api/hooks/index.js.html +4 -10
- package/coverage/lcov-report/core/api/index.html +46 -61
- package/coverage/lcov-report/core/api/index.js.html +9 -9
- package/coverage/lcov-report/core/api/marshall.js.html +9 -9
- package/coverage/lcov-report/core/api/models/{organisations.model.mongodb.js.html → configurations.model.mongodb.js.html} +10 -7
- package/coverage/lcov-report/core/api/models/index.html +35 -50
- package/coverage/lcov-report/core/api/models/messages.model.mongodb.js.html +39 -27
- package/coverage/lcov-report/core/api/models/tags.model.mongodb.js.html +26 -32
- package/coverage/lcov-report/core/api/models/users.model.mongodb.js.html +10 -10
- package/coverage/lcov-report/core/api/services/account/account.hooks.js.html +5 -5
- package/coverage/lcov-report/core/api/services/account/account.service.js.html +127 -127
- package/coverage/lcov-report/core/api/services/account/index.html +22 -22
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/authorisations/authorisations.service.js.html +213 -222
- package/coverage/lcov-report/core/api/services/authorisations/index.html +21 -21
- package/coverage/lcov-report/core/api/services/{groups/groups.hooks.js.html → configurations/configurations.hooks.js.html} +16 -10
- package/coverage/{core/api/services/groups → lcov-report/core/api/services/configurations}/index.html +8 -8
- package/coverage/lcov-report/core/api/services/databases/databases.hooks.js.html +1 -1
- package/coverage/lcov-report/core/api/services/databases/databases.service.js.html +1 -1
- package/coverage/lcov-report/core/api/services/databases/index.html +1 -1
- package/coverage/lcov-report/core/api/services/import-export/import-export.hooks.js.html +76 -76
- package/coverage/lcov-report/core/api/services/import-export/import-export.service.js.html +32 -32
- package/coverage/lcov-report/core/api/services/import-export/index.html +32 -32
- package/coverage/lcov-report/core/api/services/index.html +21 -21
- package/coverage/lcov-report/core/api/services/index.js.html +313 -142
- package/coverage/lcov-report/core/api/services/mailer/index.html +32 -32
- package/coverage/lcov-report/core/api/services/mailer/mailer.hooks.js.html +80 -80
- package/coverage/lcov-report/core/api/services/mailer/mailer.service.js.html +32 -32
- package/coverage/lcov-report/core/api/services/messages/index.html +21 -21
- package/coverage/lcov-report/core/api/services/messages/messages.hooks.js.html +112 -76
- package/coverage/lcov-report/core/api/services/push/index.html +32 -32
- package/coverage/lcov-report/core/api/services/push/push.hooks.js.html +80 -80
- package/coverage/lcov-report/core/api/services/push/push.service.js.html +34 -34
- package/coverage/lcov-report/core/api/services/storage/index.html +29 -29
- package/coverage/lcov-report/core/api/services/storage/storage.hooks.js.html +80 -80
- package/coverage/lcov-report/core/api/services/storage/storage.service.js.html +29 -29
- package/coverage/lcov-report/core/api/services/tags/index.html +21 -21
- package/coverage/lcov-report/core/api/services/tags/tags.hooks.js.html +119 -71
- package/coverage/lcov-report/core/api/services/users/index.html +27 -12
- package/coverage/lcov-report/core/api/services/users/users.hooks.js.html +14 -11
- package/coverage/lcov-report/core/api/services/users/users.service.js.html +100 -0
- package/coverage/lcov-report/core/common/errors.js.html +1 -1
- package/coverage/lcov-report/core/common/index.html +42 -27
- package/coverage/lcov-report/core/common/index.js.html +1 -1
- package/coverage/lcov-report/core/common/permissions.js.html +166 -472
- package/coverage/lcov-report/core/common/schema.js.html +4 -4
- package/coverage/lcov-report/core/common/utils.js.html +31 -25
- package/coverage/lcov-report/core/common/utils.offline.js.html +199 -0
- package/coverage/lcov-report/index.html +192 -192
- package/coverage/lcov-report/map/api/hooks/hooks.catalog.js.html +169 -31
- package/coverage/lcov-report/map/api/hooks/hooks.features.js.html +1 -1
- package/coverage/lcov-report/map/api/hooks/hooks.query.js.html +32 -32
- package/coverage/lcov-report/map/api/hooks/index.html +5 -5
- package/coverage/lcov-report/map/api/hooks/index.js.html +1 -1
- package/coverage/lcov-report/map/api/index.html +1 -1
- package/coverage/lcov-report/map/api/index.js.html +1 -1
- package/coverage/lcov-report/map/api/marshall.js.html +1 -1
- package/coverage/lcov-report/map/api/models/alerts.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/map/api/models/catalog.model.mongodb.js.html +82 -7
- package/coverage/lcov-report/map/api/models/features.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/map/api/models/index.html +22 -7
- package/coverage/lcov-report/map/api/models/projects.model.mongodb.js.html +1 -1
- package/coverage/lcov-report/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
- package/coverage/lcov-report/map/api/services/alerts/alerts.hooks.js.html +1 -1
- package/coverage/lcov-report/map/api/services/alerts/alerts.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/alerts/index.html +1 -1
- package/coverage/lcov-report/map/api/services/catalog/catalog.hooks.js.html +39 -12
- package/coverage/lcov-report/map/api/services/catalog/index.html +5 -5
- package/coverage/lcov-report/map/api/services/daptiles/daptiles.service.js.html +1 -1
- package/coverage/lcov-report/map/api/services/daptiles/index.html +1 -1
- package/coverage/lcov-report/map/api/services/features/features.hooks.js.html +86 -11
- package/coverage/lcov-report/map/api/services/features/features.service.js.html +307 -4
- package/coverage/lcov-report/map/api/services/features/index.html +7 -7
- package/coverage/lcov-report/map/api/services/index.html +5 -5
- package/coverage/lcov-report/map/api/services/index.js.html +326 -50
- package/coverage/lcov-report/map/api/services/projects/index.html +1 -1
- package/coverage/lcov-report/map/api/services/projects/projects.hooks.js.html +1 -1
- package/coverage/{core/api/services/organisations → lcov-report/map/api/services/styles}/index.html +10 -25
- package/coverage/{core/api/services/organisations/organisations.hooks.js.html → lcov-report/map/api/services/styles/styles.hooks.js.html} +45 -12
- package/coverage/lcov-report/map/common/dynamic-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/errors.js.html +1 -1
- package/coverage/lcov-report/map/common/geotiff-grid-source.js.html +7 -10
- package/coverage/lcov-report/map/common/grid.js.html +1 -1
- package/coverage/lcov-report/map/common/index.html +19 -19
- package/coverage/lcov-report/map/common/index.js.html +1 -1
- package/coverage/lcov-report/map/common/meteo-model-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/moment-utils.js.html +1 -1
- package/coverage/lcov-report/map/common/opendap-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/opendap-utils.js.html +4 -7
- package/coverage/lcov-report/map/common/permissions.js.html +10 -4
- package/coverage/lcov-report/map/common/time-based-grid-source.js.html +1 -1
- package/coverage/lcov-report/map/common/tms-utils.js.html +9 -12
- package/coverage/lcov-report/map/common/wcs-grid-source.js.html +3 -3
- package/coverage/lcov-report/map/common/wcs-utils.js.html +12 -15
- package/coverage/lcov-report/map/common/weacast-grid-source.js.html +2 -2
- package/coverage/lcov-report/map/common/wfs-utils.js.html +14 -17
- package/coverage/lcov-report/map/common/wms-utils.js.html +30 -12
- package/coverage/lcov-report/map/common/wmts-utils.js.html +10 -13
- package/coverage/lcov.info +4172 -3909
- package/coverage/map/api/hooks/hooks.catalog.js.html +169 -31
- package/coverage/map/api/hooks/hooks.features.js.html +1 -1
- package/coverage/map/api/hooks/hooks.query.js.html +32 -32
- package/coverage/map/api/hooks/index.html +5 -5
- package/coverage/map/api/hooks/index.js.html +1 -1
- package/coverage/map/api/index.html +1 -1
- package/coverage/map/api/index.js.html +1 -1
- package/coverage/map/api/marshall.js.html +1 -1
- package/coverage/map/api/models/alerts.model.mongodb.js.html +1 -1
- package/coverage/map/api/models/catalog.model.mongodb.js.html +82 -7
- package/coverage/map/api/models/features.model.mongodb.js.html +1 -1
- package/coverage/map/api/models/index.html +22 -7
- package/coverage/map/api/models/projects.model.mongodb.js.html +1 -1
- package/coverage/{core/api/models/groups.model.mongodb.js.html → map/api/models/styles.model.mongodb.js.html} +10 -7
- package/coverage/map/api/services/alerts/alerts.hooks.js.html +1 -1
- package/coverage/map/api/services/alerts/alerts.service.js.html +1 -1
- package/coverage/map/api/services/alerts/index.html +1 -1
- package/coverage/map/api/services/catalog/catalog.hooks.js.html +39 -12
- package/coverage/map/api/services/catalog/index.html +5 -5
- package/coverage/map/api/services/daptiles/daptiles.service.js.html +1 -1
- package/coverage/map/api/services/daptiles/index.html +1 -1
- package/coverage/map/api/services/features/features.hooks.js.html +86 -11
- package/coverage/map/api/services/features/features.service.js.html +307 -4
- package/coverage/map/api/services/features/index.html +7 -7
- package/coverage/map/api/services/index.html +5 -5
- package/coverage/map/api/services/index.js.html +326 -50
- package/coverage/map/api/services/projects/index.html +1 -1
- package/coverage/map/api/services/projects/projects.hooks.js.html +1 -1
- package/coverage/{lcov-report/core/api/services/organisations → map/api/services/styles}/index.html +10 -25
- package/coverage/{lcov-report/core/api/services/organisations/organisations.hooks.js.html → map/api/services/styles/styles.hooks.js.html} +45 -12
- package/coverage/map/common/dynamic-grid-source.js.html +1 -1
- package/coverage/map/common/errors.js.html +1 -1
- package/coverage/map/common/geotiff-grid-source.js.html +7 -10
- package/coverage/map/common/grid.js.html +1 -1
- package/coverage/map/common/index.html +19 -19
- package/coverage/map/common/index.js.html +1 -1
- package/coverage/map/common/meteo-model-grid-source.js.html +1 -1
- package/coverage/map/common/moment-utils.js.html +1 -1
- package/coverage/map/common/opendap-grid-source.js.html +1 -1
- package/coverage/map/common/opendap-utils.js.html +4 -7
- package/coverage/map/common/permissions.js.html +10 -4
- package/coverage/map/common/time-based-grid-source.js.html +1 -1
- package/coverage/map/common/tms-utils.js.html +9 -12
- package/coverage/map/common/wcs-grid-source.js.html +3 -3
- package/coverage/map/common/wcs-utils.js.html +12 -15
- package/coverage/map/common/weacast-grid-source.js.html +2 -2
- package/coverage/map/common/wfs-utils.js.html +14 -17
- package/coverage/map/common/wms-utils.js.html +30 -12
- package/coverage/map/common/wmts-utils.js.html +10 -13
- package/coverage/tmp/coverage-222524-1765963609350-0.json +1 -0
- package/coverage/tmp/coverage-222536-1765963609335-0.json +1 -0
- package/coverage/tmp/coverage-222547-1765963609324-0.json +1 -0
- package/coverage/tmp/coverage-222559-1765963609309-0.json +1 -0
- package/coverage/tmp/coverage-222566-1765963609278-0.json +1 -0
- package/map/api/hooks/hooks.query.js +60 -0
- package/map/client/components/stickies/KZoomControl.vue +17 -9
- package/map/client/i18n/map_en.json +6 -0
- package/map/client/i18n/map_fr.json +6 -0
- package/map/client/mixins/map/mixin.base-map.js +19 -1
- package/package.json +2 -2
- package/scripts/kash/CHANGELOG.md +4 -0
- package/scripts/kash/LICENSE +21 -0
- package/scripts/kash/README.md +9 -0
- package/scripts/kash/kash.sh +40 -45
- package/scripts/kash/scripts/run_tests.sh +4 -1
- package/test/api/core/config/default.cjs +1 -0
- package/test/api/core/test-log-2025-07-31.log +15 -0
- package/test/api/core/{test-log-2024-04-23.log → test-log-2025-10-03.log} +4 -9
- package/test/api/core/test-log-2025-11-12.log +117 -0
- package/test/api/core/test-log-2025-11-27.log +0 -0
- package/test/api/core/test-log-2025-11-28.log +17 -0
- package/test/api/core/test-log-2025-12-09.log +148 -0
- package/test/api/core/test-log-2025-12-17.log +58 -0
- package/test/api/core/test-log-2026-01-29.log +17 -0
- package/test/api/map/index.test.js +21 -0
- package/test/api/map/test-log-2025-07-23.log +1 -0
- package/test/api/map/test-log-2025-11-28.log +33 -0
- package/test/api/map/test-log-2025-12-10.log +2 -0
- package/test/api/map/test-log-2026-01-06.log +26 -0
- package/.vscode/settings.json +0 -5
- package/coverage/core/api/hooks/hooks.organisations.js.html +0 -541
- package/coverage/core/api/services/organisations/organisations.service.js.html +0 -343
- package/coverage/core/api/utils.js.html +0 -118
- package/coverage/lcov-report/core/api/hooks/hooks.organisations.js.html +0 -541
- package/coverage/lcov-report/core/api/services/organisations/organisations.service.js.html +0 -343
- package/coverage/lcov-report/core/api/utils.js.html +0 -118
- package/coverage/tmp/coverage-151166-1723543324307-0.json +0 -1
- package/coverage/tmp/coverage-151178-1723543324283-0.json +0 -1
- package/coverage/tmp/coverage-151189-1723543324271-0.json +0 -1
- package/coverage/tmp/coverage-151201-1723543324248-0.json +0 -1
- package/coverage/tmp/coverage-151208-1723543324227-0.json +0 -1
- package/test/api/core/test-log-2024-04-22.log +0 -84
- package/test/api/core/test-log-2024-08-13.log +0 -3
- /package/test/api/{map/test-log-2025-03-08.log → core/test-log-2025-11-10.log} +0 -0
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">0% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>0/
|
|
28
|
+
<span class='fraction'>0/171</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">0% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>0/
|
|
49
|
+
<span class='fraction'>0/171</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -187,7 +187,53 @@
|
|
|
187
187
|
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
188
|
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
189
|
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
|
|
191
237
|
<span class="cline-any cline-no"> </span>
|
|
192
238
|
<span class="cline-any cline-no"> </span>
|
|
193
239
|
<span class="cline-any cline-no"> </span>
|
|
@@ -311,55 +357,106 @@
|
|
|
311
357
|
<span class="cline-any cline-no"> </span>
|
|
312
358
|
<span class="cline-any cline-no"> </span>
|
|
313
359
|
<span class="cline-any cline-no"> </span>
|
|
314
|
-
<span class="cline-any cline-
|
|
360
|
+
<span class="cline-any cline-no"> </span>
|
|
361
|
+
<span class="cline-any cline-no"> </span>
|
|
362
|
+
<span class="cline-any cline-no"> </span>
|
|
363
|
+
<span class="cline-any cline-no"> </span>
|
|
364
|
+
<span class="cline-any cline-no"> </span>
|
|
365
|
+
<span class="cline-any cline-no"> </span>
|
|
366
|
+
<span class="cline-any cline-no"> </span>
|
|
367
|
+
<span class="cline-any cline-no"> </span>
|
|
368
|
+
<span class="cline-any cline-no"> </span>
|
|
369
|
+
<span class="cline-any cline-no"> </span>
|
|
370
|
+
<span class="cline-any cline-no"> </span>
|
|
371
|
+
<span class="cline-any cline-no"> </span>
|
|
372
|
+
<span class="cline-any cline-no"> </span>
|
|
373
|
+
<span class="cline-any cline-no"> </span>
|
|
374
|
+
<span class="cline-any cline-no"> </span>
|
|
375
|
+
<span class="cline-any cline-no"> </span>
|
|
376
|
+
<span class="cline-any cline-no"> </span>
|
|
377
|
+
<span class="cline-any cline-no"> </span>
|
|
378
|
+
<span class="cline-any cline-no"> </span>
|
|
379
|
+
<span class="cline-any cline-no"> </span>
|
|
380
|
+
<span class="cline-any cline-no"> </span>
|
|
381
|
+
<span class="cline-any cline-no"> </span>
|
|
382
|
+
<span class="cline-any cline-no"> </span>
|
|
383
|
+
<span class="cline-any cline-no"> </span>
|
|
384
|
+
<span class="cline-any cline-no"> </span>
|
|
385
|
+
<span class="cline-any cline-no"> </span>
|
|
386
|
+
<span class="cline-any cline-no"> </span>
|
|
387
|
+
<span class="cline-any cline-no"> </span>
|
|
388
|
+
<span class="cline-any cline-no"> </span>
|
|
389
|
+
<span class="cline-any cline-no"> </span>
|
|
390
|
+
<span class="cline-any cline-no"> </span>
|
|
391
|
+
<span class="cline-any cline-no"> </span>
|
|
392
|
+
<span class="cline-any cline-no"> </span>
|
|
393
|
+
<span class="cline-any cline-no"> </span>
|
|
394
|
+
<span class="cline-any cline-no"> </span>
|
|
395
|
+
<span class="cline-any cline-no"> </span>
|
|
396
|
+
<span class="cline-any cline-no"> </span>
|
|
397
|
+
<span class="cline-any cline-no"> </span>
|
|
398
|
+
<span class="cline-any cline-no"> </span>
|
|
399
|
+
<span class="cline-any cline-no"> </span>
|
|
400
|
+
<span class="cline-any cline-no"> </span>
|
|
401
|
+
<span class="cline-any cline-no"> </span>
|
|
402
|
+
<span class="cline-any cline-no"> </span>
|
|
403
|
+
<span class="cline-any cline-no"> </span>
|
|
404
|
+
<span class="cline-any cline-no"> </span>
|
|
405
|
+
<span class="cline-any cline-no"> </span>
|
|
406
|
+
<span class="cline-any cline-no"> </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>
|
|
315
407
|
<span class="cstat-no" title="statement not covered" >import siftModule from 'sift'</span>
|
|
316
408
|
<span class="cstat-no" title="statement not covered" >import common from 'feathers-hooks-common'</span>
|
|
317
409
|
<span class="cstat-no" title="statement not covered" >import makeDebug from 'debug'</span>
|
|
410
|
+
<span class="cstat-no" title="statement not covered" >import { toString, toJson } from '../../../core/api/hooks/index.js'</span>
|
|
318
411
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
319
412
|
<span class="cstat-no" title="statement not covered" >const { getItems, replaceItems } = common</span>
|
|
320
413
|
<span class="cstat-no" title="statement not covered" >const sift = siftModule.default</span>
|
|
321
414
|
<span class="cstat-no" title="statement not covered" >const debug = makeDebug('kdk:map:catalog:hooks')</span>
|
|
322
415
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
416
|
+
<span class="cstat-no" title="statement not covered" >function isQueryForType(query, type) {</span>
|
|
417
|
+
<span class="cstat-no" title="statement not covered" > // Use sift to support MongoDB operators like $in, $nin, etc.</span>
|
|
418
|
+
<span class="cstat-no" title="statement not covered" > const filter = [{ type }].filter(sift(_.pick(query, ['type'])))</span>
|
|
419
|
+
<span class="cstat-no" title="statement not covered" > return !_.isEmpty(filter)</span>
|
|
420
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
421
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
422
|
+
<span class="cstat-no" title="statement not covered" >function addDefaultItems(query, type, items, defaultItems) {</span>
|
|
423
|
+
<span class="cstat-no" title="statement not covered" > // Add implicit type as not provided in default items config</span>
|
|
424
|
+
<span class="cstat-no" title="statement not covered" > defaultItems = _.map(defaultItems, item => Object.assign(item, { type }))</span>
|
|
425
|
+
<span class="cstat-no" title="statement not covered" > // Then filter according to query</span>
|
|
426
|
+
<span class="cstat-no" title="statement not covered" > defaultItems = defaultItems.filter(sift(_.omit(query, ['$sort', '$limit', '$skip'])))</span>
|
|
427
|
+
<span class="cstat-no" title="statement not covered" > return items.concat(defaultItems.map(item => Object.assign(item, { type })))</span>
|
|
428
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
429
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
323
430
|
<span class="cstat-no" title="statement not covered" >// By default we only return default categories</span>
|
|
324
431
|
<span class="cstat-no" title="statement not covered" >export function getDefaultCategories (hook) {</span>
|
|
325
432
|
<span class="cstat-no" title="statement not covered" > const query = _.get(hook, 'params.query', {})</span>
|
|
326
|
-
<span class="cstat-no" title="statement not covered" >
|
|
433
|
+
<span class="cstat-no" title="statement not covered" > const type = 'Category'</span>
|
|
434
|
+
<span class="cstat-no" title="statement not covered" > if ((query.$limit !== 0) && isQueryForType(query, type)) {</span>
|
|
327
435
|
<span class="cstat-no" title="statement not covered" > const service = hook.service</span>
|
|
328
|
-
<span class="cstat-no" title="statement not covered" > //
|
|
329
|
-
<span class="cstat-no" title="statement not covered" > const
|
|
330
|
-
<span class="cstat-no" title="statement not covered" >
|
|
331
|
-
<span class="cstat-no" title="statement not covered" >
|
|
332
|
-
<span class="cstat-no" title="statement not covered" > // Add implicit type</span>
|
|
333
|
-
<span class="cstat-no" title="statement not covered" > defaultCategories = _.map(defaultCategories, category => Object.assign(category, { type: 'Category' }))</span>
|
|
334
|
-
<span class="cstat-no" title="statement not covered" > // Then filter according to query</span>
|
|
335
|
-
<span class="cstat-no" title="statement not covered" > defaultCategories = defaultCategories.filter(sift(_.omit(query, ['$sort', '$limit', '$skip'])))</span>
|
|
336
|
-
<span class="cstat-no" title="statement not covered" > const item = getItems(hook)</span>
|
|
337
|
-
<span class="cstat-no" title="statement not covered" > replaceItems(hook, item.concat(defaultCategories.map(category => Object.assign(category, { type: 'Category' }))))</span>
|
|
436
|
+
<span class="cstat-no" title="statement not covered" > // Check for default categories config</span>
|
|
437
|
+
<span class="cstat-no" title="statement not covered" > const defaultCategories = _.get(service, 'options.categories', [])</span>
|
|
438
|
+
<span class="cstat-no" title="statement not covered" > debug(`Retrieving ${defaultCategories.length} default categories for query`, query)</span>
|
|
439
|
+
<span class="cstat-no" title="statement not covered" > replaceItems(hook, addDefaultItems(query, type, getItems(hook), defaultCategories))</span>
|
|
338
440
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
339
441
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
340
442
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
341
443
|
<span class="cstat-no" title="statement not covered" >// By default we only return default sublegends</span>
|
|
342
444
|
<span class="cstat-no" title="statement not covered" >export function getDefaultSublegends (hook) {</span>
|
|
343
445
|
<span class="cstat-no" title="statement not covered" > const query = _.get(hook, 'params.query', {})</span>
|
|
344
|
-
<span class="cstat-no" title="statement not covered" >
|
|
446
|
+
<span class="cstat-no" title="statement not covered" > const type = 'Sublegend'</span>
|
|
447
|
+
<span class="cstat-no" title="statement not covered" > if ((query.$limit !== 0) && isQueryForType(query, type)) {</span>
|
|
345
448
|
<span class="cstat-no" title="statement not covered" > const service = hook.service</span>
|
|
346
|
-
<span class="cstat-no" title="statement not covered" > //
|
|
347
|
-
<span class="cstat-no" title="statement not covered" > const
|
|
348
|
-
<span class="cstat-no" title="statement not covered" >
|
|
349
|
-
<span class="cstat-no" title="statement not covered" >
|
|
350
|
-
<span class="cstat-no" title="statement not covered" > // Add implicit type</span>
|
|
351
|
-
<span class="cstat-no" title="statement not covered" > defaultSublegends = _.map(defaultSublegends, sublegend => Object.assign(sublegend, { type: 'Sublegend' }))</span>
|
|
352
|
-
<span class="cstat-no" title="statement not covered" > // Then filter according to query</span>
|
|
353
|
-
<span class="cstat-no" title="statement not covered" > defaultSublegends = defaultSublegends.filter(sift(_.omit(query, ['$sort', '$limit', '$skip'])))</span>
|
|
354
|
-
<span class="cstat-no" title="statement not covered" > const item = getItems(hook)</span>
|
|
355
|
-
<span class="cstat-no" title="statement not covered" > replaceItems(hook, item.concat(defaultSublegends.map(sublegend => Object.assign(sublegend, { type: 'Sublegend' }))))</span>
|
|
449
|
+
<span class="cstat-no" title="statement not covered" > // Check for default sublegends config</span>
|
|
450
|
+
<span class="cstat-no" title="statement not covered" > const defaultSublegends = _.get(service, 'options.sublegends', [])</span>
|
|
451
|
+
<span class="cstat-no" title="statement not covered" > debug(`Retrieving ${defaultSublegends.length} default sublegends for query`, query)</span>
|
|
452
|
+
<span class="cstat-no" title="statement not covered" > replaceItems(hook, addDefaultItems(query, type, getItems(hook), defaultSublegends))</span>
|
|
356
453
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
357
454
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
358
455
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
359
456
|
<span class="cstat-no" title="statement not covered" >// By default we only return layers and not other objects in catalog</span>
|
|
360
457
|
<span class="cstat-no" title="statement not covered" >export function filterLayers (hook) {</span>
|
|
361
458
|
<span class="cstat-no" title="statement not covered" > const query = _.get(hook, 'params.query', {})</span>
|
|
362
|
-
<span class="cstat-no" title="statement not covered" > if (!query.type) query.type = { $nin: ['Context', 'Service', 'Category'] }</span>
|
|
459
|
+
<span class="cstat-no" title="statement not covered" > if (!query.type) query.type = { $nin: ['Context', 'Service', 'Category', 'Sublegend'] }</span>
|
|
363
460
|
<span class="cstat-no" title="statement not covered" > _.set(hook, 'params.query', query)</span>
|
|
364
461
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
365
462
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
@@ -407,7 +504,9 @@
|
|
|
407
504
|
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(removedItems)) removedItems = [removedItems]</span>
|
|
408
505
|
<span class="cstat-no" title="statement not covered" > for (let i = 0; i < removedItems.length; i++) {</span>
|
|
409
506
|
<span class="cstat-no" title="statement not covered" > const removedItem = removedItems[i]</span>
|
|
410
|
-
<span class="cstat-no" title="statement not covered" > const isLayer = removedItem.type
|
|
507
|
+
<span class="cstat-no" title="statement not covered" > const isLayer = removedItem.type.endsWith('Layer')</span>
|
|
508
|
+
<span class="cstat-no" title="statement not covered" > const isView = (removedItem.type === 'Context')</span>
|
|
509
|
+
<span class="cstat-no" title="statement not covered" > if (!isLayer && !isView) continue</span>
|
|
411
510
|
<span class="cstat-no" title="statement not covered" > const query = {}</span>
|
|
412
511
|
<span class="cstat-no" title="statement not covered" > if (isLayer) {</span>
|
|
413
512
|
<span class="cstat-no" title="statement not covered" > query.$or = [{ 'layers._id': removedItem._id }, { 'layers.name': removedItem.name }]</span>
|
|
@@ -421,7 +520,7 @@
|
|
|
421
520
|
<span class="cstat-no" title="statement not covered" > // Stop when non found</span>
|
|
422
521
|
<span class="cstat-no" title="statement not covered" > if (projects.length === 0) {</span>
|
|
423
522
|
<span class="cstat-no" title="statement not covered" > debug(`No project to update after removing item ${removedItem.name} `)</span>
|
|
424
|
-
<span class="cstat-no" title="statement not covered" >
|
|
523
|
+
<span class="cstat-no" title="statement not covered" > continue</span>
|
|
425
524
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
426
525
|
<span class="cstat-no" title="statement not covered" > // Update each project otherwise</span>
|
|
427
526
|
<span class="cstat-no" title="statement not covered" > await Promise.all(projects.map(project => {</span>
|
|
@@ -435,14 +534,53 @@
|
|
|
435
534
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
436
535
|
<span class="cstat-no" title="statement not covered" > return hook</span>
|
|
437
536
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
438
|
-
|
|
537
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
538
|
+
<span class="cstat-no" title="statement not covered" >export function convertFilterQueriesToString (hook) {</span>
|
|
539
|
+
<span class="cstat-no" title="statement not covered" > let items = getItems(hook)</span>
|
|
540
|
+
<span class="cstat-no" title="statement not covered" > const isArray = Array.isArray(items)</span>
|
|
541
|
+
<span class="cstat-no" title="statement not covered" > items = (isArray ? items : [items])</span>
|
|
542
|
+
<span class="cstat-no" title="statement not covered" > let nbUpdatedItems = 0</span>
|
|
543
|
+
<span class="cstat-no" title="statement not covered" > items.forEach(item => {</span>
|
|
544
|
+
<span class="cstat-no" title="statement not covered" > const filters = _.get(item, 'filters', [])</span>
|
|
545
|
+
<span class="cstat-no" title="statement not covered" > nbUpdatedItems += filters.length</span>
|
|
546
|
+
<span class="cstat-no" title="statement not covered" > _.forEach(filters, filter => {</span>
|
|
547
|
+
<span class="cstat-no" title="statement not covered" > toString(filter, ['active', 'inactive'])</span>
|
|
548
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
549
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
550
|
+
<span class="cstat-no" title="statement not covered" > if (nbUpdatedItems > 0) {</span>
|
|
551
|
+
<span class="cstat-no" title="statement not covered" > replaceItems(hook, isArray ? items : items[0])</span>
|
|
552
|
+
<span class="cstat-no" title="statement not covered" > debug(`Updated ${nbUpdatedItems} filters on items`)</span>
|
|
553
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
554
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
555
|
+
<span class="cstat-no" title="statement not covered" > return hook</span>
|
|
556
|
+
<span class="cstat-no" title="statement not covered" >}</span>
|
|
557
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
558
|
+
<span class="cstat-no" title="statement not covered" >export function convertFilterQueriesToObject (hook) {</span>
|
|
559
|
+
<span class="cstat-no" title="statement not covered" > let items = getItems(hook)</span>
|
|
560
|
+
<span class="cstat-no" title="statement not covered" > const isArray = Array.isArray(items)</span>
|
|
561
|
+
<span class="cstat-no" title="statement not covered" > items = (isArray ? items : [items])</span>
|
|
562
|
+
<span class="cstat-no" title="statement not covered" > let nbUpdatedItems = 0</span>
|
|
563
|
+
<span class="cstat-no" title="statement not covered" > items.forEach(item => {</span>
|
|
564
|
+
<span class="cstat-no" title="statement not covered" > const filters = _.get(item, 'filters', [])</span>
|
|
565
|
+
<span class="cstat-no" title="statement not covered" > nbUpdatedItems += filters.length</span>
|
|
566
|
+
<span class="cstat-no" title="statement not covered" > _.forEach(filters, filter => {</span>
|
|
567
|
+
<span class="cstat-no" title="statement not covered" > toJson(filter, ['active', 'inactive'])</span>
|
|
568
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
569
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
570
|
+
<span class="cstat-no" title="statement not covered" > if (nbUpdatedItems > 0) {</span>
|
|
571
|
+
<span class="cstat-no" title="statement not covered" > replaceItems(hook, isArray ? items : items[0])</span>
|
|
572
|
+
<span class="cstat-no" title="statement not covered" > debug(`Updated ${nbUpdatedItems} filters on items`)</span>
|
|
573
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
574
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
575
|
+
<span class="cstat-no" title="statement not covered" > return hook</span>
|
|
576
|
+
<span class="cstat-no" title="statement not covered" >}</span></pre></td></tr></table></pre>
|
|
439
577
|
|
|
440
578
|
<div class='push'></div><!-- for sticky footer -->
|
|
441
579
|
</div><!-- /wrapper -->
|
|
442
580
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
443
581
|
Code coverage generated by
|
|
444
582
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
445
|
-
at
|
|
583
|
+
at 2025-12-17T09:26:49.744Z
|
|
446
584
|
</div>
|
|
447
585
|
<script src="../../../prettify.js"></script>
|
|
448
586
|
<script>
|
|
@@ -382,7 +382,7 @@
|
|
|
382
382
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
383
383
|
Code coverage generated by
|
|
384
384
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
385
|
-
at
|
|
385
|
+
at 2025-12-17T09:26:49.744Z
|
|
386
386
|
</div>
|
|
387
387
|
<script src="../../../prettify.js"></script>
|
|
388
388
|
<script>
|
|
@@ -1018,7 +1018,7 @@
|
|
|
1018
1018
|
<span class="cstat-no" title="statement not covered" > const params = hook.params</span>
|
|
1019
1019
|
<span class="cstat-no" title="statement not covered" > const query = params.query</span>
|
|
1020
1020
|
<span class="cstat-no" title="statement not covered" > if (!options.force && !params.asGeoJson) return</span>
|
|
1021
|
-
<span class="cstat-no" title="statement not covered" > if (query
|
|
1021
|
+
<span class="cstat-no" title="statement not covered" > if (_.has(query, '$distinct') || _.has(query, '$aggregation')) return // Not applicable in this case</span>
|
|
1022
1022
|
<span class="cstat-no" title="statement not covered" > const longitudeProperty = (options.longitudeProperty || 'longitude')</span>
|
|
1023
1023
|
<span class="cstat-no" title="statement not covered" > const latitudeProperty = (options.latitudeProperty || 'latitude')</span>
|
|
1024
1024
|
<span class="cstat-no" title="statement not covered" > const altitudeProperty = (options.altitudeProperty || 'altitude')</span>
|
|
@@ -1130,19 +1130,24 @@
|
|
|
1130
1130
|
<span class="cstat-no" title="statement not covered" > let featureId = (service.options ? service.options.featureId : [])</span>
|
|
1131
1131
|
<span class="cstat-no" title="statement not covered" > // Support compound ID</span>
|
|
1132
1132
|
<span class="cstat-no" title="statement not covered" > featureId = (Array.isArray(featureId) ? featureId : [featureId])</span>
|
|
1133
|
+
<span class="cstat-no" title="statement not covered" > const hasFeatureId = !_.isEmpty(featureId)</span>
|
|
1133
1134
|
<span class="cstat-no" title="statement not covered" > let featureIdType = (service.options ? service.options.featureIdType : [])</span>
|
|
1134
1135
|
<span class="cstat-no" title="statement not covered" > featureIdType = (Array.isArray(featureIdType) ? featureIdType : [featureIdType])</span>
|
|
1135
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1136
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1137
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1138
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1139
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1140
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1136
|
+
<span class="cstat-no" title="statement not covered" > // Default is not to group by UUID</span>
|
|
1137
|
+
<span class="cstat-no" title="statement not covered" > const groupBy = { _id: '$_id' }</span>
|
|
1138
|
+
<span class="cstat-no" title="statement not covered" > let keys = ['_id']</span>
|
|
1139
|
+
<span class="cstat-no" title="statement not covered" > if (query.$groupBy) {</span>
|
|
1140
|
+
<span class="cstat-no" title="statement not covered" > groupBy._id = typeof query.$groupBy === 'string' // Group by matching ID(s), ie single ID or array of field to create a compound ID</span>
|
|
1141
|
+
<span class="cstat-no" title="statement not covered" > ? { [query.$groupBy]: '$properties.' + query.$groupBy }</span>
|
|
1142
|
+
<span class="cstat-no" title="statement not covered" > // Aggregated in an accumulator to avoid conflict with feature properties</span>
|
|
1143
|
+
<span class="cstat-no" title="statement not covered" > : query.$groupBy.reduce((object, id) => Object.assign(object, { [id]: '$properties.' + id }), {})</span>
|
|
1144
|
+
<span class="cstat-no" title="statement not covered" > keys = _.keys(groupBy._id)</span>
|
|
1145
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1141
1146
|
<span class="cstat-no" title="statement not covered" > // Do we only keep first or last available time ?</span>
|
|
1142
1147
|
<span class="cstat-no" title="statement not covered" > const singleTime = (_.toNumber(query.$limit) === 1)</span>
|
|
1143
1148
|
<span class="cstat-no" title="statement not covered" > if (singleTime) {</span>
|
|
1144
1149
|
<span class="cstat-no" title="statement not covered" > // When single time no aggregation is performed at all so we only have raw features</span>
|
|
1145
|
-
<span class="cstat-no" title="statement not covered" > keys = keys.map(key => 'properties.' + key)</span>
|
|
1150
|
+
<span class="cstat-no" title="statement not covered" > if (hasFeatureId) keys = keys.map(key => 'properties.' + key)</span>
|
|
1146
1151
|
<span class="cstat-no" title="statement not covered" > // In this case no need to aggregate on each element we simply keep the first feature</span>
|
|
1147
1152
|
<span class="cstat-no" title="statement not covered" > // BUG: according to https://jira.mongodb.org/browse/SERVER-9507 MongoDB is not yet</span>
|
|
1148
1153
|
<span class="cstat-no" title="statement not covered" > // able to optimize this kind of operations to avoid full index scan</span>
|
|
@@ -1184,6 +1189,8 @@
|
|
|
1184
1189
|
<span class="cstat-no" title="statement not covered" > // Ensure we do not mix results with/without relevant element values</span>
|
|
1185
1190
|
<span class="cstat-no" title="statement not covered" > // by separately querying each element then merging</span>
|
|
1186
1191
|
<span class="cstat-no" title="statement not covered" > let aggregatedResults</span>
|
|
1192
|
+
<span class="cstat-no" title="statement not covered" > // Associative map used to optimize merging between aggregated elements</span>
|
|
1193
|
+
<span class="cstat-no" title="statement not covered" > const aggregatedResultsMap = new Map()</span>
|
|
1187
1194
|
<span class="cstat-no" title="statement not covered" > const aggregateOptions = {</span>
|
|
1188
1195
|
<span class="cstat-no" title="statement not covered" > allowDiskUse: true</span>
|
|
1189
1196
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
@@ -1219,29 +1226,10 @@
|
|
|
1219
1226
|
<span class="cstat-no" title="statement not covered" > pipeline.forEach(stage => {</span>
|
|
1220
1227
|
<span class="cstat-no" title="statement not covered" > _.forOwn(stage, (value, key) => debug('Stage', key, value))</span>
|
|
1221
1228
|
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1222
|
-
<span class="cstat-no" title="statement not covered" > // Provide a hint to the aggregation targeting feature ID and aggregation elements.</span>
|
|
1223
|
-
<span class="cstat-no" title="statement not covered" > // The problem with the aggregation hint option is that it should correspond</span>
|
|
1224
|
-
<span class="cstat-no" title="statement not covered" > // exactly to an existing index otherwise it raises an error.</span>
|
|
1225
|
-
<span class="cstat-no" title="statement not covered" > // We use a convention to get the order right: geometry => feature ID => aggregated element => time.</span>
|
|
1226
|
-
<span class="cstat-no" title="statement not covered" > // We check anyway if the index does exist to avoid any error</span>
|
|
1227
|
-
<span class="cstat-no" title="statement not covered" > // FIXME: Instead of assuming the appropriate index is defined in the right order,</span>
|
|
1228
|
-
<span class="cstat-no" title="statement not covered" > // we might select the "best" available index (ie having the most similarities with the required one).</span>
|
|
1229
|
-
<span class="cstat-no" title="statement not covered" > const hint = {}</span>
|
|
1230
|
-
<span class="cstat-no" title="statement not covered" > if (isGeometry || query.$geoNear || match.geometry) Object.assign(hint, { geometry: '2dsphere' })</span>
|
|
1231
|
-
<span class="cstat-no" title="statement not covered" > featureId.forEach(id => {</span>
|
|
1232
|
-
<span class="cstat-no" title="statement not covered" > hint['properties.' + id] = 1</span>
|
|
1233
|
-
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1234
|
-
<span class="cstat-no" title="statement not covered" > Object.assign(hint, { ['properties.' + element]: 1 })</span>
|
|
1235
|
-
<span class="cstat-no" title="statement not covered" > // Use provided sort time option if any</span>
|
|
1236
|
-
<span class="cstat-no" title="statement not covered" > hint.time = _.get(query, '$sort.time', 1)</span>
|
|
1237
|
-
<span class="cstat-no" title="statement not covered" > const hintIndexName = _.reduce(hint, (name, value, key) => name ? `${name}_${key}_${value}` : `${key}_${value}`, '')</span>
|
|
1238
|
-
<span class="cstat-no" title="statement not covered" > debug('Best aggregation hint index found', hintIndexName)</span>
|
|
1239
|
-
<span class="cstat-no" title="statement not covered" > const hintIndex = _.find(indexes, { name: hintIndexName })</span>
|
|
1240
1229
|
<span class="cstat-no" title="statement not covered" > const aggregateElementOptions = Object.assign({}, aggregateOptions)</span>
|
|
1241
|
-
<span class="cstat-no" title="statement not covered" > if (hintIndex) aggregateElementOptions.hint = hintIndexName</span>
|
|
1242
1230
|
<span class="cstat-no" title="statement not covered" > debug('Aggregation options', aggregateElementOptions)</span>
|
|
1243
1231
|
<span class="cstat-no" title="statement not covered" > const elementResults = await collection.aggregate(pipeline, aggregateElementOptions).toArray()</span>
|
|
1244
|
-
<span class="cstat-no" title="statement not covered" > debug(`Generated ${elementResults.length} feature(s) for ${element} element`, elementResults)</span>
|
|
1232
|
+
<span class="cstat-no" title="statement not covered" > debug(`Generated ${elementResults.length} feature(s) for ${element} element, picked first two`, elementResults.slice(0,2))</span>
|
|
1245
1233
|
<span class="cstat-no" title="statement not covered" > // Rearrange data so that we get ordered arrays indexed by element</span>
|
|
1246
1234
|
<span class="cstat-no" title="statement not covered" > elementResults.forEach(result => {</span>
|
|
1247
1235
|
<span class="cstat-no" title="statement not covered" > result.time = { [element]: result.time }</span>
|
|
@@ -1257,13 +1245,24 @@
|
|
|
1257
1245
|
<span class="cstat-no" title="statement not covered" > // Now merge with previous element results</span>
|
|
1258
1246
|
<span class="cstat-no" title="statement not covered" > if (!aggregatedResults) {</span>
|
|
1259
1247
|
<span class="cstat-no" title="statement not covered" > aggregatedResults = elementResults</span>
|
|
1248
|
+
<span class="cstat-no" title="statement not covered" > aggregatedResults.forEach(result => {</span>
|
|
1249
|
+
<span class="cstat-no" title="statement not covered" > // Keep track of result in map to improve search later</span>
|
|
1250
|
+
<span class="cstat-no" title="statement not covered" > const resultKeys = keys.map(key => _.get(singleTime ? result : result._id, key))</span>
|
|
1251
|
+
<span class="cstat-no" title="statement not covered" > const resultKey = resultKeys.join('-')</span>
|
|
1252
|
+
<span class="cstat-no" title="statement not covered" > aggregatedResultsMap.set(resultKey, result)</span>
|
|
1253
|
+
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1260
1254
|
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1261
1255
|
<span class="cstat-no" title="statement not covered" > elementResults.forEach(result => {</span>
|
|
1262
|
-
<span class="cstat-no" title="statement not covered" >
|
|
1256
|
+
<span class="cstat-no" title="statement not covered" > // When single time no aggregation is performed at all so we only have raw features</span>
|
|
1257
|
+
<span class="cstat-no" title="statement not covered" > const resultKeys = keys.map(key => _.get(singleTime ? result : result._id, key))</span>
|
|
1258
|
+
<span class="cstat-no" title="statement not covered" > /* Optimize previous result search with map, kept the naive code here for reference/debug purpose</span>
|
|
1263
1259
|
<span class="cstat-no" title="statement not covered" > const previousResult = aggregatedResults.find(aggregatedResult => {</span>
|
|
1264
|
-
<span class="cstat-no" title="statement not covered" > const aggregatedResultKeys = _.
|
|
1260
|
+
<span class="cstat-no" title="statement not covered" > const aggregatedResultKeys = keys.map(key => _.get(singleTime ? result : result._id, key))</span>
|
|
1265
1261
|
<span class="cstat-no" title="statement not covered" > return _.isEqual(aggregatedResultKeys, resultKeys)</span>
|
|
1266
1262
|
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1263
|
+
<span class="cstat-no" title="statement not covered" > */</span>
|
|
1264
|
+
<span class="cstat-no" title="statement not covered" > const resultKey = resultKeys.join('-')</span>
|
|
1265
|
+
<span class="cstat-no" title="statement not covered" > const previousResult = aggregatedResultsMap.get(resultKey)</span>
|
|
1267
1266
|
<span class="cstat-no" title="statement not covered" > // Merge with previous matching feature if any</span>
|
|
1268
1267
|
<span class="cstat-no" title="statement not covered" > if (previousResult) {</span>
|
|
1269
1268
|
<span class="cstat-no" title="statement not covered" > Object.assign(previousResult.time, result.time)</span>
|
|
@@ -1274,6 +1273,7 @@
|
|
|
1274
1273
|
<span class="cstat-no" title="statement not covered" > _.set(previousResult, prefix + element, _.get(result, prefix + element))</span>
|
|
1275
1274
|
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
1276
1275
|
<span class="cstat-no" title="statement not covered" > aggregatedResults.push(result)</span>
|
|
1276
|
+
<span class="cstat-no" title="statement not covered" > aggregatedResultsMap.set(resultKey, result)</span>
|
|
1277
1277
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1278
1278
|
<span class="cstat-no" title="statement not covered" > })</span>
|
|
1279
1279
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
@@ -1283,7 +1283,7 @@
|
|
|
1283
1283
|
<span class="cstat-no" title="statement not covered" > delete query.$aggregate</span>
|
|
1284
1284
|
<span class="cstat-no" title="statement not covered" > delete query.$geoNear</span>
|
|
1285
1285
|
<span class="cstat-no" title="statement not covered" > // Set result to avoid service DB call</span>
|
|
1286
|
-
<span class="cstat-no" title="statement not covered" > hook.result = aggregatedResults</span>
|
|
1286
|
+
<span class="cstat-no" title="statement not covered" > hook.result = aggregatedResults || []</span>
|
|
1287
1287
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
1288
1288
|
<span class="cstat-no" title="statement not covered" > return hook</span>
|
|
1289
1289
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
@@ -1294,7 +1294,7 @@
|
|
|
1294
1294
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
1295
1295
|
Code coverage generated by
|
|
1296
1296
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1297
|
-
at
|
|
1297
|
+
at 2025-12-17T09:26:49.744Z
|
|
1298
1298
|
</div>
|
|
1299
1299
|
<script src="../../../prettify.js"></script>
|
|
1300
1300
|
<script>
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">0% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>0/
|
|
28
|
+
<span class='fraction'>0/686</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">0% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>0/
|
|
49
|
+
<span class='fraction'>0/686</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -84,13 +84,13 @@
|
|
|
84
84
|
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
|
|
85
85
|
</td>
|
|
86
86
|
<td data-value="0" class="pct low">0%</td>
|
|
87
|
-
<td data-value="
|
|
87
|
+
<td data-value="171" class="abs low">0/171</td>
|
|
88
88
|
<td data-value="0" class="pct low">0%</td>
|
|
89
89
|
<td data-value="1" class="abs low">0/1</td>
|
|
90
90
|
<td data-value="0" class="pct low">0%</td>
|
|
91
91
|
<td data-value="1" class="abs low">0/1</td>
|
|
92
92
|
<td data-value="0" class="pct low">0%</td>
|
|
93
|
-
<td data-value="
|
|
93
|
+
<td data-value="171" class="abs low">0/171</td>
|
|
94
94
|
</tr>
|
|
95
95
|
|
|
96
96
|
<tr>
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
147
147
|
Code coverage generated by
|
|
148
148
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
149
|
-
at
|
|
149
|
+
at 2025-12-17T09:26:49.744Z
|
|
150
150
|
</div>
|
|
151
151
|
<script src="../../../prettify.js"></script>
|
|
152
152
|
<script>
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
80
80
|
Code coverage generated by
|
|
81
81
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
82
|
-
at
|
|
82
|
+
at 2025-12-17T09:26:49.744Z
|
|
83
83
|
</div>
|
|
84
84
|
<script src="../../../prettify.js"></script>
|
|
85
85
|
<script>
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
117
117
|
Code coverage generated by
|
|
118
118
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
119
|
-
at
|
|
119
|
+
at 2025-12-17T09:26:49.744Z
|
|
120
120
|
</div>
|
|
121
121
|
<script src="../../prettify.js"></script>
|
|
122
122
|
<script>
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
125
125
|
Code coverage generated by
|
|
126
126
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
127
|
-
at
|
|
127
|
+
at 2025-12-17T09:26:49.744Z
|
|
128
128
|
</div>
|
|
129
129
|
<script src="../../prettify.js"></script>
|
|
130
130
|
<script>
|
|
@@ -163,7 +163,7 @@
|
|
|
163
163
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
164
164
|
Code coverage generated by
|
|
165
165
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
166
|
-
at
|
|
166
|
+
at 2025-12-17T09:26:49.744Z
|
|
167
167
|
</div>
|
|
168
168
|
<script src="../../prettify.js"></script>
|
|
169
169
|
<script>
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
92
92
|
Code coverage generated by
|
|
93
93
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
94
|
-
at
|
|
94
|
+
at 2025-12-17T09:26:49.744Z
|
|
95
95
|
</div>
|
|
96
96
|
<script src="../../../prettify.js"></script>
|
|
97
97
|
<script>
|