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.
Files changed (289) hide show
  1. package/lib/api/controllers/adminController.js +94 -80
  2. package/lib/api/controllers/authController.js +239 -212
  3. package/lib/api/controllers/baseController.js +89 -51
  4. package/lib/api/controllers/bulkController.js +62 -49
  5. package/lib/api/controllers/clusterController.js +6 -8
  6. package/lib/api/controllers/collectionController.js +140 -129
  7. package/lib/api/controllers/debugController.d.ts +2 -2
  8. package/lib/api/controllers/debugController.js +33 -31
  9. package/lib/api/controllers/documentController.js +365 -274
  10. package/lib/api/controllers/index.js +13 -13
  11. package/lib/api/controllers/indexController.js +46 -50
  12. package/lib/api/controllers/memoryStorageController.js +410 -360
  13. package/lib/api/controllers/realtimeController.js +37 -36
  14. package/lib/api/controllers/securityController.js +553 -412
  15. package/lib/api/controllers/serverController.js +111 -104
  16. package/lib/api/documentExtractor.js +75 -68
  17. package/lib/api/funnel.js +411 -312
  18. package/lib/api/httpRoutes.js +1493 -324
  19. package/lib/api/openapi/OpenApiManager.d.ts +1 -1
  20. package/lib/api/openapi/OpenApiManager.js +22 -22
  21. package/lib/api/openapi/components/document/count.yaml +1 -1
  22. package/lib/api/openapi/components/document/create.yaml +2 -2
  23. package/lib/api/openapi/components/document/delete.yaml +1 -1
  24. package/lib/api/openapi/components/document/deleteByQuery.yaml +1 -1
  25. package/lib/api/openapi/components/document/exists.yaml +1 -1
  26. package/lib/api/openapi/components/document/get.yaml +2 -2
  27. package/lib/api/openapi/components/document/index.js +12 -12
  28. package/lib/api/openapi/components/document/replace.yaml +1 -1
  29. package/lib/api/openapi/components/document/scroll.yaml +1 -1
  30. package/lib/api/openapi/components/document/validate.yaml +1 -1
  31. package/lib/api/openapi/components/index.d.ts +2 -2
  32. package/lib/api/openapi/components/index.js +1 -1
  33. package/lib/api/openapi/components/security/index.js +1 -1
  34. package/lib/api/openapi/components/security/upsertUser.yaml +2 -3
  35. package/lib/api/openapi/index.d.ts +1 -1
  36. package/lib/api/openapi/openApiGenerator.d.ts +1 -1
  37. package/lib/api/openapi/openApiGenerator.js +7 -7
  38. package/lib/api/rateLimiter.js +12 -13
  39. package/lib/api/request/index.d.ts +4 -4
  40. package/lib/api/request/kuzzleRequest.d.ts +9 -9
  41. package/lib/api/request/kuzzleRequest.js +89 -87
  42. package/lib/api/request/requestContext.d.ts +2 -2
  43. package/lib/api/request/requestContext.js +17 -17
  44. package/lib/api/request/requestInput.d.ts +1 -1
  45. package/lib/api/request/requestInput.js +19 -19
  46. package/lib/api/request/requestResponse.d.ts +4 -4
  47. package/lib/api/request/requestResponse.js +31 -33
  48. package/lib/cluster/command.js +48 -44
  49. package/lib/cluster/idCardHandler.d.ts +1 -1
  50. package/lib/cluster/idCardHandler.js +15 -15
  51. package/lib/cluster/index.js +2 -2
  52. package/lib/cluster/node.js +301 -269
  53. package/lib/cluster/publisher.js +45 -46
  54. package/lib/cluster/state.d.ts +5 -5
  55. package/lib/cluster/state.js +8 -8
  56. package/lib/cluster/subscriber.js +163 -113
  57. package/lib/cluster/workers/IDCardRenewer.js +33 -32
  58. package/lib/config/default.config.d.ts +1 -1
  59. package/lib/config/default.config.js +212 -171
  60. package/lib/config/documentEventAliases.js +6 -6
  61. package/lib/config/index.js +161 -98
  62. package/lib/config/sdkCompatibility.json +8 -8
  63. package/lib/core/auth/formatProcessing.js +7 -7
  64. package/lib/core/auth/passportResponse.js +7 -7
  65. package/lib/core/auth/passportWrapper.js +34 -30
  66. package/lib/core/auth/tokenManager.d.ts +2 -2
  67. package/lib/core/auth/tokenManager.js +11 -10
  68. package/lib/core/backend/applicationManager.d.ts +1 -1
  69. package/lib/core/backend/applicationManager.js +2 -2
  70. package/lib/core/backend/backend.d.ts +3 -3
  71. package/lib/core/backend/backend.js +34 -31
  72. package/lib/core/backend/backendCluster.d.ts +2 -2
  73. package/lib/core/backend/backendCluster.js +5 -5
  74. package/lib/core/backend/backendConfig.d.ts +2 -2
  75. package/lib/core/backend/backendConfig.js +3 -3
  76. package/lib/core/backend/backendController.d.ts +2 -2
  77. package/lib/core/backend/backendController.js +9 -10
  78. package/lib/core/backend/backendErrors.d.ts +3 -3
  79. package/lib/core/backend/backendErrors.js +2 -1
  80. package/lib/core/backend/backendHook.d.ts +2 -2
  81. package/lib/core/backend/backendHook.js +5 -5
  82. package/lib/core/backend/backendImport.d.ts +3 -3
  83. package/lib/core/backend/backendImport.js +23 -23
  84. package/lib/core/backend/backendOpenApi.d.ts +2 -2
  85. package/lib/core/backend/backendOpenApi.js +16 -16
  86. package/lib/core/backend/backendPipe.d.ts +2 -2
  87. package/lib/core/backend/backendPipe.js +6 -6
  88. package/lib/core/backend/backendPlugin.d.ts +4 -4
  89. package/lib/core/backend/backendPlugin.js +14 -14
  90. package/lib/core/backend/backendStorage.d.ts +2 -2
  91. package/lib/core/backend/backendStorage.js +1 -2
  92. package/lib/core/backend/backendVault.d.ts +2 -2
  93. package/lib/core/backend/backendVault.js +3 -3
  94. package/lib/core/backend/index.d.ts +14 -14
  95. package/lib/core/backend/internalLogger.d.ts +1 -1
  96. package/lib/core/backend/internalLogger.js +5 -5
  97. package/lib/core/cache/cacheDbEnum.js +4 -4
  98. package/lib/core/cache/cacheEngine.js +79 -85
  99. package/lib/core/network/accessLogger.js +126 -120
  100. package/lib/core/network/clientConnection.js +5 -5
  101. package/lib/core/network/context.js +8 -8
  102. package/lib/core/network/entryPoint.js +100 -85
  103. package/lib/core/network/httpRouter/index.js +63 -60
  104. package/lib/core/network/httpRouter/routeHandler.js +18 -19
  105. package/lib/core/network/httpRouter/routePart.js +23 -19
  106. package/lib/core/network/protocolManifest.js +3 -3
  107. package/lib/core/network/protocols/httpMessage.js +8 -10
  108. package/lib/core/network/protocols/httpwsProtocol.js +305 -250
  109. package/lib/core/network/protocols/internalProtocol.js +27 -24
  110. package/lib/core/network/protocols/mqttProtocol.js +106 -96
  111. package/lib/core/network/protocols/protocol.js +20 -17
  112. package/lib/core/network/router.js +56 -46
  113. package/lib/core/plugin/plugin.js +151 -120
  114. package/lib/core/plugin/pluginContext.d.ts +7 -7
  115. package/lib/core/plugin/pluginContext.js +48 -44
  116. package/lib/core/plugin/pluginManifest.js +13 -12
  117. package/lib/core/plugin/pluginRepository.js +26 -27
  118. package/lib/core/plugin/pluginsManager.js +425 -304
  119. package/lib/core/plugin/privilegedContext.js +3 -3
  120. package/lib/core/realtime/actionEnum.js +1 -1
  121. package/lib/core/realtime/channel.d.ts +1 -1
  122. package/lib/core/realtime/channel.js +22 -22
  123. package/lib/core/realtime/connectionRooms.d.ts +1 -1
  124. package/lib/core/realtime/hotelClerk.d.ts +2 -2
  125. package/lib/core/realtime/hotelClerk.js +53 -50
  126. package/lib/core/realtime/index.js +5 -5
  127. package/lib/core/realtime/notification/document.js +25 -25
  128. package/lib/core/realtime/notification/index.js +4 -4
  129. package/lib/core/realtime/notification/server.js +3 -3
  130. package/lib/core/realtime/notification/user.js +4 -4
  131. package/lib/core/realtime/notifier.js +113 -75
  132. package/lib/core/realtime/room.d.ts +1 -1
  133. package/lib/core/realtime/subscription.d.ts +1 -1
  134. package/lib/core/realtime/subscription.js +1 -1
  135. package/lib/core/security/index.js +8 -8
  136. package/lib/core/security/profileRepository.d.ts +6 -6
  137. package/lib/core/security/profileRepository.js +48 -45
  138. package/lib/core/security/roleRepository.js +127 -115
  139. package/lib/core/security/securityLoader.js +70 -63
  140. package/lib/core/security/tokenRepository.js +132 -118
  141. package/lib/core/security/userRepository.js +104 -88
  142. package/lib/core/shared/KoncordeWrapper.d.ts +1 -1
  143. package/lib/core/shared/KoncordeWrapper.js +3 -1
  144. package/lib/core/shared/abstractManifest.js +22 -23
  145. package/lib/core/shared/repository.js +69 -67
  146. package/lib/core/shared/sdk/embeddedSdk.d.ts +2 -2
  147. package/lib/core/shared/sdk/embeddedSdk.js +36 -32
  148. package/lib/core/shared/sdk/funnelProtocol.d.ts +1 -1
  149. package/lib/core/shared/sdk/funnelProtocol.js +11 -11
  150. package/lib/core/shared/sdk/impersonatedSdk.js +19 -18
  151. package/lib/core/shared/store.js +127 -32
  152. package/lib/core/statistics/index.js +2 -2
  153. package/lib/core/statistics/statistics.js +99 -85
  154. package/lib/core/storage/clientAdapter.js +219 -136
  155. package/lib/core/storage/indexCache.js +3 -3
  156. package/lib/core/storage/storageEngine.js +10 -13
  157. package/lib/core/storage/storeScopeEnum.js +3 -3
  158. package/lib/core/validation/baseType.js +12 -10
  159. package/lib/core/validation/index.js +2 -2
  160. package/lib/core/validation/types/anything.js +4 -4
  161. package/lib/core/validation/types/boolean.js +7 -7
  162. package/lib/core/validation/types/date.js +165 -131
  163. package/lib/core/validation/types/email.js +18 -21
  164. package/lib/core/validation/types/enum.js +34 -21
  165. package/lib/core/validation/types/geoPoint.js +7 -7
  166. package/lib/core/validation/types/geoShape.js +148 -125
  167. package/lib/core/validation/types/integer.js +9 -9
  168. package/lib/core/validation/types/ipAddress.js +17 -19
  169. package/lib/core/validation/types/numeric.js +36 -29
  170. package/lib/core/validation/types/object.js +19 -19
  171. package/lib/core/validation/types/string.js +36 -29
  172. package/lib/core/validation/types/url.js +17 -19
  173. package/lib/core/validation/validation.js +422 -378
  174. package/lib/kerror/codes/1-services.json +7 -1
  175. package/lib/kerror/codes/4-plugin.json +2 -2
  176. package/lib/kerror/codes/index.js +85 -63
  177. package/lib/kerror/errors/badRequestError.d.ts +1 -1
  178. package/lib/kerror/errors/externalServiceError.d.ts +1 -1
  179. package/lib/kerror/errors/forbiddenError.d.ts +1 -1
  180. package/lib/kerror/errors/gatewayTimeoutError.d.ts +1 -1
  181. package/lib/kerror/errors/index.d.ts +15 -15
  182. package/lib/kerror/errors/internalError.d.ts +1 -1
  183. package/lib/kerror/errors/kuzzleError.d.ts +1 -1
  184. package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
  185. package/lib/kerror/errors/multipleErrorsError.js +1 -1
  186. package/lib/kerror/errors/notFoundError.d.ts +1 -1
  187. package/lib/kerror/errors/partialError.d.ts +1 -1
  188. package/lib/kerror/errors/partialError.js +1 -1
  189. package/lib/kerror/errors/pluginImplementationError.d.ts +1 -1
  190. package/lib/kerror/errors/pluginImplementationError.js +2 -1
  191. package/lib/kerror/errors/preconditionError.d.ts +1 -1
  192. package/lib/kerror/errors/serviceUnavailableError.d.ts +1 -1
  193. package/lib/kerror/errors/sizeLimitError.d.ts +1 -1
  194. package/lib/kerror/errors/tooManyRequestsError.d.ts +1 -1
  195. package/lib/kerror/errors/unauthorizedError.d.ts +1 -1
  196. package/lib/kerror/index.d.ts +3 -3
  197. package/lib/kerror/index.js +17 -16
  198. package/lib/kuzzle/dumpGenerator.js +130 -114
  199. package/lib/kuzzle/event/kuzzleEventEmitter.js +96 -70
  200. package/lib/kuzzle/event/pipeRunner.js +25 -24
  201. package/lib/kuzzle/event/waterfall.js +13 -15
  202. package/lib/kuzzle/index.js +2 -2
  203. package/lib/kuzzle/internalIndexHandler.js +80 -59
  204. package/lib/kuzzle/kuzzle.js +99 -99
  205. package/lib/kuzzle/kuzzleStateEnum.js +1 -1
  206. package/lib/kuzzle/log.js +23 -18
  207. package/lib/kuzzle/vault.js +34 -19
  208. package/lib/model/security/profile.d.ts +3 -3
  209. package/lib/model/security/profile.js +38 -37
  210. package/lib/model/security/rights.js +5 -5
  211. package/lib/model/security/role.d.ts +3 -3
  212. package/lib/model/security/role.js +25 -26
  213. package/lib/model/security/token.d.ts +1 -1
  214. package/lib/model/security/token.js +4 -4
  215. package/lib/model/security/user.d.ts +2 -2
  216. package/lib/model/security/user.js +9 -9
  217. package/lib/model/storage/apiKey.js +43 -33
  218. package/lib/model/storage/baseModel.js +49 -45
  219. package/lib/service/cache/redis.js +60 -55
  220. package/lib/service/service.js +17 -17
  221. package/lib/service/storage/elasticsearch.js +839 -755
  222. package/lib/service/storage/esWrapper.js +103 -86
  223. package/lib/service/storage/queryTranslator.js +52 -59
  224. package/lib/types/Controller.d.ts +3 -3
  225. package/lib/types/ControllerDefinition.d.ts +3 -3
  226. package/lib/types/DebugModule.d.ts +2 -2
  227. package/lib/types/DebugModule.js +1 -1
  228. package/lib/types/Global.d.ts +1 -1
  229. package/lib/types/HttpStream.d.ts +2 -1
  230. package/lib/types/HttpStream.js +7 -5
  231. package/lib/types/Kuzzle.d.ts +1 -1
  232. package/lib/types/KuzzleDocument.d.ts +1 -1
  233. package/lib/types/OpenApiDefinition.d.ts +1 -1
  234. package/lib/types/PasswordPolicy.d.ts +1 -1
  235. package/lib/types/Plugin.d.ts +6 -6
  236. package/lib/types/Plugin.js +2 -2
  237. package/lib/types/Policy.d.ts +1 -1
  238. package/lib/types/RequestPayload.d.ts +1 -1
  239. package/lib/types/ResponsePayload.d.ts +1 -1
  240. package/lib/types/Token.d.ts +1 -1
  241. package/lib/types/User.d.ts +1 -1
  242. package/lib/types/config/DumpConfiguration.d.ts +8 -8
  243. package/lib/types/config/HttpConfiguration.d.ts +1 -1
  244. package/lib/types/config/KuzzleConfiguration.d.ts +1 -1
  245. package/lib/types/config/LimitsConfiguration.d.ts +8 -8
  246. package/lib/types/config/PluginsConfiguration.d.ts +4 -4
  247. package/lib/types/config/SecurityConfiguration.d.ts +62 -62
  248. package/lib/types/config/ServerConfiguration.d.ts +55 -55
  249. package/lib/types/config/ServicesConfiguration.d.ts +2 -2
  250. package/lib/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +10 -10
  251. package/lib/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +3 -3
  252. package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +194 -110
  253. package/lib/types/errors/ErrorDefinition.d.ts +1 -1
  254. package/lib/types/errors/ErrorDomains.d.ts +1 -1
  255. package/lib/types/index.d.ts +38 -38
  256. package/lib/types/realtime/RealtimeScope.d.ts +1 -1
  257. package/lib/types/realtime/RealtimeUsers.d.ts +1 -1
  258. package/lib/util/assertType.js +13 -11
  259. package/lib/util/async.d.ts +1 -0
  260. package/lib/util/async.js +61 -0
  261. package/lib/util/asyncStore.js +19 -21
  262. package/lib/util/bufferedPassThrough.d.ts +2 -2
  263. package/lib/util/bufferedPassThrough.js +4 -4
  264. package/lib/util/bytes.js +9 -13
  265. package/lib/util/crypto.js +1 -1
  266. package/lib/util/debug.js +5 -5
  267. package/lib/util/deprecate.js +24 -21
  268. package/lib/util/didYouMean.js +7 -7
  269. package/lib/util/dump-collection.d.ts +2 -2
  270. package/lib/util/dump-collection.js +26 -26
  271. package/lib/util/esRequest.d.ts +1 -0
  272. package/lib/util/esRequest.js +62 -0
  273. package/lib/util/extractFields.js +24 -25
  274. package/lib/util/inflector.js +5 -5
  275. package/lib/util/koncordeCompat.d.ts +2 -2
  276. package/lib/util/koncordeCompat.js +5 -5
  277. package/lib/util/memoize.js +3 -5
  278. package/lib/util/mutex.d.ts +19 -1
  279. package/lib/util/mutex.js +39 -12
  280. package/lib/util/name-generator.js +1331 -1331
  281. package/lib/util/promback.js +8 -10
  282. package/lib/util/readYamlFile.d.ts +1 -1
  283. package/lib/util/readYamlFile.js +1 -1
  284. package/lib/util/requestAssertions.js +34 -34
  285. package/lib/util/safeObject.js +5 -5
  286. package/lib/util/stackTrace.js +20 -22
  287. package/lib/util/wildcard.js +15 -15
  288. package/package.json +6 -6
  289. package/npm-shrinkwrap.json +0 -19422
@@ -19,61 +19,61 @@
19
19
  * limitations under the License.
20
20
  */
21
21
 
22
- 'use strict';
22
+ "use strict";
23
23
 
24
- const kerror = require('../../kerror');
25
- const { NativeController } = require('./baseController');
26
- const actionEnum = require('../../core/realtime/actionEnum');
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('../../util/requestAssertions');
31
- const extractFields = require('../../util/extractFields');
32
- const { dumpCollectionDocuments } = require('../../util/dump-collection');
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: '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: '',
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 (request) {
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('targets', []);
88
+ const targets = request.getArray("targets", []);
89
89
  const lang = request.getLangParam();
90
90
 
91
- if ( ! index
92
- && ! collection
93
- && (! targets || targets.length === 0)
94
- ) {
95
- throw kerror.get('api', 'assert', 'missing_argument', 'index, collection or targets');
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 ( index
99
- && collection
100
- && (hasMultiTargets(index)
101
- || hasMultiTargets(collection))
100
+ if (
101
+ index &&
102
+ collection &&
103
+ (hasMultiTargets(index) || hasMultiTargets(collection))
102
104
  ) {
103
- throw kerror.get('services', 'storage', 'invalid_multi_index_collection_usage');
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 === 'koncorde') {
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
- 'core:storage:public:document:multiSearch',
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
- 'core:storage:public:document:search',
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 (request) {
157
+ async scroll(request) {
151
158
  const scrollTTL = request.getScrollTTLParam();
152
- const _scrollId = request.getString('scrollId');
159
+ const _scrollId = request.getString("scrollId");
153
160
 
154
161
  const result = await this.ask(
155
- 'core:storage:public:document:scroll',
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 (request) {
179
+ exists(request) {
172
180
  const id = request.getId();
173
181
  const { index, collection } = request.getIndexAndCollection();
174
182
 
175
- return this.ask('core:storage:public:document:exist', index, collection, id);
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 (request) {
194
+ async mExists(request) {
182
195
  let ids;
183
- if ( request.input.body
184
- && request.input.body.ids
185
- && Object.keys(request.input.body.ids).length
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('ids');
188
- }
189
- else {
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('strict');
207
+ const strict = request.getBoolean("strict");
195
208
  this.assertNotExceedMaxFetch(ids.length);
196
209
 
197
210
  const { items, errors } = await this.ask(
198
- 'core:storage:public:document:mExists',
199
- index, collection,
200
- ids);
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
- 'api',
205
- 'process',
206
- 'incomplete_multiple_request',
207
- 'get',
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 (request) {
233
+ async export(request) {
218
234
  const { index, collection } = request.getIndexAndCollection();
219
235
  const { size, scrollTTL, searchBody } = request.getSearchParams();
220
- const format = request.getString('format', 'jsonl');
221
- const fields = request.getBodyArray('fields', []);
236
+ const format = request.getString("format", "jsonl");
237
+ const fields = request.getBodyArray("fields", []);
222
238
  const lang = request.getLangParam();
223
- const separator = request.getString('separator', ',');
224
- const fieldsName = request.getBodyObject('fieldsName', {});
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 !== 'http') {
232
- throw kerror.get('api', 'assert', 'unsupported_protocol', request.context.connection.protocol, 'document:export');
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 === 'koncorde') {
257
+ if (lang === "koncorde") {
236
258
  searchBody.query = await this.translateKoncorde(searchBody.query || {});
237
259
  }
238
260
 
239
- let mimeType = 'html/text';
261
+ let mimeType = "html/text";
240
262
 
241
- if (format.toLowerCase() === 'csv') {
242
- mimeType = 'text/csv';
263
+ if (format.toLowerCase() === "csv") {
264
+ mimeType = "text/csv";
243
265
  }
244
266
 
245
267
  request.response.configure({
246
268
  headers: {
247
- 'Content-Disposition': `attachment; filename="${index}-${collection}.${format}"`,
248
- 'Content-Type': mimeType,
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 || '5s',
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 (request) {
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
- 'core:storage:public:document:get',
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 (request) {
318
+ async mGet(request) {
295
319
  let ids;
296
- if ( request.input.body
297
- && request.input.body.ids
298
- && Object.keys(request.input.body.ids).length
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('ids');
301
- }
302
- else {
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('strict');
330
+ const strict = request.getBoolean("strict");
307
331
 
308
332
  this.assertNotExceedMaxFetch(ids.length);
309
333
 
310
- const { items, errors } = await this.ask('core:storage:public:document:mGet', index, collection, ids);
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('api', 'process', 'incomplete_multiple_request', 'get', errors);
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 (request) {
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
- 'core:storage:public:document:count',
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 (request) {
348
- const id = request.getId({ ifMissing: 'ignore' });
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('silent');
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
- 'core:storage:public:document:create',
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 (! silent) {
400
+ if (!silent) {
364
401
  await this.ask(
365
- 'core:realtime:document:notify',
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 (request) {
382
- return this._mChanges(request, 'mCreate', actionEnum.CREATE);
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 (request) {
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('silent');
396
- const refresh = request.getString('refresh', 'false');
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
- 'core:storage:public:document:createOrReplace',
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 (! silent) {
451
+ if (!silent) {
412
452
  await this.ask(
413
- 'core:realtime:document:notify',
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 (request) {
430
- return this._mChanges(request, 'mCreateOrReplace', actionEnum.WRITE);
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 (request) {
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('silent');
444
- const refresh = request.getString('refresh', 'false');
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('source');
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
- 'core:storage:public:document:update',
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, { fieldsToIgnore: ['_kuzzle_info'] });
504
+ const _updatedFields = extractFields(content, {
505
+ fieldsToIgnore: ["_kuzzle_info"],
506
+ });
462
507
 
463
- if (! silent) {
508
+ if (!silent) {
464
509
  await this.ask(
465
- 'core:realtime:document:notify',
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 (request) {
539
+ async upsert(request) {
495
540
  const id = request.getId();
496
- const content = request.getBodyObject('changes');
497
- const defaultValues = request.getBodyObject('default', {});
541
+ const content = request.getBodyObject("changes");
542
+ const defaultValues = request.getBodyObject("default", {});
498
543
  const userId = request.getKuid();
499
- const silent = request.getBoolean('silent');
500
- const refresh = request.getString('refresh', 'false');
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('source');
547
+ const source = request.getBoolean("source");
503
548
  const { index, collection } = request.getIndexAndCollection();
504
549
 
505
550
  const updatedDocument = await this.ask(
506
- 'core:storage:public:document:upsert',
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 (! silent && updatedDocument.created) {
559
+ if (!silent && updatedDocument.created) {
514
560
  await this.ask(
515
- 'core:realtime:document:notify',
561
+ "core:realtime:document:notify",
516
562
  request,
517
563
  actionEnum.CREATE,
518
- updatedDocument._source);
519
- }
520
- else if (! silent) {
521
- const _updatedFields = extractFields(content, { fieldsToIgnore: ['_kuzzle_info'] });
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
- 'core:realtime:document:notify',
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 (request) {
553
- return this._mChanges(request, 'mUpdate', actionEnum.UPDATE);
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 (request) {
564
- return this._mChanges(request, 'mUpsert', actionEnum.UPSERT);
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 (request) {
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('silent');
578
- const refresh = request.getString('refresh', 'false');
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
- 'core:storage:public:document:replace',
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 (! silent) {
644
+ if (!silent) {
594
645
  await this.ask(
595
- 'core:realtime:document:notify',
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 (request) {
615
- return this._mChanges(request, 'mReplace', actionEnum.REPLACE);
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 (request) {
676
+ async delete(request) {
625
677
  const id = request.getId();
626
- const silent = request.getBoolean('silent');
627
- const refresh = request.getString('refresh', 'false');
628
- const source = request.getBoolean('source');
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
- 'core:storage:public:document:get',
684
+ "core:storage:public:document:get",
633
685
  index,
634
686
  collection,
635
- id);
687
+ id
688
+ );
636
689
 
637
- await this.ask('core:storage:public:document:delete', index, collection, id, {
638
- refresh,
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 (! silent) {
700
+ if (!silent) {
642
701
  await this.ask(
643
- 'core:realtime:document:notify',
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 (request) {
660
- const ids = request.getBodyArray('ids');
661
- const strict = request.getBoolean('strict');
662
- const silent = request.getBoolean('silent');
663
- const refresh = request.getString('refresh', 'false');
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
- 'core:storage:public:document:mDelete',
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('api', 'process', 'incomplete_multiple_request', 'delete', errors);
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 (! silent) {
746
+ if (!silent) {
680
747
  await this.ask(
681
- 'core:realtime:document:mNotify',
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 (request) {
700
- let query = request.getBodyObject('query', {});
701
- const silent = request.getBoolean('silent');
702
- const refresh = request.getString('refresh', 'false');
703
- const source = request.getBoolean('source');
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 === 'koncorde') {
775
+ if (lang === "koncorde") {
708
776
  query = await this.translateKoncorde(query);
709
777
  }
710
778
 
711
779
  const result = await this.ask(
712
- 'core:storage:public:document:deleteByQuery',
780
+ "core:storage:public:document:deleteByQuery",
713
781
  index,
714
782
  collection,
715
783
  query,
716
- { refresh });
784
+ { refresh }
785
+ );
717
786
 
718
- if (! silent) {
787
+ if (!silent) {
719
788
  await this.ask(
720
- 'core:realtime:document:mNotify',
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 (! source) {
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
- * Delete fields of a document. Throws an error if the document doesn't exist
737
- *
738
- * @param {Request} request
739
- * @returns {Promise<Object>}
740
- */
741
- async deleteFields (request) {
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('fields');
813
+ const fields = request.getBodyArray("fields");
744
814
  const userId = request.getKuid();
745
- const silent = request.getBoolean('silent');
746
- const refresh = request.getString('refresh', 'false');
747
- const source = request.getBoolean('source');
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
- 'core:storage:public:document:deleteFields',
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 (! silent) {
829
+ if (!silent) {
759
830
  await this.ask(
760
- 'core:realtime:document:notify',
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 (request) {
786
- let query = request.getBodyObject('query');
787
- const changes = request.getBodyObject('changes');
788
- const silent = request.getBoolean('silent');
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('refresh', 'false');
791
- const source = request.getBoolean('source');
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 === 'koncorde') {
867
+ if (lang === "koncorde") {
796
868
  query = await this.translateKoncorde(query);
797
869
  }
798
870
 
799
871
  const result = await this.ask(
800
- 'core:storage:public:document:updateByQuery',
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 (! silent) {
880
+ if (!silent) {
808
881
  await this.ask(
809
- 'core:realtime:document:mNotify',
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, { fieldsToIgnore: ['_kuzzle_info'] }),
816
- })));
888
+ _updatedFields: extractFields(changes, {
889
+ fieldsToIgnore: ["_kuzzle_info"],
890
+ }),
891
+ }))
892
+ );
817
893
  }
818
894
 
819
- if (! source) {
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 (request) {
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 (request, methodName, action) {
925
+ async _mChanges(request, methodName, action) {
850
926
  let source = true;
851
927
  const userId = request.getKuid();
852
- const strict = request.getBoolean('strict');
853
- const silent = request.getBoolean('silent');
854
- const refresh = request.getString('refresh', 'false');
855
- const documents = request.getBodyArray('documents');
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('retryOnConflict', 0)
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 = request.input.args.source === 'false' ? false : request.getBoolean('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
- 'api',
879
- 'assert',
880
- 'unexpected_argument',
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('api', 'process', 'incomplete_multiple_request', methodName, response.errors);
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 (! silent && (action === actionEnum.UPDATE || action === actionEnum.UPSERT)) {
986
+ if (
987
+ !silent &&
988
+ (action === actionEnum.UPDATE || action === actionEnum.UPSERT)
989
+ ) {
900
990
  const documentsDictionnary = documents.reduce((result, document) => {
901
- result[document._id] = action === actionEnum.UPSERT
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
- 'core:realtime:document:mNotify',
997
+ "core:realtime:document:mNotify",
909
998
  request,
910
999
  action,
911
- response.items.map(item => {
912
- if (! item.created) {
1000
+ response.items.map((item) => {
1001
+ if (!item.created) {
913
1002
  item._updatedFields = extractFields(
914
1003
  documentsDictionnary[item._id],
915
- { fieldsToIgnore: ['_kuzzle_info'] });
1004
+ { fieldsToIgnore: ["_kuzzle_info"] }
1005
+ );
916
1006
  }
917
1007
  return item;
918
- }));
919
- }
920
- else if (! silent) {
1008
+ })
1009
+ );
1010
+ } else if (!silent) {
921
1011
  await this.ask(
922
- 'core:realtime:document:mNotify',
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 (str) {
936
- return [',', '*', '+'].some(chr => str.includes(chr)) || str === '_all';
1026
+ function hasMultiTargets(str) {
1027
+ return [",", "*", "+"].some((chr) => str.includes(chr)) || str === "_all";
937
1028
  }
938
1029
 
939
1030
  module.exports = DocumentController;