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,61 +19,61 @@
|
|
|
19
19
|
* limitations under the License.
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
"use strict";
|
|
23
23
|
|
|
24
|
-
const kerror = require(
|
|
25
|
-
const { NativeController } = require(
|
|
26
|
-
const actionEnum = require(
|
|
24
|
+
const kerror = require("../../kerror");
|
|
25
|
+
const { NativeController } = require("./baseController");
|
|
26
|
+
const actionEnum = require("../../core/realtime/actionEnum");
|
|
27
27
|
const {
|
|
28
28
|
assertHasBody,
|
|
29
29
|
assertHasIndexAndCollection,
|
|
30
|
-
} = require(
|
|
31
|
-
const extractFields = require(
|
|
32
|
-
const { dumpCollectionDocuments } = require(
|
|
30
|
+
} = require("../../util/requestAssertions");
|
|
31
|
+
const extractFields = require("../../util/extractFields");
|
|
32
|
+
const { dumpCollectionDocuments } = require("../../util/dump-collection");
|
|
33
33
|
/**
|
|
34
34
|
* @description actions available on the document Controller (used by generic events)
|
|
35
35
|
* @key actions
|
|
36
36
|
* @value event type (empty for actions that are not linked to events)
|
|
37
37
|
*/
|
|
38
38
|
const actions = {
|
|
39
|
-
count:
|
|
40
|
-
create:
|
|
41
|
-
createOrReplace:
|
|
42
|
-
delete:
|
|
43
|
-
deleteByQuery:
|
|
44
|
-
deleteFields:
|
|
45
|
-
exists:
|
|
46
|
-
export:
|
|
47
|
-
get:
|
|
48
|
-
mCreate:
|
|
49
|
-
mCreateOrReplace:
|
|
50
|
-
mDelete:
|
|
51
|
-
mExists:
|
|
52
|
-
mGet:
|
|
53
|
-
mReplace:
|
|
54
|
-
mUpdate:
|
|
55
|
-
mUpsert:
|
|
56
|
-
replace:
|
|
57
|
-
scroll:
|
|
58
|
-
search:
|
|
59
|
-
update:
|
|
60
|
-
updateByQuery:
|
|
61
|
-
upsert:
|
|
62
|
-
validate:
|
|
39
|
+
count: "",
|
|
40
|
+
create: "write",
|
|
41
|
+
createOrReplace: "write",
|
|
42
|
+
delete: "delete",
|
|
43
|
+
deleteByQuery: "delete",
|
|
44
|
+
deleteFields: "update",
|
|
45
|
+
exists: "get",
|
|
46
|
+
export: "get",
|
|
47
|
+
get: "get",
|
|
48
|
+
mCreate: "write",
|
|
49
|
+
mCreateOrReplace: "write",
|
|
50
|
+
mDelete: "delete",
|
|
51
|
+
mExists: "get",
|
|
52
|
+
mGet: "get",
|
|
53
|
+
mReplace: "write",
|
|
54
|
+
mUpdate: "update",
|
|
55
|
+
mUpsert: "update",
|
|
56
|
+
replace: "write",
|
|
57
|
+
scroll: "",
|
|
58
|
+
search: "get",
|
|
59
|
+
update: "update",
|
|
60
|
+
updateByQuery: "update",
|
|
61
|
+
upsert: "update",
|
|
62
|
+
validate: "",
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
/**
|
|
66
66
|
* @class DocumentController
|
|
67
67
|
*/
|
|
68
68
|
class DocumentController extends NativeController {
|
|
69
|
-
constructor
|
|
69
|
+
constructor() {
|
|
70
70
|
super(Object.keys(actions));
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
74
|
* @returns {Record<string, unknown>}
|
|
75
75
|
*/
|
|
76
|
-
static get actions
|
|
76
|
+
static get actions() {
|
|
77
77
|
return actions;
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -81,26 +81,32 @@ class DocumentController extends NativeController {
|
|
|
81
81
|
* @param {Request} request
|
|
82
82
|
* @returns {Promise<Object>}
|
|
83
83
|
*/
|
|
84
|
-
async search
|
|
84
|
+
async search(request) {
|
|
85
85
|
const { from, size, scrollTTL, searchBody } = request.getSearchParams();
|
|
86
86
|
const index = request.getIndex({ required: false });
|
|
87
87
|
const collection = request.getCollection({ required: false });
|
|
88
|
-
const targets = request.getArray(
|
|
88
|
+
const targets = request.getArray("targets", []);
|
|
89
89
|
const lang = request.getLangParam();
|
|
90
90
|
|
|
91
|
-
if ( !
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
91
|
+
if (!index && !collection && (!targets || targets.length === 0)) {
|
|
92
|
+
throw kerror.get(
|
|
93
|
+
"api",
|
|
94
|
+
"assert",
|
|
95
|
+
"missing_argument",
|
|
96
|
+
"index, collection or targets"
|
|
97
|
+
);
|
|
96
98
|
}
|
|
97
99
|
|
|
98
|
-
if (
|
|
99
|
-
&&
|
|
100
|
-
&&
|
|
101
|
-
|
|
100
|
+
if (
|
|
101
|
+
index &&
|
|
102
|
+
collection &&
|
|
103
|
+
(hasMultiTargets(index) || hasMultiTargets(collection))
|
|
102
104
|
) {
|
|
103
|
-
throw kerror.get(
|
|
105
|
+
throw kerror.get(
|
|
106
|
+
"services",
|
|
107
|
+
"storage",
|
|
108
|
+
"invalid_multi_index_collection_usage"
|
|
109
|
+
);
|
|
104
110
|
}
|
|
105
111
|
|
|
106
112
|
if (targets.length > 0) {
|
|
@@ -112,25 +118,26 @@ class DocumentController extends NativeController {
|
|
|
112
118
|
|
|
113
119
|
this.assertNotExceedMaxFetch(size - from);
|
|
114
120
|
|
|
115
|
-
if (lang ===
|
|
121
|
+
if (lang === "koncorde") {
|
|
116
122
|
searchBody.query = await this.translateKoncorde(searchBody.query || {});
|
|
117
123
|
}
|
|
118
124
|
|
|
119
125
|
let result;
|
|
120
126
|
if (targets.length > 0) {
|
|
121
127
|
result = await this.ask(
|
|
122
|
-
|
|
128
|
+
"core:storage:public:document:multiSearch",
|
|
123
129
|
targets,
|
|
124
130
|
searchBody,
|
|
125
|
-
{ from, scroll: scrollTTL, size }
|
|
126
|
-
|
|
127
|
-
else {
|
|
131
|
+
{ from, scroll: scrollTTL, size }
|
|
132
|
+
);
|
|
133
|
+
} else {
|
|
128
134
|
result = await this.ask(
|
|
129
|
-
|
|
135
|
+
"core:storage:public:document:search",
|
|
130
136
|
index,
|
|
131
137
|
collection,
|
|
132
138
|
searchBody,
|
|
133
|
-
{ from, scroll: scrollTTL, size }
|
|
139
|
+
{ from, scroll: scrollTTL, size }
|
|
140
|
+
);
|
|
134
141
|
}
|
|
135
142
|
|
|
136
143
|
return {
|
|
@@ -147,14 +154,15 @@ class DocumentController extends NativeController {
|
|
|
147
154
|
* @param {Request} request
|
|
148
155
|
* @returns {Promise<Object>}
|
|
149
156
|
*/
|
|
150
|
-
async scroll
|
|
157
|
+
async scroll(request) {
|
|
151
158
|
const scrollTTL = request.getScrollTTLParam();
|
|
152
|
-
const _scrollId = request.getString(
|
|
159
|
+
const _scrollId = request.getString("scrollId");
|
|
153
160
|
|
|
154
161
|
const result = await this.ask(
|
|
155
|
-
|
|
162
|
+
"core:storage:public:document:scroll",
|
|
156
163
|
_scrollId,
|
|
157
|
-
{ scrollTTL }
|
|
164
|
+
{ scrollTTL }
|
|
165
|
+
);
|
|
158
166
|
|
|
159
167
|
return {
|
|
160
168
|
hits: result.hits,
|
|
@@ -168,85 +176,99 @@ class DocumentController extends NativeController {
|
|
|
168
176
|
* @param {Request} request
|
|
169
177
|
* @returns {Promise<Boolean>}
|
|
170
178
|
*/
|
|
171
|
-
exists
|
|
179
|
+
exists(request) {
|
|
172
180
|
const id = request.getId();
|
|
173
181
|
const { index, collection } = request.getIndexAndCollection();
|
|
174
182
|
|
|
175
|
-
return this.ask(
|
|
183
|
+
return this.ask(
|
|
184
|
+
"core:storage:public:document:exist",
|
|
185
|
+
index,
|
|
186
|
+
collection,
|
|
187
|
+
id
|
|
188
|
+
);
|
|
176
189
|
}
|
|
177
190
|
|
|
178
191
|
/**
|
|
179
192
|
* @param {Request} request
|
|
180
193
|
*/
|
|
181
|
-
async mExists
|
|
194
|
+
async mExists(request) {
|
|
182
195
|
let ids;
|
|
183
|
-
if (
|
|
184
|
-
|
|
185
|
-
|
|
196
|
+
if (
|
|
197
|
+
request.input.body &&
|
|
198
|
+
request.input.body.ids &&
|
|
199
|
+
Object.keys(request.input.body.ids).length
|
|
186
200
|
) {
|
|
187
|
-
ids = request.getBodyArray(
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
ids = request.getArray('ids');
|
|
201
|
+
ids = request.getBodyArray("ids");
|
|
202
|
+
} else {
|
|
203
|
+
ids = request.getArray("ids");
|
|
191
204
|
}
|
|
192
205
|
const { index, collection } = request.getIndexAndCollection();
|
|
193
206
|
|
|
194
|
-
const strict = request.getBoolean(
|
|
207
|
+
const strict = request.getBoolean("strict");
|
|
195
208
|
this.assertNotExceedMaxFetch(ids.length);
|
|
196
209
|
|
|
197
210
|
const { items, errors } = await this.ask(
|
|
198
|
-
|
|
199
|
-
index,
|
|
200
|
-
|
|
211
|
+
"core:storage:public:document:mExists",
|
|
212
|
+
index,
|
|
213
|
+
collection,
|
|
214
|
+
ids
|
|
215
|
+
);
|
|
201
216
|
|
|
202
217
|
if (strict && errors.length) {
|
|
203
218
|
throw kerror.get(
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
errors
|
|
219
|
+
"api",
|
|
220
|
+
"process",
|
|
221
|
+
"incomplete_multiple_request",
|
|
222
|
+
"get",
|
|
223
|
+
errors
|
|
224
|
+
);
|
|
209
225
|
}
|
|
210
226
|
|
|
211
227
|
return {
|
|
212
228
|
errors,
|
|
213
|
-
successes: items
|
|
229
|
+
successes: items,
|
|
214
230
|
};
|
|
215
231
|
}
|
|
216
232
|
|
|
217
|
-
async export
|
|
233
|
+
async export(request) {
|
|
218
234
|
const { index, collection } = request.getIndexAndCollection();
|
|
219
235
|
const { size, scrollTTL, searchBody } = request.getSearchParams();
|
|
220
|
-
const format = request.getString(
|
|
221
|
-
const fields = request.getBodyArray(
|
|
236
|
+
const format = request.getString("format", "jsonl");
|
|
237
|
+
const fields = request.getBodyArray("fields", []);
|
|
222
238
|
const lang = request.getLangParam();
|
|
223
|
-
const separator = request.getString(
|
|
224
|
-
const fieldsName = request.getBodyObject(
|
|
239
|
+
const separator = request.getString("separator", ",");
|
|
240
|
+
const fieldsName = request.getBodyObject("fieldsName", {});
|
|
225
241
|
|
|
226
242
|
// Remove "fields" and "fieldsName" from searchBody to avoid ES throwing an error
|
|
227
243
|
// since those properties are not allowed in the searchBody
|
|
228
244
|
searchBody.fields = undefined;
|
|
229
245
|
searchBody.fieldsName = undefined;
|
|
230
246
|
|
|
231
|
-
if (request.context.connection.protocol !==
|
|
232
|
-
throw kerror.get(
|
|
247
|
+
if (request.context.connection.protocol !== "http") {
|
|
248
|
+
throw kerror.get(
|
|
249
|
+
"api",
|
|
250
|
+
"assert",
|
|
251
|
+
"unsupported_protocol",
|
|
252
|
+
request.context.connection.protocol,
|
|
253
|
+
"document:export"
|
|
254
|
+
);
|
|
233
255
|
}
|
|
234
256
|
|
|
235
|
-
if (lang ===
|
|
257
|
+
if (lang === "koncorde") {
|
|
236
258
|
searchBody.query = await this.translateKoncorde(searchBody.query || {});
|
|
237
259
|
}
|
|
238
260
|
|
|
239
|
-
let mimeType =
|
|
261
|
+
let mimeType = "html/text";
|
|
240
262
|
|
|
241
|
-
if (format.toLowerCase() ===
|
|
242
|
-
mimeType =
|
|
263
|
+
if (format.toLowerCase() === "csv") {
|
|
264
|
+
mimeType = "text/csv";
|
|
243
265
|
}
|
|
244
266
|
|
|
245
267
|
request.response.configure({
|
|
246
268
|
headers: {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
}
|
|
269
|
+
"Content-Disposition": `attachment; filename="${index}-${collection}.${format}"`,
|
|
270
|
+
"Content-Type": mimeType,
|
|
271
|
+
},
|
|
250
272
|
});
|
|
251
273
|
|
|
252
274
|
return dumpCollectionDocuments(
|
|
@@ -258,25 +280,27 @@ class DocumentController extends NativeController {
|
|
|
258
280
|
{
|
|
259
281
|
fieldsName,
|
|
260
282
|
lang,
|
|
261
|
-
scroll: scrollTTL ||
|
|
283
|
+
scroll: scrollTTL || "5s",
|
|
262
284
|
separator,
|
|
263
285
|
size,
|
|
264
|
-
}
|
|
286
|
+
}
|
|
287
|
+
);
|
|
265
288
|
}
|
|
266
289
|
|
|
267
290
|
/**
|
|
268
291
|
* @param {Request} request
|
|
269
292
|
* @returns {Promise<Object>}
|
|
270
293
|
*/
|
|
271
|
-
async get
|
|
294
|
+
async get(request) {
|
|
272
295
|
const id = request.getId();
|
|
273
296
|
const { index, collection } = request.getIndexAndCollection();
|
|
274
297
|
|
|
275
298
|
const result = await this.ask(
|
|
276
|
-
|
|
299
|
+
"core:storage:public:document:get",
|
|
277
300
|
index,
|
|
278
301
|
collection,
|
|
279
|
-
id
|
|
302
|
+
id
|
|
303
|
+
);
|
|
280
304
|
|
|
281
305
|
return {
|
|
282
306
|
_id: result._id,
|
|
@@ -291,33 +315,44 @@ class DocumentController extends NativeController {
|
|
|
291
315
|
* @param {Request} request
|
|
292
316
|
* @returns {Promise<Object>}
|
|
293
317
|
*/
|
|
294
|
-
async mGet
|
|
318
|
+
async mGet(request) {
|
|
295
319
|
let ids;
|
|
296
|
-
if (
|
|
297
|
-
|
|
298
|
-
|
|
320
|
+
if (
|
|
321
|
+
request.input.body &&
|
|
322
|
+
request.input.body.ids &&
|
|
323
|
+
Object.keys(request.input.body.ids).length
|
|
299
324
|
) {
|
|
300
|
-
ids = request.getBodyArray(
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
ids = request.getArray('ids');
|
|
325
|
+
ids = request.getBodyArray("ids");
|
|
326
|
+
} else {
|
|
327
|
+
ids = request.getArray("ids");
|
|
304
328
|
}
|
|
305
329
|
const { index, collection } = request.getIndexAndCollection();
|
|
306
|
-
const strict = request.getBoolean(
|
|
330
|
+
const strict = request.getBoolean("strict");
|
|
307
331
|
|
|
308
332
|
this.assertNotExceedMaxFetch(ids.length);
|
|
309
333
|
|
|
310
|
-
const { items, errors } = await this.ask(
|
|
334
|
+
const { items, errors } = await this.ask(
|
|
335
|
+
"core:storage:public:document:mGet",
|
|
336
|
+
index,
|
|
337
|
+
collection,
|
|
338
|
+
ids
|
|
339
|
+
);
|
|
311
340
|
|
|
312
341
|
if (strict && errors.length) {
|
|
313
|
-
throw kerror.get(
|
|
342
|
+
throw kerror.get(
|
|
343
|
+
"api",
|
|
344
|
+
"process",
|
|
345
|
+
"incomplete_multiple_request",
|
|
346
|
+
"get",
|
|
347
|
+
errors
|
|
348
|
+
);
|
|
314
349
|
}
|
|
315
350
|
|
|
316
351
|
// @todo next major release: if (successes.length === 0) then throw (no matter strict value)
|
|
317
352
|
|
|
318
353
|
return {
|
|
319
354
|
errors,
|
|
320
|
-
successes: items
|
|
355
|
+
successes: items,
|
|
321
356
|
};
|
|
322
357
|
}
|
|
323
358
|
|
|
@@ -325,15 +360,16 @@ class DocumentController extends NativeController {
|
|
|
325
360
|
* @param {Request} request
|
|
326
361
|
* @returns {Promise<Object>}
|
|
327
362
|
*/
|
|
328
|
-
async count
|
|
363
|
+
async count(request) {
|
|
329
364
|
const { searchBody } = request.getSearchParams();
|
|
330
365
|
const { index, collection } = request.getIndexAndCollection();
|
|
331
366
|
|
|
332
367
|
const count = await this.ask(
|
|
333
|
-
|
|
368
|
+
"core:storage:public:document:count",
|
|
334
369
|
index,
|
|
335
370
|
collection,
|
|
336
|
-
searchBody
|
|
371
|
+
searchBody
|
|
372
|
+
);
|
|
337
373
|
|
|
338
374
|
return { count };
|
|
339
375
|
}
|
|
@@ -344,28 +380,30 @@ class DocumentController extends NativeController {
|
|
|
344
380
|
* @param {KuzzleRequest} request
|
|
345
381
|
* @returns {Promise<Object>}
|
|
346
382
|
*/
|
|
347
|
-
async create
|
|
348
|
-
const id = request.getId({ ifMissing:
|
|
383
|
+
async create(request) {
|
|
384
|
+
const id = request.getId({ ifMissing: "ignore" });
|
|
349
385
|
const userId = request.getKuid();
|
|
350
386
|
const refresh = request.getRefresh();
|
|
351
|
-
const silent = request.getBoolean(
|
|
387
|
+
const silent = request.getBoolean("silent");
|
|
352
388
|
const { index, collection } = request.getIndexAndCollection();
|
|
353
389
|
|
|
354
390
|
const validated = await global.kuzzle.validation.validate(request, false);
|
|
355
391
|
|
|
356
392
|
const created = await this.ask(
|
|
357
|
-
|
|
393
|
+
"core:storage:public:document:create",
|
|
358
394
|
index,
|
|
359
395
|
collection,
|
|
360
396
|
validated.getBody(),
|
|
361
|
-
{ id, refresh, userId }
|
|
397
|
+
{ id, refresh, userId }
|
|
398
|
+
);
|
|
362
399
|
|
|
363
|
-
if (!
|
|
400
|
+
if (!silent) {
|
|
364
401
|
await this.ask(
|
|
365
|
-
|
|
402
|
+
"core:realtime:document:notify",
|
|
366
403
|
validated,
|
|
367
404
|
actionEnum.CREATE,
|
|
368
|
-
created
|
|
405
|
+
created
|
|
406
|
+
);
|
|
369
407
|
}
|
|
370
408
|
|
|
371
409
|
return created;
|
|
@@ -378,8 +416,8 @@ class DocumentController extends NativeController {
|
|
|
378
416
|
* @param {Request} request
|
|
379
417
|
* @returns {Promise<Object>}
|
|
380
418
|
*/
|
|
381
|
-
mCreate
|
|
382
|
-
return this._mChanges(request,
|
|
419
|
+
mCreate(request) {
|
|
420
|
+
return this._mChanges(request, "mCreate", actionEnum.CREATE);
|
|
383
421
|
}
|
|
384
422
|
|
|
385
423
|
/**
|
|
@@ -388,32 +426,35 @@ class DocumentController extends NativeController {
|
|
|
388
426
|
* @param {Request} request
|
|
389
427
|
* @returns {Promise<Object>}
|
|
390
428
|
*/
|
|
391
|
-
async createOrReplace
|
|
429
|
+
async createOrReplace(request) {
|
|
392
430
|
const id = request.getId();
|
|
393
431
|
const content = request.getBody();
|
|
394
432
|
const userId = request.getKuid();
|
|
395
|
-
const silent = request.getBoolean(
|
|
396
|
-
const refresh = request.getString(
|
|
433
|
+
const silent = request.getBoolean("silent");
|
|
434
|
+
const refresh = request.getString("refresh", "false");
|
|
397
435
|
const { index, collection } = request.getIndexAndCollection();
|
|
398
436
|
|
|
399
437
|
const modifiedRequest = await global.kuzzle.validation.validate(
|
|
400
438
|
request,
|
|
401
|
-
false
|
|
439
|
+
false
|
|
440
|
+
);
|
|
402
441
|
|
|
403
442
|
const response = await this.ask(
|
|
404
|
-
|
|
443
|
+
"core:storage:public:document:createOrReplace",
|
|
405
444
|
index,
|
|
406
445
|
collection,
|
|
407
446
|
id,
|
|
408
447
|
content,
|
|
409
|
-
{ refresh, userId }
|
|
448
|
+
{ refresh, userId }
|
|
449
|
+
);
|
|
410
450
|
|
|
411
|
-
if (!
|
|
451
|
+
if (!silent) {
|
|
412
452
|
await this.ask(
|
|
413
|
-
|
|
453
|
+
"core:realtime:document:notify",
|
|
414
454
|
modifiedRequest,
|
|
415
455
|
actionEnum.WRITE,
|
|
416
|
-
response
|
|
456
|
+
response
|
|
457
|
+
);
|
|
417
458
|
}
|
|
418
459
|
|
|
419
460
|
return response;
|
|
@@ -426,8 +467,8 @@ class DocumentController extends NativeController {
|
|
|
426
467
|
* @param {Request} request
|
|
427
468
|
* @returns {Promise<Object>}
|
|
428
469
|
*/
|
|
429
|
-
mCreateOrReplace
|
|
430
|
-
return this._mChanges(request,
|
|
470
|
+
mCreateOrReplace(request) {
|
|
471
|
+
return this._mChanges(request, "mCreateOrReplace", actionEnum.WRITE);
|
|
431
472
|
}
|
|
432
473
|
|
|
433
474
|
/**
|
|
@@ -436,40 +477,45 @@ class DocumentController extends NativeController {
|
|
|
436
477
|
* @param {Request} request
|
|
437
478
|
* @returns {Promise<Object>}
|
|
438
479
|
*/
|
|
439
|
-
async update
|
|
480
|
+
async update(request) {
|
|
440
481
|
const id = request.getId();
|
|
441
482
|
const content = request.getBody();
|
|
442
483
|
const userId = request.getKuid();
|
|
443
|
-
const silent = request.getBoolean(
|
|
444
|
-
const refresh = request.getString(
|
|
484
|
+
const silent = request.getBoolean("silent");
|
|
485
|
+
const refresh = request.getString("refresh", "false");
|
|
445
486
|
const retryOnConflict = request.input.args.retryOnConflict;
|
|
446
|
-
const source = request.getBoolean(
|
|
487
|
+
const source = request.getBoolean("source");
|
|
447
488
|
const { index, collection } = request.getIndexAndCollection();
|
|
448
489
|
|
|
449
490
|
const modifiedRequest = await global.kuzzle.validation.validate(
|
|
450
491
|
request,
|
|
451
|
-
false
|
|
492
|
+
false
|
|
493
|
+
);
|
|
452
494
|
|
|
453
495
|
const updatedDocument = await this.ask(
|
|
454
|
-
|
|
496
|
+
"core:storage:public:document:update",
|
|
455
497
|
index,
|
|
456
498
|
collection,
|
|
457
499
|
id,
|
|
458
500
|
content,
|
|
459
|
-
{ refresh, retryOnConflict, userId }
|
|
501
|
+
{ refresh, retryOnConflict, userId }
|
|
502
|
+
);
|
|
460
503
|
|
|
461
|
-
const _updatedFields = extractFields(content, {
|
|
504
|
+
const _updatedFields = extractFields(content, {
|
|
505
|
+
fieldsToIgnore: ["_kuzzle_info"],
|
|
506
|
+
});
|
|
462
507
|
|
|
463
|
-
if (!
|
|
508
|
+
if (!silent) {
|
|
464
509
|
await this.ask(
|
|
465
|
-
|
|
510
|
+
"core:realtime:document:notify",
|
|
466
511
|
modifiedRequest,
|
|
467
512
|
actionEnum.UPDATE,
|
|
468
513
|
{
|
|
469
514
|
_id: updatedDocument._id,
|
|
470
515
|
_source: updatedDocument._source,
|
|
471
516
|
_updatedFields,
|
|
472
|
-
}
|
|
517
|
+
}
|
|
518
|
+
);
|
|
473
519
|
}
|
|
474
520
|
|
|
475
521
|
if (source) {
|
|
@@ -483,7 +529,6 @@ class DocumentController extends NativeController {
|
|
|
483
529
|
};
|
|
484
530
|
}
|
|
485
531
|
|
|
486
|
-
|
|
487
532
|
/**
|
|
488
533
|
* Applies a partial update to an existing document.
|
|
489
534
|
* If the document doesn't already exist, a new document is created.
|
|
@@ -491,44 +536,48 @@ class DocumentController extends NativeController {
|
|
|
491
536
|
* @param {Request} request
|
|
492
537
|
* @returns {Promise<Object>}
|
|
493
538
|
*/
|
|
494
|
-
async upsert
|
|
539
|
+
async upsert(request) {
|
|
495
540
|
const id = request.getId();
|
|
496
|
-
const content = request.getBodyObject(
|
|
497
|
-
const defaultValues = request.getBodyObject(
|
|
541
|
+
const content = request.getBodyObject("changes");
|
|
542
|
+
const defaultValues = request.getBodyObject("default", {});
|
|
498
543
|
const userId = request.getKuid();
|
|
499
|
-
const silent = request.getBoolean(
|
|
500
|
-
const refresh = request.getString(
|
|
544
|
+
const silent = request.getBoolean("silent");
|
|
545
|
+
const refresh = request.getString("refresh", "false");
|
|
501
546
|
const retryOnConflict = request.input.args.retryOnConflict;
|
|
502
|
-
const source = request.getBoolean(
|
|
547
|
+
const source = request.getBoolean("source");
|
|
503
548
|
const { index, collection } = request.getIndexAndCollection();
|
|
504
549
|
|
|
505
550
|
const updatedDocument = await this.ask(
|
|
506
|
-
|
|
551
|
+
"core:storage:public:document:upsert",
|
|
507
552
|
index,
|
|
508
553
|
collection,
|
|
509
554
|
id,
|
|
510
555
|
content,
|
|
511
|
-
{ defaultValues, refresh, retryOnConflict, userId }
|
|
556
|
+
{ defaultValues, refresh, retryOnConflict, userId }
|
|
557
|
+
);
|
|
512
558
|
|
|
513
|
-
if (!
|
|
559
|
+
if (!silent && updatedDocument.created) {
|
|
514
560
|
await this.ask(
|
|
515
|
-
|
|
561
|
+
"core:realtime:document:notify",
|
|
516
562
|
request,
|
|
517
563
|
actionEnum.CREATE,
|
|
518
|
-
updatedDocument._source
|
|
519
|
-
|
|
520
|
-
else if (!
|
|
521
|
-
const _updatedFields = extractFields(content, {
|
|
564
|
+
updatedDocument._source
|
|
565
|
+
);
|
|
566
|
+
} else if (!silent) {
|
|
567
|
+
const _updatedFields = extractFields(content, {
|
|
568
|
+
fieldsToIgnore: ["_kuzzle_info"],
|
|
569
|
+
});
|
|
522
570
|
|
|
523
571
|
await this.ask(
|
|
524
|
-
|
|
572
|
+
"core:realtime:document:notify",
|
|
525
573
|
request,
|
|
526
574
|
actionEnum.UPDATE,
|
|
527
575
|
{
|
|
528
576
|
_id: updatedDocument._id,
|
|
529
577
|
_source: updatedDocument._source,
|
|
530
578
|
_updatedFields,
|
|
531
|
-
}
|
|
579
|
+
}
|
|
580
|
+
);
|
|
532
581
|
}
|
|
533
582
|
|
|
534
583
|
if (source) {
|
|
@@ -549,8 +598,8 @@ class DocumentController extends NativeController {
|
|
|
549
598
|
* @param {Request} request
|
|
550
599
|
* @returns {Promise<Object>}
|
|
551
600
|
*/
|
|
552
|
-
mUpdate
|
|
553
|
-
return this._mChanges(request,
|
|
601
|
+
mUpdate(request) {
|
|
602
|
+
return this._mChanges(request, "mUpdate", actionEnum.UPDATE);
|
|
554
603
|
}
|
|
555
604
|
|
|
556
605
|
/**
|
|
@@ -560,8 +609,8 @@ class DocumentController extends NativeController {
|
|
|
560
609
|
* @param {Request} request
|
|
561
610
|
* @returns {Promise<Object>}
|
|
562
611
|
*/
|
|
563
|
-
mUpsert
|
|
564
|
-
return this._mChanges(request,
|
|
612
|
+
mUpsert(request) {
|
|
613
|
+
return this._mChanges(request, "mUpsert", actionEnum.UPSERT);
|
|
565
614
|
}
|
|
566
615
|
|
|
567
616
|
/**
|
|
@@ -570,35 +619,38 @@ class DocumentController extends NativeController {
|
|
|
570
619
|
* @param {Request} request
|
|
571
620
|
* @returns {Promise<Object>}
|
|
572
621
|
*/
|
|
573
|
-
async replace
|
|
622
|
+
async replace(request) {
|
|
574
623
|
const id = request.getId();
|
|
575
624
|
const content = request.getBody();
|
|
576
625
|
const userId = request.getKuid();
|
|
577
|
-
const silent = request.getBoolean(
|
|
578
|
-
const refresh = request.getString(
|
|
626
|
+
const silent = request.getBoolean("silent");
|
|
627
|
+
const refresh = request.getString("refresh", "false");
|
|
579
628
|
const { index, collection } = request.getIndexAndCollection();
|
|
580
629
|
|
|
581
630
|
const modifiedRequest = await global.kuzzle.validation.validate(
|
|
582
631
|
request,
|
|
583
|
-
false
|
|
632
|
+
false
|
|
633
|
+
);
|
|
584
634
|
|
|
585
635
|
const response = await this.ask(
|
|
586
|
-
|
|
636
|
+
"core:storage:public:document:replace",
|
|
587
637
|
index,
|
|
588
638
|
collection,
|
|
589
639
|
id,
|
|
590
640
|
content,
|
|
591
|
-
{ refresh, userId }
|
|
641
|
+
{ refresh, userId }
|
|
642
|
+
);
|
|
592
643
|
|
|
593
|
-
if (!
|
|
644
|
+
if (!silent) {
|
|
594
645
|
await this.ask(
|
|
595
|
-
|
|
646
|
+
"core:realtime:document:notify",
|
|
596
647
|
modifiedRequest,
|
|
597
648
|
actionEnum.REPLACE,
|
|
598
649
|
{
|
|
599
650
|
_id: modifiedRequest.input.args._id,
|
|
600
651
|
_source: modifiedRequest.input.body,
|
|
601
|
-
}
|
|
652
|
+
}
|
|
653
|
+
);
|
|
602
654
|
}
|
|
603
655
|
|
|
604
656
|
return response;
|
|
@@ -611,8 +663,8 @@ class DocumentController extends NativeController {
|
|
|
611
663
|
* @param {Request} request
|
|
612
664
|
* @returns {Promise<Object>}
|
|
613
665
|
*/
|
|
614
|
-
mReplace
|
|
615
|
-
return this._mChanges(request,
|
|
666
|
+
mReplace(request) {
|
|
667
|
+
return this._mChanges(request, "mReplace", actionEnum.REPLACE);
|
|
616
668
|
}
|
|
617
669
|
|
|
618
670
|
/**
|
|
@@ -621,29 +673,37 @@ class DocumentController extends NativeController {
|
|
|
621
673
|
* @param {Request} request
|
|
622
674
|
* @returns {Promise<Object>}
|
|
623
675
|
*/
|
|
624
|
-
async delete
|
|
676
|
+
async delete(request) {
|
|
625
677
|
const id = request.getId();
|
|
626
|
-
const silent = request.getBoolean(
|
|
627
|
-
const refresh = request.getString(
|
|
628
|
-
const source = request.getBoolean(
|
|
678
|
+
const silent = request.getBoolean("silent");
|
|
679
|
+
const refresh = request.getString("refresh", "false");
|
|
680
|
+
const source = request.getBoolean("source");
|
|
629
681
|
const { index, collection } = request.getIndexAndCollection();
|
|
630
682
|
|
|
631
683
|
const document = await this.ask(
|
|
632
|
-
|
|
684
|
+
"core:storage:public:document:get",
|
|
633
685
|
index,
|
|
634
686
|
collection,
|
|
635
|
-
id
|
|
687
|
+
id
|
|
688
|
+
);
|
|
636
689
|
|
|
637
|
-
await this.ask(
|
|
638
|
-
|
|
639
|
-
|
|
690
|
+
await this.ask(
|
|
691
|
+
"core:storage:public:document:delete",
|
|
692
|
+
index,
|
|
693
|
+
collection,
|
|
694
|
+
id,
|
|
695
|
+
{
|
|
696
|
+
refresh,
|
|
697
|
+
}
|
|
698
|
+
);
|
|
640
699
|
|
|
641
|
-
if (!
|
|
700
|
+
if (!silent) {
|
|
642
701
|
await this.ask(
|
|
643
|
-
|
|
702
|
+
"core:realtime:document:notify",
|
|
644
703
|
request,
|
|
645
704
|
actionEnum.DELETE,
|
|
646
|
-
document
|
|
705
|
+
document
|
|
706
|
+
);
|
|
647
707
|
}
|
|
648
708
|
|
|
649
709
|
return source ? document : { _id: document._id };
|
|
@@ -656,37 +716,45 @@ class DocumentController extends NativeController {
|
|
|
656
716
|
* @param {Request} request
|
|
657
717
|
* @returns {Promise<Object>}
|
|
658
718
|
*/
|
|
659
|
-
async mDelete
|
|
660
|
-
const ids = request.getBodyArray(
|
|
661
|
-
const strict = request.getBoolean(
|
|
662
|
-
const silent = request.getBoolean(
|
|
663
|
-
const refresh = request.getString(
|
|
719
|
+
async mDelete(request) {
|
|
720
|
+
const ids = request.getBodyArray("ids");
|
|
721
|
+
const strict = request.getBoolean("strict");
|
|
722
|
+
const silent = request.getBoolean("silent");
|
|
723
|
+
const refresh = request.getString("refresh", "false");
|
|
664
724
|
const { index, collection } = request.getIndexAndCollection();
|
|
665
725
|
|
|
666
726
|
const { documents, errors } = await this.ask(
|
|
667
|
-
|
|
727
|
+
"core:storage:public:document:mDelete",
|
|
668
728
|
index,
|
|
669
729
|
collection,
|
|
670
730
|
ids,
|
|
671
|
-
{ refresh }
|
|
731
|
+
{ refresh }
|
|
732
|
+
);
|
|
672
733
|
|
|
673
734
|
if (strict && errors.length) {
|
|
674
|
-
throw kerror.get(
|
|
735
|
+
throw kerror.get(
|
|
736
|
+
"api",
|
|
737
|
+
"process",
|
|
738
|
+
"incomplete_multiple_request",
|
|
739
|
+
"delete",
|
|
740
|
+
errors
|
|
741
|
+
);
|
|
675
742
|
}
|
|
676
743
|
|
|
677
744
|
// @todo next major release: if (successes.length === 0) then throw (no matter strict value)
|
|
678
745
|
|
|
679
|
-
if (!
|
|
746
|
+
if (!silent) {
|
|
680
747
|
await this.ask(
|
|
681
|
-
|
|
748
|
+
"core:realtime:document:mNotify",
|
|
682
749
|
request,
|
|
683
750
|
actionEnum.DELETE,
|
|
684
|
-
documents
|
|
751
|
+
documents
|
|
752
|
+
);
|
|
685
753
|
}
|
|
686
754
|
|
|
687
755
|
return {
|
|
688
756
|
errors,
|
|
689
|
-
successes: documents.map(d => d._id)
|
|
757
|
+
successes: documents.map((d) => d._id),
|
|
690
758
|
};
|
|
691
759
|
}
|
|
692
760
|
|
|
@@ -696,74 +764,78 @@ class DocumentController extends NativeController {
|
|
|
696
764
|
* @param {Request} request
|
|
697
765
|
* @returns {Promise<Object>}
|
|
698
766
|
*/
|
|
699
|
-
async deleteByQuery
|
|
700
|
-
let query = request.getBodyObject(
|
|
701
|
-
const silent = request.getBoolean(
|
|
702
|
-
const refresh = request.getString(
|
|
703
|
-
const source = request.getBoolean(
|
|
767
|
+
async deleteByQuery(request) {
|
|
768
|
+
let query = request.getBodyObject("query", {});
|
|
769
|
+
const silent = request.getBoolean("silent");
|
|
770
|
+
const refresh = request.getString("refresh", "false");
|
|
771
|
+
const source = request.getBoolean("source");
|
|
704
772
|
const { index, collection } = request.getIndexAndCollection();
|
|
705
773
|
const lang = request.getLangParam();
|
|
706
774
|
|
|
707
|
-
if (lang ===
|
|
775
|
+
if (lang === "koncorde") {
|
|
708
776
|
query = await this.translateKoncorde(query);
|
|
709
777
|
}
|
|
710
778
|
|
|
711
779
|
const result = await this.ask(
|
|
712
|
-
|
|
780
|
+
"core:storage:public:document:deleteByQuery",
|
|
713
781
|
index,
|
|
714
782
|
collection,
|
|
715
783
|
query,
|
|
716
|
-
{ refresh }
|
|
784
|
+
{ refresh }
|
|
785
|
+
);
|
|
717
786
|
|
|
718
|
-
if (!
|
|
787
|
+
if (!silent) {
|
|
719
788
|
await this.ask(
|
|
720
|
-
|
|
789
|
+
"core:realtime:document:mNotify",
|
|
721
790
|
request,
|
|
722
791
|
actionEnum.DELETE,
|
|
723
|
-
result.documents
|
|
792
|
+
result.documents
|
|
793
|
+
);
|
|
724
794
|
}
|
|
725
795
|
|
|
726
|
-
if (!
|
|
727
|
-
result.documents.forEach(d => (d._source = undefined));
|
|
796
|
+
if (!source) {
|
|
797
|
+
result.documents.forEach((d) => (d._source = undefined));
|
|
728
798
|
}
|
|
729
799
|
return {
|
|
730
800
|
documents: result.documents,
|
|
731
|
-
ids: result.documents.map(d => d._id)
|
|
801
|
+
ids: result.documents.map((d) => d._id),
|
|
732
802
|
};
|
|
733
803
|
}
|
|
734
804
|
|
|
735
805
|
/**
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
async deleteFields
|
|
806
|
+
* Delete fields of a document. Throws an error if the document doesn't exist
|
|
807
|
+
*
|
|
808
|
+
* @param {Request} request
|
|
809
|
+
* @returns {Promise<Object>}
|
|
810
|
+
*/
|
|
811
|
+
async deleteFields(request) {
|
|
742
812
|
const id = request.getId();
|
|
743
|
-
const fields = request.getBodyArray(
|
|
813
|
+
const fields = request.getBodyArray("fields");
|
|
744
814
|
const userId = request.getKuid();
|
|
745
|
-
const silent = request.getBoolean(
|
|
746
|
-
const refresh = request.getString(
|
|
747
|
-
const source = request.getBoolean(
|
|
815
|
+
const silent = request.getBoolean("silent");
|
|
816
|
+
const refresh = request.getString("refresh", "false");
|
|
817
|
+
const source = request.getBoolean("source");
|
|
748
818
|
const { index, collection } = request.getIndexAndCollection();
|
|
749
819
|
|
|
750
820
|
const response = await this.ask(
|
|
751
|
-
|
|
821
|
+
"core:storage:public:document:deleteFields",
|
|
752
822
|
index,
|
|
753
823
|
collection,
|
|
754
824
|
id,
|
|
755
825
|
fields,
|
|
756
|
-
{ refresh, userId }
|
|
826
|
+
{ refresh, userId }
|
|
827
|
+
);
|
|
757
828
|
|
|
758
|
-
if (!
|
|
829
|
+
if (!silent) {
|
|
759
830
|
await this.ask(
|
|
760
|
-
|
|
831
|
+
"core:realtime:document:notify",
|
|
761
832
|
request,
|
|
762
833
|
actionEnum.UPDATE,
|
|
763
834
|
{
|
|
764
835
|
_id: response._id,
|
|
765
836
|
_source: response._source,
|
|
766
|
-
}
|
|
837
|
+
}
|
|
838
|
+
);
|
|
767
839
|
}
|
|
768
840
|
|
|
769
841
|
if (source) {
|
|
@@ -772,7 +844,7 @@ class DocumentController extends NativeController {
|
|
|
772
844
|
|
|
773
845
|
return {
|
|
774
846
|
_id: response._id,
|
|
775
|
-
_version: response._version
|
|
847
|
+
_version: response._version,
|
|
776
848
|
};
|
|
777
849
|
}
|
|
778
850
|
|
|
@@ -782,42 +854,46 @@ class DocumentController extends NativeController {
|
|
|
782
854
|
* @param {Request} request
|
|
783
855
|
* @returns {Promise<Object}
|
|
784
856
|
*/
|
|
785
|
-
async updateByQuery
|
|
786
|
-
let query = request.getBodyObject(
|
|
787
|
-
const changes = request.getBodyObject(
|
|
788
|
-
const silent = request.getBoolean(
|
|
857
|
+
async updateByQuery(request) {
|
|
858
|
+
let query = request.getBodyObject("query");
|
|
859
|
+
const changes = request.getBodyObject("changes");
|
|
860
|
+
const silent = request.getBoolean("silent");
|
|
789
861
|
const userId = request.getKuid();
|
|
790
|
-
const refresh = request.getString(
|
|
791
|
-
const source = request.getBoolean(
|
|
862
|
+
const refresh = request.getString("refresh", "false");
|
|
863
|
+
const source = request.getBoolean("source");
|
|
792
864
|
const { index, collection } = request.getIndexAndCollection();
|
|
793
865
|
const lang = request.getLangParam();
|
|
794
866
|
|
|
795
|
-
if (lang ===
|
|
867
|
+
if (lang === "koncorde") {
|
|
796
868
|
query = await this.translateKoncorde(query);
|
|
797
869
|
}
|
|
798
870
|
|
|
799
871
|
const result = await this.ask(
|
|
800
|
-
|
|
872
|
+
"core:storage:public:document:updateByQuery",
|
|
801
873
|
index,
|
|
802
874
|
collection,
|
|
803
875
|
query,
|
|
804
876
|
changes,
|
|
805
|
-
{ refresh, userId }
|
|
877
|
+
{ refresh, userId }
|
|
878
|
+
);
|
|
806
879
|
|
|
807
|
-
if (!
|
|
880
|
+
if (!silent) {
|
|
808
881
|
await this.ask(
|
|
809
|
-
|
|
882
|
+
"core:realtime:document:mNotify",
|
|
810
883
|
request,
|
|
811
884
|
actionEnum.UPDATE,
|
|
812
|
-
result.successes.map(doc => ({
|
|
885
|
+
result.successes.map((doc) => ({
|
|
813
886
|
_id: doc._id,
|
|
814
887
|
_source: doc._source,
|
|
815
|
-
_updatedFields: extractFields(changes, {
|
|
816
|
-
|
|
888
|
+
_updatedFields: extractFields(changes, {
|
|
889
|
+
fieldsToIgnore: ["_kuzzle_info"],
|
|
890
|
+
}),
|
|
891
|
+
}))
|
|
892
|
+
);
|
|
817
893
|
}
|
|
818
894
|
|
|
819
|
-
if (!
|
|
820
|
-
result.successes.forEach(d => (d._source = undefined));
|
|
895
|
+
if (!source) {
|
|
896
|
+
result.successes.forEach((d) => (d._source = undefined));
|
|
821
897
|
}
|
|
822
898
|
|
|
823
899
|
return result;
|
|
@@ -829,7 +905,7 @@ class DocumentController extends NativeController {
|
|
|
829
905
|
* @param {Request} request
|
|
830
906
|
* @returns {Promise<Object>}
|
|
831
907
|
*/
|
|
832
|
-
validate
|
|
908
|
+
validate(request) {
|
|
833
909
|
assertHasBody(request);
|
|
834
910
|
assertHasIndexAndCollection(request);
|
|
835
911
|
|
|
@@ -846,23 +922,26 @@ class DocumentController extends NativeController {
|
|
|
846
922
|
* @param {notifyActionEnum} action performed on the documents
|
|
847
923
|
* @returns {Promise.<Object>} { successes, errors }
|
|
848
924
|
*/
|
|
849
|
-
async _mChanges
|
|
925
|
+
async _mChanges(request, methodName, action) {
|
|
850
926
|
let source = true;
|
|
851
927
|
const userId = request.getKuid();
|
|
852
|
-
const strict = request.getBoolean(
|
|
853
|
-
const silent = request.getBoolean(
|
|
854
|
-
const refresh = request.getString(
|
|
855
|
-
const documents = request.getBodyArray(
|
|
928
|
+
const strict = request.getBoolean("strict");
|
|
929
|
+
const silent = request.getBoolean("silent");
|
|
930
|
+
const refresh = request.getString("refresh", "false");
|
|
931
|
+
const documents = request.getBodyArray("documents");
|
|
856
932
|
const { index, collection } = request.getIndexAndCollection();
|
|
857
933
|
const retryOnConflict =
|
|
858
934
|
action === actionEnum.UPDATE || action === actionEnum.UPSERT
|
|
859
|
-
? request.getInteger(
|
|
935
|
+
? request.getInteger("retryOnConflict", 0)
|
|
860
936
|
: undefined;
|
|
861
937
|
|
|
862
938
|
this.assertNotExceedMaxWrite(documents.length);
|
|
863
939
|
|
|
864
940
|
if (request.input.args.source !== undefined) {
|
|
865
|
-
source =
|
|
941
|
+
source =
|
|
942
|
+
request.input.args.source === "false"
|
|
943
|
+
? false
|
|
944
|
+
: request.getBoolean("source");
|
|
866
945
|
}
|
|
867
946
|
|
|
868
947
|
if (documents.length === 0) {
|
|
@@ -875,11 +954,12 @@ class DocumentController extends NativeController {
|
|
|
875
954
|
for (let i = 0; i < documents.length; i++) {
|
|
876
955
|
if (documents[i]._source) {
|
|
877
956
|
throw kerror.get(
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
957
|
+
"api",
|
|
958
|
+
"assert",
|
|
959
|
+
"unexpected_argument",
|
|
881
960
|
`documents[${i}]._source`,
|
|
882
|
-
`documents[${i}].body`
|
|
961
|
+
`documents[${i}].body`
|
|
962
|
+
);
|
|
883
963
|
}
|
|
884
964
|
}
|
|
885
965
|
|
|
@@ -888,52 +968,63 @@ class DocumentController extends NativeController {
|
|
|
888
968
|
index,
|
|
889
969
|
collection,
|
|
890
970
|
documents,
|
|
891
|
-
{ refresh, retryOnConflict, source, userId }
|
|
971
|
+
{ refresh, retryOnConflict, source, userId }
|
|
972
|
+
);
|
|
892
973
|
|
|
893
974
|
if (strict && response.errors.length) {
|
|
894
|
-
throw kerror.get(
|
|
975
|
+
throw kerror.get(
|
|
976
|
+
"api",
|
|
977
|
+
"process",
|
|
978
|
+
"incomplete_multiple_request",
|
|
979
|
+
methodName,
|
|
980
|
+
response.errors
|
|
981
|
+
);
|
|
895
982
|
}
|
|
896
983
|
|
|
897
984
|
// @todo next major release: if (successes.length === 0) then throw (no matter strict value)
|
|
898
985
|
|
|
899
|
-
if (
|
|
986
|
+
if (
|
|
987
|
+
!silent &&
|
|
988
|
+
(action === actionEnum.UPDATE || action === actionEnum.UPSERT)
|
|
989
|
+
) {
|
|
900
990
|
const documentsDictionnary = documents.reduce((result, document) => {
|
|
901
|
-
result[document._id] =
|
|
902
|
-
? document.changes
|
|
903
|
-
: document.body;
|
|
991
|
+
result[document._id] =
|
|
992
|
+
action === actionEnum.UPSERT ? document.changes : document.body;
|
|
904
993
|
return result;
|
|
905
994
|
}, {});
|
|
906
995
|
|
|
907
996
|
await this.ask(
|
|
908
|
-
|
|
997
|
+
"core:realtime:document:mNotify",
|
|
909
998
|
request,
|
|
910
999
|
action,
|
|
911
|
-
response.items.map(item => {
|
|
912
|
-
if (!
|
|
1000
|
+
response.items.map((item) => {
|
|
1001
|
+
if (!item.created) {
|
|
913
1002
|
item._updatedFields = extractFields(
|
|
914
1003
|
documentsDictionnary[item._id],
|
|
915
|
-
{ fieldsToIgnore: [
|
|
1004
|
+
{ fieldsToIgnore: ["_kuzzle_info"] }
|
|
1005
|
+
);
|
|
916
1006
|
}
|
|
917
1007
|
return item;
|
|
918
|
-
})
|
|
919
|
-
|
|
920
|
-
else if (!
|
|
1008
|
+
})
|
|
1009
|
+
);
|
|
1010
|
+
} else if (!silent) {
|
|
921
1011
|
await this.ask(
|
|
922
|
-
|
|
1012
|
+
"core:realtime:document:mNotify",
|
|
923
1013
|
request,
|
|
924
1014
|
action,
|
|
925
|
-
response.items
|
|
1015
|
+
response.items
|
|
1016
|
+
);
|
|
926
1017
|
}
|
|
927
1018
|
|
|
928
1019
|
return {
|
|
929
1020
|
errors: response.errors,
|
|
930
|
-
successes: response.items
|
|
1021
|
+
successes: response.items,
|
|
931
1022
|
};
|
|
932
1023
|
}
|
|
933
1024
|
}
|
|
934
1025
|
|
|
935
|
-
function hasMultiTargets
|
|
936
|
-
return [
|
|
1026
|
+
function hasMultiTargets(str) {
|
|
1027
|
+
return [",", "*", "+"].some((chr) => str.includes(chr)) || str === "_all";
|
|
937
1028
|
}
|
|
938
1029
|
|
|
939
1030
|
module.exports = DocumentController;
|