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,26 +19,26 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const Bluebird = require(
|
|
24
|
+
const Bluebird = require("bluebird");
|
|
25
25
|
|
|
26
|
-
const kerror = require(
|
|
27
|
-
const { get } = require(
|
|
26
|
+
const kerror = require("../../kerror");
|
|
27
|
+
const { get } = require("../../util/safeObject");
|
|
28
28
|
|
|
29
|
-
const assertionError = kerror.wrap(
|
|
29
|
+
const assertionError = kerror.wrap("api", "assert");
|
|
30
30
|
|
|
31
31
|
// Base class for all controllers
|
|
32
32
|
class BaseController {
|
|
33
|
-
constructor
|
|
33
|
+
constructor() {
|
|
34
34
|
this.__actions = new Set();
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
get _actions
|
|
37
|
+
get _actions() {
|
|
38
38
|
return this.__actions;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
_addAction
|
|
41
|
+
_addAction(name, fn) {
|
|
42
42
|
this.__actions.add(name);
|
|
43
43
|
this[name] = fn;
|
|
44
44
|
}
|
|
@@ -51,13 +51,13 @@ class BaseController {
|
|
|
51
51
|
* @param {string} name
|
|
52
52
|
* @returns {boolean}
|
|
53
53
|
*/
|
|
54
|
-
_isAction
|
|
54
|
+
_isAction(name) {
|
|
55
55
|
return this.__actions.has(name);
|
|
56
56
|
}
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
class NativeController extends BaseController {
|
|
60
|
-
constructor
|
|
60
|
+
constructor(actions = []) {
|
|
61
61
|
super();
|
|
62
62
|
|
|
63
63
|
this.ask = global.kuzzle.ask.bind(global.kuzzle);
|
|
@@ -72,38 +72,37 @@ class NativeController extends BaseController {
|
|
|
72
72
|
*
|
|
73
73
|
* @returns {Promise}
|
|
74
74
|
*/
|
|
75
|
-
init
|
|
75
|
+
init() {
|
|
76
76
|
return Bluebird.resolve();
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
async translateKoncorde
|
|
79
|
+
async translateKoncorde(koncordeFilters) {
|
|
80
80
|
if (Object.keys(koncordeFilters).length === 0) {
|
|
81
81
|
return {};
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
if (typeof koncordeFilters !==
|
|
85
|
-
throw assertionError.get(
|
|
84
|
+
if (typeof koncordeFilters !== "object") {
|
|
85
|
+
throw assertionError.get("invalid_type", "body.query", "object");
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
try {
|
|
89
89
|
global.kuzzle.koncorde.validate(koncordeFilters);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
throw assertionError.getFrom(error, 'koncorde_dsl_error', error.message);
|
|
90
|
+
} catch (error) {
|
|
91
|
+
throw assertionError.getFrom(error, "koncorde_dsl_error", error.message);
|
|
93
92
|
}
|
|
94
93
|
|
|
95
94
|
try {
|
|
96
|
-
return await this.ask(
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
if (! error.keyword) {
|
|
95
|
+
return await this.ask("core:storage:public:translate", koncordeFilters);
|
|
96
|
+
} catch (error) {
|
|
97
|
+
if (!error.keyword) {
|
|
100
98
|
throw error;
|
|
101
99
|
}
|
|
102
100
|
|
|
103
101
|
throw assertionError.get(
|
|
104
|
-
|
|
102
|
+
"koncorde_restricted_keyword",
|
|
105
103
|
error.keyword.type,
|
|
106
|
-
error.keyword.name
|
|
104
|
+
error.keyword.name
|
|
105
|
+
);
|
|
107
106
|
}
|
|
108
107
|
}
|
|
109
108
|
|
|
@@ -113,11 +112,11 @@ class NativeController extends BaseController {
|
|
|
113
112
|
* @param {Request} request
|
|
114
113
|
* @param {...any} paths
|
|
115
114
|
*/
|
|
116
|
-
assertBodyHasNotAttributes
|
|
115
|
+
assertBodyHasNotAttributes(request, ...paths) {
|
|
117
116
|
if (request.input.body !== null) {
|
|
118
117
|
for (const path of paths) {
|
|
119
118
|
if (get(request.input.body, path)) {
|
|
120
|
-
throw assertionError.get(
|
|
119
|
+
throw assertionError.get("forbidden_argument", `body.${path}`);
|
|
121
120
|
}
|
|
122
121
|
}
|
|
123
122
|
}
|
|
@@ -129,9 +128,9 @@ class NativeController extends BaseController {
|
|
|
129
128
|
* @todo move this method in some kind of "Security" class
|
|
130
129
|
* @param {String} strategy
|
|
131
130
|
*/
|
|
132
|
-
assertIsStrategyRegistered
|
|
133
|
-
if (!
|
|
134
|
-
throw kerror.get(
|
|
131
|
+
assertIsStrategyRegistered(strategy) {
|
|
132
|
+
if (!global.kuzzle.pluginsManager.listStrategies().includes(strategy)) {
|
|
133
|
+
throw kerror.get("security", "credentials", "unknown_strategy", strategy);
|
|
135
134
|
}
|
|
136
135
|
}
|
|
137
136
|
|
|
@@ -140,36 +139,63 @@ class NativeController extends BaseController {
|
|
|
140
139
|
* - missing properties
|
|
141
140
|
* - invalid types
|
|
142
141
|
* - unauthorized values
|
|
143
|
-
*
|
|
142
|
+
*
|
|
144
143
|
* @param {Array<{index:string, collections?: string[]}>} targets Array of targets
|
|
145
144
|
* @param {*} options
|
|
146
145
|
*/
|
|
147
|
-
assertTargetsAreValid
|
|
146
|
+
assertTargetsAreValid(targets, { allowEmptyCollections } = {}) {
|
|
148
147
|
for (let i = 0; i < targets.length; i++) {
|
|
149
148
|
const target = targets[i];
|
|
150
149
|
|
|
151
|
-
if (!
|
|
152
|
-
throw kerror.get(
|
|
150
|
+
if (!target.index) {
|
|
151
|
+
throw kerror.get(
|
|
152
|
+
"api",
|
|
153
|
+
"assert",
|
|
154
|
+
"missing_argument",
|
|
155
|
+
`targets[${i}].index`
|
|
156
|
+
);
|
|
153
157
|
}
|
|
154
158
|
if (this._hasMultiTargets(target.index)) {
|
|
155
|
-
throw kerror.get(
|
|
159
|
+
throw kerror.get(
|
|
160
|
+
"services",
|
|
161
|
+
"storage",
|
|
162
|
+
"invalid_target_format",
|
|
163
|
+
`targets[${i}].index`,
|
|
164
|
+
target.index
|
|
165
|
+
);
|
|
156
166
|
}
|
|
157
167
|
|
|
158
|
-
if (!
|
|
159
|
-
throw kerror.get(
|
|
168
|
+
if (!allowEmptyCollections && !target.collections) {
|
|
169
|
+
throw kerror.get(
|
|
170
|
+
"api",
|
|
171
|
+
"assert",
|
|
172
|
+
"missing_argument",
|
|
173
|
+
`targets[${i}].collections`
|
|
174
|
+
);
|
|
160
175
|
}
|
|
161
176
|
|
|
162
|
-
if (target.collections && !
|
|
163
|
-
throw kerror.get(
|
|
177
|
+
if (target.collections && !Array.isArray(target.collections)) {
|
|
178
|
+
throw kerror.get(
|
|
179
|
+
"api",
|
|
180
|
+
"assert",
|
|
181
|
+
"invalid_type",
|
|
182
|
+
`targets[${i}].collections`,
|
|
183
|
+
"array"
|
|
184
|
+
);
|
|
164
185
|
}
|
|
165
186
|
|
|
166
|
-
if (!
|
|
167
|
-
throw kerror.get(
|
|
187
|
+
if (!allowEmptyCollections && target.collections.length === 0) {
|
|
188
|
+
throw kerror.get(
|
|
189
|
+
"api",
|
|
190
|
+
"assert",
|
|
191
|
+
"empty_argument",
|
|
192
|
+
`targets[${i}].collections`
|
|
193
|
+
);
|
|
168
194
|
}
|
|
169
195
|
|
|
170
|
-
if (
|
|
171
|
-
&&
|
|
172
|
-
|
|
196
|
+
if (
|
|
197
|
+
allowEmptyCollections &&
|
|
198
|
+
(!target.collections || target.collections.length === 0)
|
|
173
199
|
) {
|
|
174
200
|
continue;
|
|
175
201
|
}
|
|
@@ -177,19 +203,31 @@ class NativeController extends BaseController {
|
|
|
177
203
|
for (let j = 0; j < target.collections.length; j++) {
|
|
178
204
|
const collection = target.collections[j];
|
|
179
205
|
|
|
180
|
-
if (typeof collection !==
|
|
181
|
-
throw kerror.get(
|
|
206
|
+
if (typeof collection !== "string") {
|
|
207
|
+
throw kerror.get(
|
|
208
|
+
"api",
|
|
209
|
+
"assert",
|
|
210
|
+
"invalid_type",
|
|
211
|
+
`targets[${i}].collections[${j}]`,
|
|
212
|
+
"string"
|
|
213
|
+
);
|
|
182
214
|
}
|
|
183
215
|
|
|
184
216
|
if (this._hasMultiTargets(collection)) {
|
|
185
|
-
throw kerror.get(
|
|
217
|
+
throw kerror.get(
|
|
218
|
+
"services",
|
|
219
|
+
"storage",
|
|
220
|
+
"invalid_target_format",
|
|
221
|
+
`targets[${i}].collections[${j}]`,
|
|
222
|
+
collection
|
|
223
|
+
);
|
|
186
224
|
}
|
|
187
225
|
}
|
|
188
226
|
}
|
|
189
227
|
}
|
|
190
228
|
|
|
191
|
-
_hasMultiTargets
|
|
192
|
-
return [
|
|
229
|
+
_hasMultiTargets(str) {
|
|
230
|
+
return [",", "*", "+"].some((chr) => str.includes(chr)) || str === "_all";
|
|
193
231
|
}
|
|
194
232
|
|
|
195
233
|
/**
|
|
@@ -198,11 +236,11 @@ class NativeController extends BaseController {
|
|
|
198
236
|
* @param {Number} asked
|
|
199
237
|
* @throws
|
|
200
238
|
*/
|
|
201
|
-
assertNotExceedMaxFetch
|
|
239
|
+
assertNotExceedMaxFetch(asked) {
|
|
202
240
|
const limit = global.kuzzle.config.limits.documentsFetchCount;
|
|
203
241
|
|
|
204
242
|
if (asked > limit) {
|
|
205
|
-
throw kerror.get(
|
|
243
|
+
throw kerror.get("services", "storage", "get_limit_exceeded");
|
|
206
244
|
}
|
|
207
245
|
}
|
|
208
246
|
|
|
@@ -212,11 +250,11 @@ class NativeController extends BaseController {
|
|
|
212
250
|
* @param {Number} asked
|
|
213
251
|
* @throws
|
|
214
252
|
*/
|
|
215
|
-
assertNotExceedMaxWrite
|
|
253
|
+
assertNotExceedMaxWrite(asked) {
|
|
216
254
|
const limit = global.kuzzle.config.limits.documentsWriteCount;
|
|
217
255
|
|
|
218
256
|
if (asked > limit) {
|
|
219
|
-
throw kerror.get(
|
|
257
|
+
throw kerror.get("services", "storage", "write_limit_exceeded");
|
|
220
258
|
}
|
|
221
259
|
}
|
|
222
260
|
}
|
|
@@ -19,24 +19,18 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { NativeController } = require(
|
|
25
|
-
const actionEnum = require(
|
|
26
|
-
const kerror = require(
|
|
24
|
+
const { NativeController } = require("./baseController");
|
|
25
|
+
const actionEnum = require("../../core/realtime/actionEnum");
|
|
26
|
+
const kerror = require("../../kerror");
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
29
|
* @class BulkController
|
|
30
30
|
*/
|
|
31
31
|
class BulkController extends NativeController {
|
|
32
|
-
constructor
|
|
33
|
-
super([
|
|
34
|
-
'import',
|
|
35
|
-
'write',
|
|
36
|
-
'mWrite',
|
|
37
|
-
'deleteByQuery',
|
|
38
|
-
'updateByQuery',
|
|
39
|
-
]);
|
|
32
|
+
constructor() {
|
|
33
|
+
super(["import", "write", "mWrite", "deleteByQuery", "updateByQuery"]);
|
|
40
34
|
}
|
|
41
35
|
|
|
42
36
|
/**
|
|
@@ -45,109 +39,126 @@ class BulkController extends NativeController {
|
|
|
45
39
|
* @param {Request} request
|
|
46
40
|
* @returns {Promise}
|
|
47
41
|
*/
|
|
48
|
-
async import
|
|
42
|
+
async import(request) {
|
|
49
43
|
const userId = request.getKuid();
|
|
50
44
|
const { index, collection } = request.getIndexAndCollection();
|
|
51
|
-
const strict = request.getBoolean(
|
|
45
|
+
const strict = request.getBoolean("strict");
|
|
52
46
|
const refresh = request.getRefresh();
|
|
53
|
-
const bulkData = request.getBodyArray(
|
|
47
|
+
const bulkData = request.getBodyArray("bulkData");
|
|
54
48
|
const options = {
|
|
55
49
|
refresh,
|
|
56
|
-
userId
|
|
50
|
+
userId,
|
|
57
51
|
};
|
|
58
52
|
|
|
59
53
|
const { items, errors } = await this.ask(
|
|
60
|
-
|
|
54
|
+
"core:storage:public:document:bulk",
|
|
61
55
|
index,
|
|
62
56
|
collection,
|
|
63
57
|
bulkData,
|
|
64
|
-
options
|
|
58
|
+
options
|
|
59
|
+
);
|
|
65
60
|
|
|
66
61
|
if (strict && errors.length) {
|
|
67
|
-
throw kerror.get(
|
|
62
|
+
throw kerror.get(
|
|
63
|
+
"api",
|
|
64
|
+
"process",
|
|
65
|
+
"incomplete_multiple_request",
|
|
66
|
+
"import",
|
|
67
|
+
errors
|
|
68
|
+
);
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
// @todo next major release: if (successes.length === 0) then throw (no matter strict value)
|
|
71
72
|
|
|
72
73
|
return {
|
|
73
74
|
errors,
|
|
74
|
-
successes: items
|
|
75
|
+
successes: items,
|
|
75
76
|
};
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
/**
|
|
79
80
|
* Write a document without adding metadata or performing data validation.
|
|
80
81
|
*/
|
|
81
|
-
async write
|
|
82
|
+
async write(request) {
|
|
82
83
|
const { index, collection } = request.getIndexAndCollection();
|
|
83
|
-
const id = request.getId({ ifMissing:
|
|
84
|
+
const id = request.getId({ ifMissing: "ignore" });
|
|
84
85
|
const content = request.getBody();
|
|
85
86
|
const refresh = request.getRefresh();
|
|
86
|
-
const notify = request.getBoolean(
|
|
87
|
+
const notify = request.getBoolean("notify");
|
|
87
88
|
|
|
88
89
|
const result = await this.ask(
|
|
89
|
-
|
|
90
|
+
"core:storage:public:document:createOrReplace",
|
|
90
91
|
index,
|
|
91
92
|
collection,
|
|
92
93
|
id,
|
|
93
94
|
content,
|
|
94
|
-
{ injectKuzzleMeta: false, refresh }
|
|
95
|
+
{ injectKuzzleMeta: false, refresh }
|
|
96
|
+
);
|
|
95
97
|
|
|
96
98
|
if (notify) {
|
|
97
99
|
await this.ask(
|
|
98
|
-
|
|
100
|
+
"core:realtime:document:notify",
|
|
99
101
|
request,
|
|
100
102
|
actionEnum.WRITE,
|
|
101
|
-
result
|
|
103
|
+
result
|
|
104
|
+
);
|
|
102
105
|
}
|
|
103
106
|
|
|
104
107
|
return {
|
|
105
108
|
_id: result._id,
|
|
106
109
|
_source: result._source,
|
|
107
|
-
_version: result._version
|
|
110
|
+
_version: result._version,
|
|
108
111
|
};
|
|
109
112
|
}
|
|
110
113
|
|
|
111
114
|
/**
|
|
112
115
|
* Write several documents without adding metadata or performing data validation.
|
|
113
116
|
*/
|
|
114
|
-
async mWrite
|
|
117
|
+
async mWrite(request) {
|
|
115
118
|
const { index, collection } = request.getIndexAndCollection();
|
|
116
|
-
const documents = request.getBodyArray(
|
|
117
|
-
const strict = request.getBoolean(
|
|
119
|
+
const documents = request.getBodyArray("documents");
|
|
120
|
+
const strict = request.getBoolean("strict");
|
|
118
121
|
const refresh = request.getRefresh();
|
|
119
|
-
const notify = request.getBoolean(
|
|
122
|
+
const notify = request.getBoolean("notify");
|
|
120
123
|
|
|
121
124
|
const { items, errors } = await this.ask(
|
|
122
|
-
|
|
125
|
+
"core:storage:public:document:mCreateOrReplace",
|
|
123
126
|
index,
|
|
124
127
|
collection,
|
|
125
128
|
documents,
|
|
126
|
-
{ injectKuzzleMeta: false, limits: false, refresh }
|
|
129
|
+
{ injectKuzzleMeta: false, limits: false, refresh }
|
|
130
|
+
);
|
|
127
131
|
|
|
128
132
|
if (strict && errors.length) {
|
|
129
|
-
throw kerror.get(
|
|
133
|
+
throw kerror.get(
|
|
134
|
+
"api",
|
|
135
|
+
"process",
|
|
136
|
+
"incomplete_multiple_request",
|
|
137
|
+
"write",
|
|
138
|
+
errors
|
|
139
|
+
);
|
|
130
140
|
}
|
|
131
141
|
|
|
132
142
|
// @todo next major release: if (successes.length === 0) then throw (no matter strict value)
|
|
133
143
|
|
|
134
144
|
if (notify) {
|
|
135
145
|
await global.kuzzle.ask(
|
|
136
|
-
|
|
146
|
+
"core:realtime:document:mNotify",
|
|
137
147
|
request,
|
|
138
148
|
actionEnum.WRITE,
|
|
139
|
-
items
|
|
149
|
+
items
|
|
150
|
+
);
|
|
140
151
|
}
|
|
141
152
|
|
|
142
|
-
const successes = items.map(item => ({
|
|
153
|
+
const successes = items.map((item) => ({
|
|
143
154
|
_id: item._id,
|
|
144
155
|
_source: item._source,
|
|
145
|
-
_version: item._version
|
|
156
|
+
_version: item._version,
|
|
146
157
|
}));
|
|
147
158
|
|
|
148
159
|
return {
|
|
149
160
|
errors,
|
|
150
|
-
successes
|
|
161
|
+
successes,
|
|
151
162
|
};
|
|
152
163
|
}
|
|
153
164
|
|
|
@@ -157,17 +168,18 @@ class BulkController extends NativeController {
|
|
|
157
168
|
* - fetching deleted documents
|
|
158
169
|
* - triggering realtime notifications
|
|
159
170
|
*/
|
|
160
|
-
async deleteByQuery
|
|
171
|
+
async deleteByQuery(request) {
|
|
161
172
|
const { index, collection } = request.getIndexAndCollection();
|
|
162
|
-
const query = request.getBodyObject(
|
|
173
|
+
const query = request.getBodyObject("query");
|
|
163
174
|
const refresh = request.getRefresh();
|
|
164
175
|
|
|
165
176
|
const { deleted } = await this.ask(
|
|
166
|
-
|
|
177
|
+
"core:storage:public:document:deleteByQuery",
|
|
167
178
|
index,
|
|
168
179
|
collection,
|
|
169
180
|
query,
|
|
170
|
-
{ fetch: false, refresh, size: -1 }
|
|
181
|
+
{ fetch: false, refresh, size: -1 }
|
|
182
|
+
);
|
|
171
183
|
|
|
172
184
|
return { deleted };
|
|
173
185
|
}
|
|
@@ -178,19 +190,20 @@ class BulkController extends NativeController {
|
|
|
178
190
|
* - Injecting Kuzzle metadata
|
|
179
191
|
* - Triggering realtime notifications
|
|
180
192
|
*/
|
|
181
|
-
async updateByQuery
|
|
193
|
+
async updateByQuery(request) {
|
|
182
194
|
const { index, collection } = request.getIndexAndCollection();
|
|
183
|
-
const query = request.getBodyObject(
|
|
184
|
-
const changes = request.getBodyObject(
|
|
195
|
+
const query = request.getBodyObject("query");
|
|
196
|
+
const changes = request.getBodyObject("changes");
|
|
185
197
|
const refresh = request.getRefresh();
|
|
186
198
|
|
|
187
199
|
return this.ask(
|
|
188
|
-
|
|
200
|
+
"core:storage:public:bulk:updateByQuery",
|
|
189
201
|
index,
|
|
190
202
|
collection,
|
|
191
203
|
query,
|
|
192
204
|
changes,
|
|
193
|
-
{ refresh }
|
|
205
|
+
{ refresh }
|
|
206
|
+
);
|
|
194
207
|
}
|
|
195
208
|
}
|
|
196
209
|
|
|
@@ -19,19 +19,17 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const { NativeController } = require(
|
|
24
|
+
const { NativeController } = require("./baseController");
|
|
25
25
|
|
|
26
26
|
class ClusterController extends NativeController {
|
|
27
|
-
constructor
|
|
28
|
-
super([
|
|
29
|
-
'status',
|
|
30
|
-
]);
|
|
27
|
+
constructor() {
|
|
28
|
+
super(["status"]);
|
|
31
29
|
}
|
|
32
30
|
|
|
33
|
-
async status
|
|
34
|
-
return global.kuzzle.ask(
|
|
31
|
+
async status() {
|
|
32
|
+
return global.kuzzle.ask("cluster:status:get");
|
|
35
33
|
}
|
|
36
34
|
}
|
|
37
35
|
|