kuzzle 2.19.2 → 2.19.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/lib/api/controllers/adminController.js +94 -80
- package/lib/api/controllers/authController.js +239 -212
- package/lib/api/controllers/baseController.js +89 -51
- package/lib/api/controllers/bulkController.js +62 -49
- package/lib/api/controllers/clusterController.js +6 -8
- package/lib/api/controllers/collectionController.js +140 -129
- package/lib/api/controllers/debugController.d.ts +2 -2
- package/lib/api/controllers/debugController.js +33 -31
- package/lib/api/controllers/documentController.js +365 -274
- package/lib/api/controllers/index.js +13 -13
- package/lib/api/controllers/indexController.js +46 -50
- package/lib/api/controllers/memoryStorageController.js +410 -360
- package/lib/api/controllers/realtimeController.js +37 -36
- package/lib/api/controllers/securityController.js +553 -412
- package/lib/api/controllers/serverController.js +111 -104
- package/lib/api/documentExtractor.js +75 -68
- package/lib/api/funnel.js +411 -312
- package/lib/api/httpRoutes.js +1493 -324
- package/lib/api/openapi/OpenApiManager.d.ts +1 -1
- package/lib/api/openapi/OpenApiManager.js +22 -22
- package/lib/api/openapi/components/document/count.yaml +1 -1
- package/lib/api/openapi/components/document/create.yaml +2 -2
- package/lib/api/openapi/components/document/delete.yaml +1 -1
- package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
- package/lib/api/openapi/components/document/exists.yaml +1 -1
- package/lib/api/openapi/components/document/get.yaml +2 -2
- package/lib/api/openapi/components/document/index.js +12 -12
- package/lib/api/openapi/components/document/replace.yaml +1 -1
- package/lib/api/openapi/components/document/scroll.yaml +1 -1
- package/lib/api/openapi/components/document/validate.yaml +1 -1
- package/lib/api/openapi/components/index.d.ts +2 -2
- package/lib/api/openapi/components/index.js +1 -1
- package/lib/api/openapi/components/security/index.js +1 -1
- package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
- package/lib/api/openapi/index.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.d.ts +1 -1
- package/lib/api/openapi/openApiGenerator.js +7 -7
- package/lib/api/rateLimiter.js +12 -13
- package/lib/api/request/index.d.ts +4 -4
- package/lib/api/request/kuzzleRequest.d.ts +9 -9
- package/lib/api/request/kuzzleRequest.js +89 -87
- package/lib/api/request/requestContext.d.ts +2 -2
- package/lib/api/request/requestContext.js +17 -17
- package/lib/api/request/requestInput.d.ts +1 -1
- package/lib/api/request/requestInput.js +19 -19
- package/lib/api/request/requestResponse.d.ts +4 -4
- package/lib/api/request/requestResponse.js +31 -33
- package/lib/cluster/command.js +48 -44
- package/lib/cluster/idCardHandler.d.ts +1 -1
- package/lib/cluster/idCardHandler.js +15 -15
- package/lib/cluster/index.js +2 -2
- package/lib/cluster/node.js +301 -269
- package/lib/cluster/publisher.js +45 -46
- package/lib/cluster/state.d.ts +5 -5
- package/lib/cluster/state.js +8 -8
- package/lib/cluster/subscriber.js +163 -113
- package/lib/cluster/workers/IDCardRenewer.js +33 -32
- package/lib/config/default.config.d.ts +1 -1
- package/lib/config/default.config.js +212 -171
- package/lib/config/documentEventAliases.js +6 -6
- package/lib/config/index.js +161 -98
- package/lib/config/sdkCompatibility.json +8 -8
- package/lib/core/auth/formatProcessing.js +7 -7
- package/lib/core/auth/passportResponse.js +7 -7
- package/lib/core/auth/passportWrapper.js +34 -30
- package/lib/core/auth/tokenManager.d.ts +2 -2
- package/lib/core/auth/tokenManager.js +11 -10
- package/lib/core/backend/applicationManager.d.ts +1 -1
- package/lib/core/backend/applicationManager.js +2 -2
- package/lib/core/backend/backend.d.ts +3 -3
- package/lib/core/backend/backend.js +34 -31
- package/lib/core/backend/backendCluster.d.ts +2 -2
- package/lib/core/backend/backendCluster.js +5 -5
- package/lib/core/backend/backendConfig.d.ts +2 -2
- package/lib/core/backend/backendConfig.js +3 -3
- package/lib/core/backend/backendController.d.ts +2 -2
- package/lib/core/backend/backendController.js +9 -10
- package/lib/core/backend/backendErrors.d.ts +3 -3
- package/lib/core/backend/backendErrors.js +2 -1
- package/lib/core/backend/backendHook.d.ts +2 -2
- package/lib/core/backend/backendHook.js +5 -5
- package/lib/core/backend/backendImport.d.ts +3 -3
- package/lib/core/backend/backendImport.js +23 -23
- package/lib/core/backend/backendOpenApi.d.ts +2 -2
- package/lib/core/backend/backendOpenApi.js +16 -16
- package/lib/core/backend/backendPipe.d.ts +2 -2
- package/lib/core/backend/backendPipe.js +6 -6
- package/lib/core/backend/backendPlugin.d.ts +4 -4
- package/lib/core/backend/backendPlugin.js +14 -14
- package/lib/core/backend/backendStorage.d.ts +2 -2
- package/lib/core/backend/backendStorage.js +1 -2
- package/lib/core/backend/backendVault.d.ts +2 -2
- package/lib/core/backend/backendVault.js +3 -3
- package/lib/core/backend/index.d.ts +14 -14
- package/lib/core/backend/internalLogger.d.ts +1 -1
- package/lib/core/backend/internalLogger.js +5 -5
- package/lib/core/cache/cacheDbEnum.js +4 -4
- package/lib/core/cache/cacheEngine.js +79 -85
- package/lib/core/network/accessLogger.js +126 -120
- package/lib/core/network/clientConnection.js +5 -5
- package/lib/core/network/context.js +8 -8
- package/lib/core/network/entryPoint.js +100 -85
- package/lib/core/network/httpRouter/index.js +63 -60
- package/lib/core/network/httpRouter/routeHandler.js +18 -19
- package/lib/core/network/httpRouter/routePart.js +23 -19
- package/lib/core/network/protocolManifest.js +3 -3
- package/lib/core/network/protocols/httpMessage.js +8 -10
- package/lib/core/network/protocols/httpwsProtocol.js +305 -250
- package/lib/core/network/protocols/internalProtocol.js +27 -24
- package/lib/core/network/protocols/mqttProtocol.js +106 -96
- package/lib/core/network/protocols/protocol.js +20 -17
- package/lib/core/network/router.js +56 -46
- package/lib/core/plugin/plugin.js +151 -120
- package/lib/core/plugin/pluginContext.d.ts +7 -7
- package/lib/core/plugin/pluginContext.js +48 -44
- package/lib/core/plugin/pluginManifest.js +13 -12
- package/lib/core/plugin/pluginRepository.js +26 -27
- package/lib/core/plugin/pluginsManager.js +425 -304
- package/lib/core/plugin/privilegedContext.js +3 -3
- package/lib/core/realtime/actionEnum.js +1 -1
- package/lib/core/realtime/channel.d.ts +1 -1
- package/lib/core/realtime/channel.js +22 -22
- package/lib/core/realtime/connectionRooms.d.ts +1 -1
- package/lib/core/realtime/hotelClerk.d.ts +2 -2
- package/lib/core/realtime/hotelClerk.js +53 -50
- package/lib/core/realtime/index.js +5 -5
- package/lib/core/realtime/notification/document.js +25 -25
- package/lib/core/realtime/notification/index.js +4 -4
- package/lib/core/realtime/notification/server.js +3 -3
- package/lib/core/realtime/notification/user.js +4 -4
- package/lib/core/realtime/notifier.js +113 -75
- package/lib/core/realtime/room.d.ts +1 -1
- package/lib/core/realtime/subscription.d.ts +1 -1
- package/lib/core/realtime/subscription.js +1 -1
- package/lib/core/security/index.js +8 -8
- package/lib/core/security/profileRepository.d.ts +6 -6
- package/lib/core/security/profileRepository.js +48 -45
- package/lib/core/security/roleRepository.js +127 -115
- package/lib/core/security/securityLoader.js +70 -63
- package/lib/core/security/tokenRepository.js +132 -118
- package/lib/core/security/userRepository.js +104 -88
- package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
- package/lib/core/shared/KoncordeWrapper.js +3 -1
- package/lib/core/shared/abstractManifest.js +22 -23
- package/lib/core/shared/repository.js +69 -67
- package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
- package/lib/core/shared/sdk/embeddedSdk.js +36 -32
- package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
- package/lib/core/shared/sdk/funnelProtocol.js +11 -11
- package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
- package/lib/core/shared/store.js +127 -32
- package/lib/core/statistics/index.js +2 -2
- package/lib/core/statistics/statistics.js +99 -85
- package/lib/core/storage/clientAdapter.js +219 -136
- package/lib/core/storage/indexCache.js +3 -3
- package/lib/core/storage/storageEngine.js +10 -13
- package/lib/core/storage/storeScopeEnum.js +3 -3
- package/lib/core/validation/baseType.js +12 -10
- package/lib/core/validation/index.js +2 -2
- package/lib/core/validation/types/anything.js +4 -4
- package/lib/core/validation/types/boolean.js +7 -7
- package/lib/core/validation/types/date.js +165 -131
- package/lib/core/validation/types/email.js +18 -21
- package/lib/core/validation/types/enum.js +34 -21
- package/lib/core/validation/types/geoPoint.js +7 -7
- package/lib/core/validation/types/geoShape.js +148 -125
- package/lib/core/validation/types/integer.js +9 -9
- package/lib/core/validation/types/ipAddress.js +17 -19
- package/lib/core/validation/types/numeric.js +36 -29
- package/lib/core/validation/types/object.js +19 -19
- package/lib/core/validation/types/string.js +36 -29
- package/lib/core/validation/types/url.js +17 -19
- package/lib/core/validation/validation.js +422 -378
- package/lib/kerror/codes/1-services.json +7 -1
- package/lib/kerror/codes/4-plugin.json +2 -2
- package/lib/kerror/codes/index.js +85 -63
- package/lib/kerror/errors/badRequestError.d.ts +1 -1
- package/lib/kerror/errors/externalServiceError.d.ts +1 -1
- package/lib/kerror/errors/forbiddenError.d.ts +1 -1
- package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
- package/lib/kerror/errors/index.d.ts +15 -15
- package/lib/kerror/errors/internalError.d.ts +1 -1
- package/lib/kerror/errors/kuzzleError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
- package/lib/kerror/errors/multipleErrorsError.js +1 -1
- package/lib/kerror/errors/notFoundError.d.ts +1 -1
- package/lib/kerror/errors/partialError.d.ts +1 -1
- package/lib/kerror/errors/partialError.js +1 -1
- package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
- package/lib/kerror/errors/pluginImplementationError.js +2 -1
- package/lib/kerror/errors/preconditionError.d.ts +1 -1
- package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
- package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
- package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
- package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
- package/lib/kerror/index.d.ts +3 -3
- package/lib/kerror/index.js +17 -16
- package/lib/kuzzle/dumpGenerator.js +130 -114
- package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
- package/lib/kuzzle/event/pipeRunner.js +25 -24
- package/lib/kuzzle/event/waterfall.js +13 -15
- package/lib/kuzzle/index.js +2 -2
- package/lib/kuzzle/internalIndexHandler.js +80 -59
- package/lib/kuzzle/kuzzle.js +99 -99
- package/lib/kuzzle/kuzzleStateEnum.js +1 -1
- package/lib/kuzzle/log.js +23 -18
- package/lib/kuzzle/vault.js +34 -19
- package/lib/model/security/profile.d.ts +3 -3
- package/lib/model/security/profile.js +38 -37
- package/lib/model/security/rights.js +5 -5
- package/lib/model/security/role.d.ts +3 -3
- package/lib/model/security/role.js +25 -26
- package/lib/model/security/token.d.ts +1 -1
- package/lib/model/security/token.js +4 -4
- package/lib/model/security/user.d.ts +2 -2
- package/lib/model/security/user.js +9 -9
- package/lib/model/storage/apiKey.js +43 -33
- package/lib/model/storage/baseModel.js +49 -45
- package/lib/service/cache/redis.js +60 -55
- package/lib/service/service.js +17 -17
- package/lib/service/storage/elasticsearch.js +839 -755
- package/lib/service/storage/esWrapper.js +103 -86
- package/lib/service/storage/queryTranslator.js +52 -59
- package/lib/types/Controller.d.ts +3 -3
- package/lib/types/ControllerDefinition.d.ts +3 -3
- package/lib/types/DebugModule.d.ts +2 -2
- package/lib/types/DebugModule.js +1 -1
- package/lib/types/Global.d.ts +1 -1
- package/lib/types/HttpStream.d.ts +2 -1
- package/lib/types/HttpStream.js +7 -5
- package/lib/types/Kuzzle.d.ts +1 -1
- package/lib/types/KuzzleDocument.d.ts +1 -1
- package/lib/types/OpenApiDefinition.d.ts +1 -1
- package/lib/types/PasswordPolicy.d.ts +1 -1
- package/lib/types/Plugin.d.ts +6 -6
- package/lib/types/Plugin.js +2 -2
- package/lib/types/Policy.d.ts +1 -1
- package/lib/types/RequestPayload.d.ts +1 -1
- package/lib/types/ResponsePayload.d.ts +1 -1
- package/lib/types/Token.d.ts +1 -1
- package/lib/types/User.d.ts +1 -1
- package/lib/types/config/DumpConfiguration.d.ts +8 -8
- package/lib/types/config/HttpConfiguration.d.ts +1 -1
- package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
- package/lib/types/config/LimitsConfiguration.d.ts +8 -8
- package/lib/types/config/PluginsConfiguration.d.ts +4 -4
- package/lib/types/config/SecurityConfiguration.d.ts +62 -62
- package/lib/types/config/ServerConfiguration.d.ts +55 -55
- package/lib/types/config/ServicesConfiguration.d.ts +2 -2
- package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
- package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
- package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
- package/lib/types/errors/ErrorDefinition.d.ts +1 -1
- package/lib/types/errors/ErrorDomains.d.ts +1 -1
- package/lib/types/index.d.ts +38 -38
- package/lib/types/realtime/RealtimeScope.d.ts +1 -1
- package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
- package/lib/util/assertType.js +13 -11
- package/lib/util/async.d.ts +1 -0
- package/lib/util/async.js +61 -0
- package/lib/util/asyncStore.js +19 -21
- package/lib/util/bufferedPassThrough.d.ts +2 -2
- package/lib/util/bufferedPassThrough.js +4 -4
- package/lib/util/bytes.js +9 -13
- package/lib/util/crypto.js +1 -1
- package/lib/util/debug.js +5 -5
- package/lib/util/deprecate.js +24 -21
- package/lib/util/didYouMean.js +7 -7
- package/lib/util/dump-collection.d.ts +2 -2
- package/lib/util/dump-collection.js +26 -26
- package/lib/util/esRequest.d.ts +1 -0
- package/lib/util/esRequest.js +62 -0
- package/lib/util/extractFields.js +24 -25
- package/lib/util/inflector.js +5 -5
- package/lib/util/koncordeCompat.d.ts +2 -2
- package/lib/util/koncordeCompat.js +5 -5
- package/lib/util/memoize.js +3 -5
- package/lib/util/mutex.d.ts +19 -1
- package/lib/util/mutex.js +39 -12
- package/lib/util/name-generator.js +1331 -1331
- package/lib/util/promback.js +8 -10
- package/lib/util/readYamlFile.d.ts +1 -1
- package/lib/util/readYamlFile.js +1 -1
- package/lib/util/requestAssertions.js +34 -34
- package/lib/util/safeObject.js +5 -5
- package/lib/util/stackTrace.js +20 -22
- package/lib/util/wildcard.js +15 -15
- package/package.json +6 -6
- package/npm-shrinkwrap.json +0 -19422
|
@@ -19,22 +19,21 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
validator = require('validator');
|
|
24
|
+
const kerror = require("../../../kerror").wrap("validation", "assert"),
|
|
25
|
+
BaseType = require("../baseType"),
|
|
26
|
+
validator = require("validator");
|
|
28
27
|
|
|
29
28
|
/**
|
|
30
29
|
* @class EmailType
|
|
31
30
|
*/
|
|
32
31
|
class EmailType extends BaseType {
|
|
33
|
-
constructor
|
|
32
|
+
constructor() {
|
|
34
33
|
super();
|
|
35
|
-
this.typeName =
|
|
34
|
+
this.typeName = "email";
|
|
36
35
|
this.allowChildren = false;
|
|
37
|
-
this.allowedTypeOptions = [
|
|
36
|
+
this.allowedTypeOptions = ["notEmpty"];
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
/**
|
|
@@ -43,31 +42,31 @@ class EmailType extends BaseType {
|
|
|
43
42
|
* @param {string[]} errorMessages
|
|
44
43
|
* @returns {boolean}
|
|
45
44
|
*/
|
|
46
|
-
validate
|
|
45
|
+
validate(typeOptions, fieldValue, errorMessages) {
|
|
47
46
|
if (fieldValue === undefined || fieldValue === null) {
|
|
48
47
|
if (typeOptions.notEmpty) {
|
|
49
|
-
errorMessages.push(
|
|
48
|
+
errorMessages.push("Field cannot be undefined or null");
|
|
50
49
|
return false;
|
|
51
50
|
}
|
|
52
51
|
|
|
53
52
|
return true;
|
|
54
53
|
}
|
|
55
54
|
|
|
56
|
-
if (typeof fieldValue !==
|
|
57
|
-
errorMessages.push(
|
|
55
|
+
if (typeof fieldValue !== "string") {
|
|
56
|
+
errorMessages.push("The field must be a string.");
|
|
58
57
|
return false;
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
if (fieldValue.length === 0) {
|
|
62
61
|
if (typeOptions.notEmpty === true) {
|
|
63
|
-
errorMessages.push(
|
|
62
|
+
errorMessages.push("The string must not be empty.");
|
|
64
63
|
return false;
|
|
65
64
|
}
|
|
66
65
|
return true;
|
|
67
66
|
}
|
|
68
67
|
|
|
69
|
-
if (!
|
|
70
|
-
errorMessages.push(
|
|
68
|
+
if (!validator.isEmail(fieldValue)) {
|
|
69
|
+
errorMessages.push("The string must be a valid email address.");
|
|
71
70
|
return false;
|
|
72
71
|
}
|
|
73
72
|
|
|
@@ -79,14 +78,12 @@ class EmailType extends BaseType {
|
|
|
79
78
|
* @returns {TypeOptions}
|
|
80
79
|
* @throws {PreconditionError}
|
|
81
80
|
*/
|
|
82
|
-
validateFieldSpecification
|
|
83
|
-
if (!
|
|
81
|
+
validateFieldSpecification(typeOptions) {
|
|
82
|
+
if (!Object.prototype.hasOwnProperty.call(typeOptions, "notEmpty")) {
|
|
84
83
|
typeOptions.notEmpty = false;
|
|
84
|
+
} else if (typeof typeOptions.notEmpty !== "boolean") {
|
|
85
|
+
throw kerror.get("invalid_type", "notEmpty", "boolean");
|
|
85
86
|
}
|
|
86
|
-
else if (typeof typeOptions.notEmpty !== 'boolean') {
|
|
87
|
-
throw kerror.get('invalid_type', 'notEmpty', 'boolean');
|
|
88
|
-
}
|
|
89
|
-
|
|
90
87
|
|
|
91
88
|
return typeOptions;
|
|
92
89
|
}
|
|
@@ -19,21 +19,20 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
BaseType = require('../baseType');
|
|
24
|
+
const kerror = require("../../../kerror"),
|
|
25
|
+
BaseType = require("../baseType");
|
|
27
26
|
|
|
28
27
|
/**
|
|
29
28
|
* @class EnumType
|
|
30
29
|
*/
|
|
31
30
|
class EnumType extends BaseType {
|
|
32
|
-
constructor
|
|
31
|
+
constructor() {
|
|
33
32
|
super();
|
|
34
|
-
this.typeName =
|
|
33
|
+
this.typeName = "enum";
|
|
35
34
|
this.allowChildren = false;
|
|
36
|
-
this.allowedTypeOptions = [
|
|
35
|
+
this.allowedTypeOptions = ["values"];
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
/**
|
|
@@ -42,15 +41,18 @@ class EnumType extends BaseType {
|
|
|
42
41
|
* @param {string[]} errorMessages
|
|
43
42
|
* @returns {boolean}
|
|
44
43
|
*/
|
|
45
|
-
validate
|
|
46
|
-
if (typeof fieldValue !==
|
|
47
|
-
errorMessages.push(
|
|
44
|
+
validate(typeOptions, fieldValue, errorMessages) {
|
|
45
|
+
if (typeof fieldValue !== "string") {
|
|
46
|
+
errorMessages.push("The field must be a string.");
|
|
48
47
|
return false;
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
if (!
|
|
50
|
+
if (!typeOptions.values.includes(fieldValue)) {
|
|
52
51
|
errorMessages.push(
|
|
53
|
-
`The field only accepts following values: "${typeOptions.values.join(
|
|
52
|
+
`The field only accepts following values: "${typeOptions.values.join(
|
|
53
|
+
", "
|
|
54
|
+
)}".`
|
|
55
|
+
);
|
|
54
56
|
return false;
|
|
55
57
|
}
|
|
56
58
|
|
|
@@ -62,22 +64,33 @@ class EnumType extends BaseType {
|
|
|
62
64
|
* @returns {TypeOptions}
|
|
63
65
|
* @throws {PreconditionError}
|
|
64
66
|
*/
|
|
65
|
-
validateFieldSpecification
|
|
66
|
-
if (!
|
|
67
|
-
throw kerror.get(
|
|
67
|
+
validateFieldSpecification(typeOptions) {
|
|
68
|
+
if (!Object.prototype.hasOwnProperty.call(typeOptions, "values")) {
|
|
69
|
+
throw kerror.get("validation", "types", "missing_enum_values");
|
|
68
70
|
}
|
|
69
71
|
|
|
70
|
-
if (!
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
if (!Array.isArray(typeOptions.values) || typeOptions.values.length === 0) {
|
|
73
|
+
throw kerror.get(
|
|
74
|
+
"validation",
|
|
75
|
+
"assert",
|
|
76
|
+
"invalid_type",
|
|
77
|
+
"values",
|
|
78
|
+
"string[]"
|
|
79
|
+
);
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
const nonString = typeOptions.values.filter(
|
|
77
|
-
value => typeof value !==
|
|
83
|
+
(value) => typeof value !== "string"
|
|
84
|
+
);
|
|
78
85
|
|
|
79
86
|
if (nonString.length > 0) {
|
|
80
|
-
throw kerror.get(
|
|
87
|
+
throw kerror.get(
|
|
88
|
+
"validation",
|
|
89
|
+
"assert",
|
|
90
|
+
"invalid_type",
|
|
91
|
+
"values",
|
|
92
|
+
"string[]"
|
|
93
|
+
);
|
|
81
94
|
}
|
|
82
95
|
|
|
83
96
|
return typeOptions;
|
|
@@ -19,18 +19,18 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const BaseType = require(
|
|
25
|
-
const { Koncorde } = require(
|
|
24
|
+
const BaseType = require("../baseType");
|
|
25
|
+
const { Koncorde } = require("../../shared/KoncordeWrapper");
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* @class GeoPointType
|
|
29
29
|
*/
|
|
30
30
|
class GeoPointType extends BaseType {
|
|
31
|
-
constructor
|
|
31
|
+
constructor() {
|
|
32
32
|
super();
|
|
33
|
-
this.typeName =
|
|
33
|
+
this.typeName = "geo_point";
|
|
34
34
|
this.allowChildren = false;
|
|
35
35
|
this.allowedTypeOptions = [];
|
|
36
36
|
}
|
|
@@ -41,9 +41,9 @@ class GeoPointType extends BaseType {
|
|
|
41
41
|
* @param {string[]} errorMessages
|
|
42
42
|
* @returns {boolean}
|
|
43
43
|
*/
|
|
44
|
-
validate
|
|
44
|
+
validate(typeOptions, fieldValue, errorMessages) {
|
|
45
45
|
if (Koncorde.convertGeopoint(fieldValue) === null) {
|
|
46
|
-
errorMessages.push(
|
|
46
|
+
errorMessages.push("Invalid GeoPoint format");
|
|
47
47
|
return false;
|
|
48
48
|
}
|
|
49
49
|
|
|
@@ -19,55 +19,50 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { Koncorde } = require(
|
|
24
|
+
const { Koncorde } = require("koncorde");
|
|
25
25
|
|
|
26
|
-
const kerror = require(
|
|
27
|
-
const BaseType = require(
|
|
26
|
+
const kerror = require("../../../kerror");
|
|
27
|
+
const BaseType = require("../baseType");
|
|
28
28
|
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
'geometries'
|
|
29
|
+
const allowedShapeProperties = [
|
|
30
|
+
"type",
|
|
31
|
+
"coordinates",
|
|
32
|
+
"radius",
|
|
33
|
+
"orientation",
|
|
34
|
+
"geometries",
|
|
36
35
|
],
|
|
37
36
|
allowedOrientations = [
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
],
|
|
45
|
-
multiTypes = [
|
|
46
|
-
'multipoint',
|
|
47
|
-
'multilinestring',
|
|
48
|
-
'multipolygon'
|
|
37
|
+
"right",
|
|
38
|
+
"ccw",
|
|
39
|
+
"counterclockwise",
|
|
40
|
+
"left",
|
|
41
|
+
"cw",
|
|
42
|
+
"clockwise",
|
|
49
43
|
],
|
|
44
|
+
multiTypes = ["multipoint", "multilinestring", "multipolygon"],
|
|
50
45
|
allowedShapeTypes = [
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
46
|
+
"point",
|
|
47
|
+
"linestring",
|
|
48
|
+
"polygon",
|
|
49
|
+
"multipoint",
|
|
50
|
+
"multilinestring",
|
|
51
|
+
"multipolygon",
|
|
52
|
+
"geometrycollection",
|
|
53
|
+
"envelope",
|
|
54
|
+
"circle",
|
|
60
55
|
];
|
|
61
56
|
|
|
62
57
|
/**
|
|
63
58
|
* @class GeoShapeType
|
|
64
59
|
*/
|
|
65
60
|
class GeoShapeType extends BaseType {
|
|
66
|
-
constructor
|
|
61
|
+
constructor() {
|
|
67
62
|
super();
|
|
68
|
-
this.typeName =
|
|
63
|
+
this.typeName = "geo_shape";
|
|
69
64
|
this.allowChildren = false;
|
|
70
|
-
this.allowedTypeOptions = [
|
|
65
|
+
this.allowedTypeOptions = ["shapeTypes"];
|
|
71
66
|
}
|
|
72
67
|
|
|
73
68
|
/**
|
|
@@ -76,7 +71,7 @@ class GeoShapeType extends BaseType {
|
|
|
76
71
|
* @param {string[]} errorMessages
|
|
77
72
|
* @returns {boolean}
|
|
78
73
|
*/
|
|
79
|
-
validate
|
|
74
|
+
validate(typeOptions, fieldValue, errorMessages) {
|
|
80
75
|
return this.recursiveShapeValidation(
|
|
81
76
|
typeOptions.shapeTypes,
|
|
82
77
|
fieldValue,
|
|
@@ -90,67 +85,67 @@ class GeoShapeType extends BaseType {
|
|
|
90
85
|
* @param {string[]} errorMessages
|
|
91
86
|
* @returns {boolean}
|
|
92
87
|
*/
|
|
93
|
-
recursiveShapeValidation
|
|
94
|
-
if (!
|
|
88
|
+
recursiveShapeValidation(allowedShapes, shape, errorMessages) {
|
|
89
|
+
if (!this.checkStructure(allowedShapes, shape, errorMessages)) {
|
|
95
90
|
return false;
|
|
96
91
|
}
|
|
97
92
|
|
|
98
93
|
const isMulti = multiTypes.indexOf(shape.type) !== -1;
|
|
99
|
-
let
|
|
100
|
-
coordinateValidation,
|
|
94
|
+
let coordinateValidation,
|
|
101
95
|
result = true;
|
|
102
96
|
|
|
103
97
|
switch (shape.type) {
|
|
104
|
-
case
|
|
105
|
-
case
|
|
98
|
+
case "point":
|
|
99
|
+
case "multipoint":
|
|
106
100
|
coordinateValidation = isPoint;
|
|
107
101
|
break;
|
|
108
|
-
case
|
|
109
|
-
case
|
|
102
|
+
case "linestring":
|
|
103
|
+
case "multilinestring":
|
|
110
104
|
coordinateValidation = isLine;
|
|
111
105
|
break;
|
|
112
|
-
case
|
|
113
|
-
case
|
|
106
|
+
case "polygon":
|
|
107
|
+
case "multipolygon":
|
|
114
108
|
coordinateValidation = isPolygon;
|
|
115
|
-
if (
|
|
116
|
-
|
|
109
|
+
if (
|
|
110
|
+
shape.orientation &&
|
|
111
|
+
!allowedOrientations.includes(shape.orientation)
|
|
117
112
|
) {
|
|
118
|
-
errorMessages.push(
|
|
113
|
+
errorMessages.push("The orientation property has not a valid value.");
|
|
119
114
|
result = false;
|
|
120
115
|
}
|
|
121
116
|
break;
|
|
122
|
-
case
|
|
117
|
+
case "geometrycollection":
|
|
123
118
|
coordinateValidation = () => true;
|
|
124
119
|
|
|
125
120
|
for (let i = 0; i < shape.geometries.length; i++) {
|
|
126
|
-
if (
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
121
|
+
if (
|
|
122
|
+
!this.recursiveShapeValidation(
|
|
123
|
+
allowedShapes,
|
|
124
|
+
shape.geometries[i],
|
|
125
|
+
errorMessages
|
|
126
|
+
)
|
|
130
127
|
) {
|
|
131
128
|
result = false;
|
|
132
129
|
}
|
|
133
130
|
}
|
|
134
131
|
break;
|
|
135
|
-
case
|
|
132
|
+
case "envelope":
|
|
136
133
|
coordinateValidation = isEnvelope;
|
|
137
134
|
break;
|
|
138
|
-
case
|
|
135
|
+
case "circle":
|
|
139
136
|
coordinateValidation = isPoint;
|
|
140
|
-
if (typeof shape.radius ===
|
|
137
|
+
if (typeof shape.radius === "string") {
|
|
141
138
|
try {
|
|
142
|
-
if (typeof Koncorde.convertDistance(shape.radius) !==
|
|
143
|
-
errorMessages.push(
|
|
139
|
+
if (typeof Koncorde.convertDistance(shape.radius) !== "number") {
|
|
140
|
+
errorMessages.push("The radius property has not a valid format.");
|
|
144
141
|
result = false;
|
|
145
142
|
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
errorMessages.push('The radius property has not a valid format.');
|
|
143
|
+
} catch (error) {
|
|
144
|
+
errorMessages.push("The radius property has not a valid format.");
|
|
149
145
|
result = false;
|
|
150
146
|
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
errorMessages.push('The radius property has not a valid format.');
|
|
147
|
+
} else if (typeof shape.radius !== "number") {
|
|
148
|
+
errorMessages.push("The radius property has not a valid format.");
|
|
154
149
|
result = false;
|
|
155
150
|
}
|
|
156
151
|
break;
|
|
@@ -162,16 +157,17 @@ class GeoShapeType extends BaseType {
|
|
|
162
157
|
}
|
|
163
158
|
|
|
164
159
|
if (isMulti) {
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
|
|
160
|
+
if (
|
|
161
|
+
shape.coordinates.some(
|
|
162
|
+
(coordinate) => !coordinateValidation(coordinate)
|
|
163
|
+
)
|
|
164
|
+
) {
|
|
168
165
|
errorMessages.push(
|
|
169
166
|
`One of the shapes in the shape type "${shape.type}" has bad coordinates.`
|
|
170
167
|
);
|
|
171
168
|
result = false;
|
|
172
169
|
}
|
|
173
|
-
}
|
|
174
|
-
else if (! coordinateValidation(shape.coordinates)) {
|
|
170
|
+
} else if (!coordinateValidation(shape.coordinates)) {
|
|
175
171
|
errorMessages.push(`The shape type "${shape.type}" has bad coordinates.`);
|
|
176
172
|
return false;
|
|
177
173
|
}
|
|
@@ -185,63 +181,80 @@ class GeoShapeType extends BaseType {
|
|
|
185
181
|
* @param {string[]} errorMessages
|
|
186
182
|
* @returns {boolean}
|
|
187
183
|
*/
|
|
188
|
-
checkStructure
|
|
184
|
+
checkStructure(allowedShapes, shape, errorMessages) {
|
|
189
185
|
let result = true;
|
|
190
186
|
|
|
191
|
-
if (!
|
|
192
|
-
errorMessages.push(
|
|
187
|
+
if (!shape.type) {
|
|
188
|
+
errorMessages.push("The shape object has no type defined.");
|
|
193
189
|
return false;
|
|
194
190
|
}
|
|
195
191
|
|
|
196
|
-
if (!
|
|
197
|
-
errorMessages.push(
|
|
192
|
+
if (!this.checkAllowedProperties(shape, allowedShapeProperties)) {
|
|
193
|
+
errorMessages.push("The shape object has a not allowed property.");
|
|
198
194
|
result = false;
|
|
199
195
|
}
|
|
200
196
|
|
|
201
197
|
if (allowedShapes.indexOf(shape.type) === -1) {
|
|
202
|
-
errorMessages.push(
|
|
198
|
+
errorMessages.push("The provided shape type is not allowed.");
|
|
203
199
|
result = false;
|
|
204
200
|
}
|
|
205
201
|
|
|
206
|
-
if (shape.type ===
|
|
207
|
-
errorMessages.push(
|
|
202
|
+
if (shape.type === "geometrycollection" && shape.coordinates) {
|
|
203
|
+
errorMessages.push(
|
|
204
|
+
'The coordinates property must not be provided for the "geometrycollection" shape type.'
|
|
205
|
+
);
|
|
208
206
|
result = false;
|
|
209
207
|
}
|
|
210
208
|
|
|
211
|
-
if (
|
|
212
|
-
|
|
213
|
-
))
|
|
214
|
-
|
|
209
|
+
if (
|
|
210
|
+
shape.type !== "geometrycollection" &&
|
|
211
|
+
(!shape.coordinates || !Array.isArray(shape.coordinates))
|
|
212
|
+
) {
|
|
213
|
+
errorMessages.push(
|
|
214
|
+
`The coordinates property must be provided for the "${shape.type}" shape type.`
|
|
215
|
+
);
|
|
215
216
|
result = false;
|
|
216
217
|
}
|
|
217
218
|
|
|
218
|
-
if (shape.type ===
|
|
219
|
-
errorMessages.push(
|
|
219
|
+
if (shape.type === "circle" && !shape.radius) {
|
|
220
|
+
errorMessages.push(
|
|
221
|
+
'The radius property is mandatory for the "circle" shape type.'
|
|
222
|
+
);
|
|
220
223
|
result = false;
|
|
221
224
|
}
|
|
222
225
|
|
|
223
|
-
if (shape.type !==
|
|
224
|
-
errorMessages.push(
|
|
226
|
+
if (shape.type !== "circle" && shape.radius) {
|
|
227
|
+
errorMessages.push(
|
|
228
|
+
`The radius property must not be provided for the "${shape.type}" shape type.`
|
|
229
|
+
);
|
|
225
230
|
result = false;
|
|
226
231
|
}
|
|
227
232
|
|
|
228
|
-
if (
|
|
229
|
-
|
|
230
|
-
|
|
233
|
+
if (
|
|
234
|
+
shape.type !== "polygon" &&
|
|
235
|
+
shape.type !== "multipolygon" &&
|
|
236
|
+
shape.orientation
|
|
231
237
|
) {
|
|
232
|
-
errorMessages.push(
|
|
238
|
+
errorMessages.push(
|
|
239
|
+
`The orientation property must not be provided for the "${shape.type}" shape type.`
|
|
240
|
+
);
|
|
233
241
|
result = false;
|
|
234
242
|
}
|
|
235
243
|
|
|
236
|
-
if (shape.type !==
|
|
237
|
-
errorMessages.push(
|
|
244
|
+
if (shape.type !== "geometrycollection" && shape.geometries) {
|
|
245
|
+
errorMessages.push(
|
|
246
|
+
`The geometries property must not be provided for the "${shape.type}" shape type.`
|
|
247
|
+
);
|
|
238
248
|
result = false;
|
|
239
249
|
}
|
|
240
250
|
|
|
241
|
-
if (
|
|
242
|
-
|
|
243
|
-
))
|
|
244
|
-
|
|
251
|
+
if (
|
|
252
|
+
shape.type === "geometrycollection" &&
|
|
253
|
+
(!shape.geometries || !Array.isArray(shape.geometries))
|
|
254
|
+
) {
|
|
255
|
+
errorMessages.push(
|
|
256
|
+
'The geometries property must be provided for the "geometrycollection" shape type.'
|
|
257
|
+
);
|
|
245
258
|
result = false;
|
|
246
259
|
}
|
|
247
260
|
|
|
@@ -253,22 +266,29 @@ class GeoShapeType extends BaseType {
|
|
|
253
266
|
* @returns {TypeOptions}
|
|
254
267
|
* @throws {PreconditionError}
|
|
255
268
|
*/
|
|
256
|
-
validateFieldSpecification
|
|
257
|
-
if (Object.prototype.hasOwnProperty.call(typeOptions,
|
|
258
|
-
if (
|
|
259
|
-
|
|
269
|
+
validateFieldSpecification(typeOptions) {
|
|
270
|
+
if (Object.prototype.hasOwnProperty.call(typeOptions, "shapeTypes")) {
|
|
271
|
+
if (
|
|
272
|
+
!Array.isArray(typeOptions.shapeTypes) ||
|
|
273
|
+
typeOptions.shapeTypes.length === 0
|
|
260
274
|
) {
|
|
261
|
-
throw kerror.get(
|
|
275
|
+
throw kerror.get(
|
|
276
|
+
"validation",
|
|
277
|
+
"assert",
|
|
278
|
+
"invalid_type",
|
|
279
|
+
"shapeTypes",
|
|
280
|
+
"string[]"
|
|
281
|
+
);
|
|
262
282
|
}
|
|
263
283
|
|
|
264
284
|
const invalid = typeOptions.shapeTypes.filter(
|
|
265
|
-
shape => !
|
|
285
|
+
(shape) => !allowedShapeTypes.includes(shape)
|
|
286
|
+
);
|
|
266
287
|
|
|
267
288
|
if (invalid.length > 0) {
|
|
268
|
-
throw kerror.get(
|
|
289
|
+
throw kerror.get("validation", "types", "invalid_geoshape", invalid);
|
|
269
290
|
}
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
291
|
+
} else {
|
|
272
292
|
typeOptions.shapeTypes = allowedShapeTypes;
|
|
273
293
|
}
|
|
274
294
|
|
|
@@ -280,16 +300,17 @@ class GeoShapeType extends BaseType {
|
|
|
280
300
|
* @param {GeoShapePointCoordinates} point
|
|
281
301
|
* @returns {boolean}
|
|
282
302
|
*/
|
|
283
|
-
function isPoint
|
|
284
|
-
if (!
|
|
303
|
+
function isPoint(point) {
|
|
304
|
+
if (!Array.isArray(point) || point.length !== 2) {
|
|
285
305
|
return false;
|
|
286
306
|
}
|
|
287
307
|
|
|
288
|
-
return !
|
|
289
|
-
point[0] < -180
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
308
|
+
return !(
|
|
309
|
+
point[0] < -180 ||
|
|
310
|
+
point[0] > 180 ||
|
|
311
|
+
point[1] < -90 ||
|
|
312
|
+
point[1] > 90
|
|
313
|
+
);
|
|
293
314
|
}
|
|
294
315
|
|
|
295
316
|
/**
|
|
@@ -297,7 +318,7 @@ function isPoint (point) {
|
|
|
297
318
|
* @param {GeoShapePointCoordinates} pointB
|
|
298
319
|
* @returns {boolean}
|
|
299
320
|
*/
|
|
300
|
-
function isPointEqual
|
|
321
|
+
function isPointEqual(pointA, pointB) {
|
|
301
322
|
return pointA[0] === pointB[0] && pointA[1] === pointB[1];
|
|
302
323
|
}
|
|
303
324
|
|
|
@@ -305,39 +326,41 @@ function isPointEqual (pointA, pointB) {
|
|
|
305
326
|
* @param {GeoShapeLineCoordinates} line
|
|
306
327
|
* @returns {boolean}
|
|
307
328
|
*/
|
|
308
|
-
function isLine
|
|
309
|
-
if (!
|
|
329
|
+
function isLine(line) {
|
|
330
|
+
if (!Array.isArray(line) || line.length < 2) {
|
|
310
331
|
return false;
|
|
311
332
|
}
|
|
312
333
|
|
|
313
|
-
return line.every(point => isPoint(point));
|
|
334
|
+
return line.every((point) => isPoint(point));
|
|
314
335
|
}
|
|
315
336
|
|
|
316
337
|
/**
|
|
317
338
|
* @param {GeoShapePolygonPart} polygonPart
|
|
318
339
|
* @returns {boolean}
|
|
319
340
|
*/
|
|
320
|
-
function isPolygonPart
|
|
321
|
-
return
|
|
322
|
-
|
|
323
|
-
&&
|
|
324
|
-
|
|
341
|
+
function isPolygonPart(polygonPart) {
|
|
342
|
+
return (
|
|
343
|
+
Array.isArray(polygonPart) &&
|
|
344
|
+
polygonPart.length >= 4 &&
|
|
345
|
+
isLine(polygonPart) &&
|
|
346
|
+
isPointEqual(polygonPart[0], polygonPart[polygonPart.length - 1])
|
|
347
|
+
);
|
|
325
348
|
}
|
|
326
349
|
|
|
327
350
|
/**
|
|
328
351
|
* @param {GeoShapePolygon} polygon
|
|
329
352
|
* @returns {boolean}
|
|
330
353
|
*/
|
|
331
|
-
function isPolygon
|
|
332
|
-
if (!
|
|
354
|
+
function isPolygon(polygon) {
|
|
355
|
+
if (!Array.isArray(polygon)) {
|
|
333
356
|
return false;
|
|
334
357
|
}
|
|
335
358
|
|
|
336
|
-
return polygon.every(polygonPart => isPolygonPart(polygonPart));
|
|
359
|
+
return polygon.every((polygonPart) => isPolygonPart(polygonPart));
|
|
337
360
|
}
|
|
338
361
|
|
|
339
|
-
function isEnvelope
|
|
340
|
-
if (!
|
|
362
|
+
function isEnvelope(envelope) {
|
|
363
|
+
if (!Array.isArray(envelope) || envelope.length !== 2) {
|
|
341
364
|
return false;
|
|
342
365
|
}
|
|
343
366
|
|