kuzzle 2.49.1 → 2.50.0-beta.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 (592) hide show
  1. package/dist/bin/check-node-version.js +11 -0
  2. package/dist/bin/copy-protobuf.js +17 -0
  3. package/dist/lib/api/controllers/adminController.d.ts +51 -0
  4. package/dist/lib/api/controllers/adminController.js +191 -0
  5. package/{lib → dist/lib}/api/controllers/authController.d.ts +20 -40
  6. package/{lib → dist/lib}/api/controllers/authController.js +23 -24
  7. package/dist/lib/api/controllers/bulkController.d.ts +46 -0
  8. package/dist/lib/api/controllers/bulkController.js +132 -0
  9. package/dist/lib/api/controllers/clusterController.d.ts +6 -0
  10. package/{lib → dist/lib}/api/controllers/clusterController.js +7 -11
  11. package/dist/lib/api/controllers/collectionController.d.ts +136 -0
  12. package/dist/lib/api/controllers/collectionController.js +356 -0
  13. package/dist/lib/api/controllers/documentController.d.ts +181 -0
  14. package/dist/lib/api/controllers/documentController.js +768 -0
  15. package/dist/lib/api/controllers/index.d.ts +12 -0
  16. package/{lib → dist/lib}/api/controllers/index.js +13 -14
  17. package/dist/lib/api/controllers/indexController.d.ts +65 -0
  18. package/dist/lib/api/controllers/indexController.js +139 -0
  19. package/dist/lib/api/controllers/memoryStorageController.d.ts +8 -0
  20. package/dist/lib/api/controllers/memoryStorageController.js +867 -0
  21. package/dist/lib/api/controllers/realtimeController.d.ts +47 -0
  22. package/dist/lib/api/controllers/realtimeController.js +128 -0
  23. package/dist/lib/api/controllers/securityController.d.ts +423 -0
  24. package/dist/lib/api/controllers/securityController.js +1139 -0
  25. package/dist/lib/api/controllers/serverController.d.ts +82 -0
  26. package/dist/lib/api/controllers/serverController.js +321 -0
  27. package/dist/lib/api/documentExtractor.d.ts +9 -0
  28. package/dist/lib/api/documentExtractor.js +274 -0
  29. package/dist/lib/api/funnel.d.ts +183 -0
  30. package/dist/lib/api/funnel.js +821 -0
  31. package/dist/lib/api/httpRoutes.d.ts +17 -0
  32. package/dist/lib/api/httpRoutes.js +1496 -0
  33. package/dist/lib/api/rateLimiter.d.ts +18 -0
  34. package/dist/lib/api/rateLimiter.js +74 -0
  35. package/{lib → dist/lib}/api/request/kuzzleRequest.d.ts +2 -2
  36. package/{lib → dist/lib}/api/request/requestContext.d.ts +2 -1
  37. package/dist/lib/cluster/command.d.ts +73 -0
  38. package/dist/lib/cluster/command.js +236 -0
  39. package/dist/lib/cluster/index.d.ts +2 -0
  40. package/{lib → dist/lib}/cluster/index.js +1 -2
  41. package/dist/lib/cluster/node.d.ts +278 -0
  42. package/dist/lib/cluster/node.js +876 -0
  43. package/dist/lib/cluster/publisher.d.ts +188 -0
  44. package/dist/lib/cluster/publisher.js +347 -0
  45. package/dist/lib/cluster/subscriber.d.ts +269 -0
  46. package/dist/lib/cluster/subscriber.js +555 -0
  47. package/dist/lib/cluster/workers/IDCardRenewer.d.ts +13 -0
  48. package/dist/lib/cluster/workers/IDCardRenewer.js +120 -0
  49. package/{lib → dist/lib}/config/documentEventAliases.d.ts +1 -2
  50. package/dist/lib/config/index.d.ts +5 -0
  51. package/dist/lib/config/index.js +244 -0
  52. package/dist/lib/config/sdkCompatibility.json +9 -0
  53. package/dist/lib/core/auth/formatProcessing.d.ts +30 -0
  54. package/dist/lib/core/auth/formatProcessing.js +55 -0
  55. package/dist/lib/core/auth/passportResponse.d.ts +15 -0
  56. package/{lib → dist/lib}/core/auth/passportResponse.js +24 -30
  57. package/dist/lib/core/auth/passportWrapper.d.ts +28 -0
  58. package/dist/lib/core/auth/passportWrapper.js +126 -0
  59. package/{lib → dist/lib}/core/backend/backendConfig.js +2 -2
  60. package/{lib → dist/lib}/core/backend/backendErrors.js +9 -12
  61. package/dist/lib/core/cache/cacheEngine.d.ts +15 -0
  62. package/dist/lib/core/cache/cacheEngine.js +205 -0
  63. package/dist/lib/core/network/accessLogger.d.ts +29 -0
  64. package/dist/lib/core/network/accessLogger.js +250 -0
  65. package/dist/lib/core/network/clientConnection.d.ts +15 -0
  66. package/{lib → dist/lib}/core/network/clientConnection.js +17 -24
  67. package/dist/lib/core/network/context.d.ts +42 -0
  68. package/dist/lib/core/network/context.js +57 -0
  69. package/dist/lib/core/network/entryPoint.d.ts +62 -0
  70. package/dist/lib/core/network/entryPoint.js +261 -0
  71. package/dist/lib/core/network/httpRouter/index.d.ts +85 -0
  72. package/dist/lib/core/network/httpRouter/index.js +258 -0
  73. package/dist/lib/core/network/httpRouter/routeHandler.d.ts +46 -0
  74. package/dist/lib/core/network/httpRouter/routeHandler.js +101 -0
  75. package/dist/lib/core/network/httpRouter/routePart.d.ts +35 -0
  76. package/dist/lib/core/network/httpRouter/routePart.js +117 -0
  77. package/dist/lib/core/network/protocolManifest.d.ts +6 -0
  78. package/{lib → dist/lib}/core/network/protocolManifest.js +5 -9
  79. package/dist/lib/core/network/protocols/httpMessage.d.ts +22 -0
  80. package/dist/lib/core/network/protocols/httpMessage.js +62 -0
  81. package/dist/lib/core/network/protocols/httpwsProtocol.d.ts +171 -0
  82. package/dist/lib/core/network/protocols/httpwsProtocol.js +921 -0
  83. package/dist/lib/core/network/protocols/internalProtocol.d.ts +27 -0
  84. package/dist/lib/core/network/protocols/internalProtocol.js +82 -0
  85. package/dist/lib/core/network/protocols/mqttProtocol.d.ts +39 -0
  86. package/dist/lib/core/network/protocols/mqttProtocol.js +219 -0
  87. package/dist/lib/core/network/protocols/protocol.d.ts +26 -0
  88. package/dist/lib/core/network/protocols/protocol.js +74 -0
  89. package/dist/lib/core/network/router.d.ts +49 -0
  90. package/dist/lib/core/network/router.js +193 -0
  91. package/dist/lib/core/plugin/plugin.d.ts +56 -0
  92. package/dist/lib/core/plugin/plugin.js +282 -0
  93. package/{lib → dist/lib}/core/plugin/pluginContext.js +2 -2
  94. package/dist/lib/core/plugin/pluginManifest.d.ts +5 -0
  95. package/{lib → dist/lib}/core/plugin/pluginManifest.js +16 -27
  96. package/dist/lib/core/plugin/pluginRepository.d.ts +53 -0
  97. package/dist/lib/core/plugin/pluginRepository.js +112 -0
  98. package/dist/lib/core/plugin/pluginsManager.d.ts +190 -0
  99. package/dist/lib/core/plugin/pluginsManager.js +817 -0
  100. package/dist/lib/core/plugin/privilegedContext.d.ts +14 -0
  101. package/{lib → dist/lib}/core/plugin/privilegedContext.js +10 -14
  102. package/dist/lib/core/realtime/actionEnum.d.ts +25 -0
  103. package/{lib → dist/lib}/core/realtime/actionEnum.js +7 -10
  104. package/dist/lib/core/realtime/index.d.ts +8 -0
  105. package/{lib → dist/lib}/core/realtime/index.js +9 -13
  106. package/dist/lib/core/realtime/notification/document.d.ts +34 -0
  107. package/dist/lib/core/realtime/notification/document.js +98 -0
  108. package/dist/lib/core/realtime/notification/index.d.ts +3 -0
  109. package/{lib → dist/lib}/core/realtime/notification/index.js +4 -5
  110. package/dist/lib/core/realtime/notification/server.d.ts +17 -0
  111. package/{lib → dist/lib}/core/realtime/notification/server.js +8 -10
  112. package/dist/lib/core/realtime/notification/user.d.ts +29 -0
  113. package/dist/lib/core/realtime/notification/user.js +66 -0
  114. package/dist/lib/core/realtime/notifier.d.ts +171 -0
  115. package/dist/lib/core/realtime/notifier.js +405 -0
  116. package/dist/lib/core/security/index.d.ts +14 -0
  117. package/{lib → dist/lib}/core/security/index.js +15 -19
  118. package/dist/lib/core/security/roleRepository.d.ts +143 -0
  119. package/dist/lib/core/security/roleRepository.js +445 -0
  120. package/dist/lib/core/security/securityLoader.d.ts +24 -0
  121. package/dist/lib/core/security/securityLoader.js +125 -0
  122. package/{lib → dist/lib}/core/security/tokenRepository.js +1 -1
  123. package/dist/lib/core/security/userRepository.d.ts +81 -0
  124. package/dist/lib/core/security/userRepository.js +346 -0
  125. package/dist/lib/core/shared/abstractManifest.d.ts +27 -0
  126. package/dist/lib/core/shared/abstractManifest.js +85 -0
  127. package/dist/lib/core/shared/sdk/impersonatedSdk.d.ts +7 -0
  128. package/dist/lib/core/shared/sdk/impersonatedSdk.js +80 -0
  129. package/{lib → dist/lib}/core/shared/store.d.ts +2 -2
  130. package/dist/lib/core/statistics/statistics.d.ts +94 -0
  131. package/dist/lib/core/statistics/statistics.js +287 -0
  132. package/dist/lib/core/storage/clientAdapter.d.ts +62 -0
  133. package/dist/lib/core/storage/clientAdapter.js +756 -0
  134. package/dist/lib/core/storage/storageEngine.d.ts +13 -0
  135. package/dist/lib/core/storage/storageEngine.js +52 -0
  136. package/dist/lib/core/validation/baseType.d.ts +35 -0
  137. package/dist/lib/core/validation/baseType.js +70 -0
  138. package/dist/lib/core/validation/types/anything.d.ts +10 -0
  139. package/{lib → dist/lib}/core/validation/types/anything.js +7 -10
  140. package/dist/lib/core/validation/types/boolean.d.ts +16 -0
  141. package/{lib → dist/lib}/core/validation/types/boolean.js +18 -23
  142. package/dist/lib/core/validation/types/date.d.ts +17 -0
  143. package/dist/lib/core/validation/types/date.js +215 -0
  144. package/dist/lib/core/validation/types/email.d.ts +17 -0
  145. package/dist/lib/core/validation/types/email.js +80 -0
  146. package/dist/lib/core/validation/types/enum.d.ts +17 -0
  147. package/dist/lib/core/validation/types/enum.js +70 -0
  148. package/dist/lib/core/validation/types/geoPoint.d.ts +17 -0
  149. package/{lib → dist/lib}/core/validation/types/geoPoint.js +19 -24
  150. package/dist/lib/core/validation/types/geoShape.d.ts +31 -0
  151. package/dist/lib/core/validation/types/geoShape.js +280 -0
  152. package/dist/lib/core/validation/types/integer.d.ts +7 -0
  153. package/{lib → dist/lib}/core/validation/types/integer.js +21 -27
  154. package/dist/lib/core/validation/types/ipAddress.d.ts +17 -0
  155. package/dist/lib/core/validation/types/ipAddress.js +73 -0
  156. package/dist/lib/core/validation/types/numeric.d.ts +17 -0
  157. package/dist/lib/core/validation/types/numeric.js +84 -0
  158. package/dist/lib/core/validation/types/object.d.ts +24 -0
  159. package/dist/lib/core/validation/types/object.js +74 -0
  160. package/dist/lib/core/validation/types/string.d.ts +17 -0
  161. package/dist/lib/core/validation/types/string.js +85 -0
  162. package/dist/lib/core/validation/types/url.d.ts +17 -0
  163. package/dist/lib/core/validation/types/url.js +73 -0
  164. package/dist/lib/core/validation/validation.d.ts +113 -0
  165. package/dist/lib/core/validation/validation.js +692 -0
  166. package/dist/lib/kerror/codes/0-core.json +194 -0
  167. package/dist/lib/kerror/codes/1-services.json +351 -0
  168. package/dist/lib/kerror/codes/2-api.json +195 -0
  169. package/dist/lib/kerror/codes/3-network.json +151 -0
  170. package/dist/lib/kerror/codes/4-plugin.json +498 -0
  171. package/dist/lib/kerror/codes/5-validation.json +158 -0
  172. package/dist/lib/kerror/codes/6-protocol.json +28 -0
  173. package/dist/lib/kerror/codes/7-security.json +283 -0
  174. package/dist/lib/kerror/codes/8-cluster.json +16 -0
  175. package/dist/lib/kerror/codes/index.d.ts +24 -0
  176. package/dist/lib/kerror/codes/index.js +140 -0
  177. package/{lib → dist/lib}/kerror/index.d.ts +5 -5
  178. package/{lib → dist/lib}/kuzzle/Logger.d.ts +6 -0
  179. package/{lib → dist/lib}/kuzzle/Logger.js +26 -5
  180. package/dist/lib/kuzzle/dumpGenerator.d.ts +14 -0
  181. package/dist/lib/kuzzle/dumpGenerator.js +180 -0
  182. package/dist/lib/kuzzle/event/pipeRunner.d.ts +30 -0
  183. package/dist/lib/kuzzle/event/pipeRunner.js +119 -0
  184. package/dist/lib/kuzzle/event/waterfall.d.ts +2 -0
  185. package/dist/lib/kuzzle/event/waterfall.js +90 -0
  186. package/dist/lib/kuzzle/internalIndexHandler.d.ts +186 -0
  187. package/dist/lib/kuzzle/internalIndexHandler.js +174 -0
  188. package/{lib → dist/lib}/kuzzle/kuzzle.d.ts +6 -7
  189. package/{lib → dist/lib}/kuzzle/kuzzle.js +5 -2
  190. package/dist/lib/kuzzle/kuzzleStateEnum.d.ts +20 -0
  191. package/{lib → dist/lib}/kuzzle/kuzzleStateEnum.js +5 -8
  192. package/dist/lib/kuzzle/vault.d.ts +2 -0
  193. package/dist/lib/kuzzle/vault.js +63 -0
  194. package/dist/lib/model/security/rights.d.ts +8 -0
  195. package/{lib → dist/lib}/model/security/rights.js +4 -8
  196. package/{lib → dist/lib}/model/security/role.d.ts +1 -1
  197. package/{lib → dist/lib}/model/security/user.d.ts +1 -0
  198. package/dist/lib/model/storage/apiKey.d.ts +49 -0
  199. package/dist/lib/model/storage/apiKey.js +126 -0
  200. package/dist/lib/model/storage/baseModel.d.ts +100 -0
  201. package/dist/lib/model/storage/baseModel.js +211 -0
  202. package/dist/lib/service/cache/redis.d.ts +74 -0
  203. package/dist/lib/service/cache/redis.js +237 -0
  204. package/dist/lib/service/service.d.ts +30 -0
  205. package/dist/lib/service/service.js +74 -0
  206. package/{lib → dist/lib}/service/storage/7/elasticsearch.d.ts +2 -2
  207. package/{lib → dist/lib}/service/storage/7/elasticsearch.js +23 -25
  208. package/dist/lib/service/storage/7/esWrapper.d.ts +19 -0
  209. package/dist/lib/service/storage/7/esWrapper.js +245 -0
  210. package/{lib → dist/lib}/service/storage/8/elasticsearch.js +23 -25
  211. package/dist/lib/service/storage/8/esWrapper.d.ts +19 -0
  212. package/dist/lib/service/storage/8/esWrapper.js +245 -0
  213. package/{lib → dist/lib}/types/Plugin.d.ts +1 -1
  214. package/{lib/types → dist/lib/types/controllers}/Controller.d.ts +2 -2
  215. package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.d.ts +1 -1
  216. package/dist/lib/types/controllers/adminControlller.type.d.ts +5 -0
  217. package/dist/lib/types/controllers/adminControlller.type.js +3 -0
  218. package/dist/lib/types/controllers/authController.type.d.ts +5 -0
  219. package/dist/lib/types/controllers/authController.type.js +3 -0
  220. package/dist/lib/types/core/auth/formatProcessing.type.d.ts +7 -0
  221. package/dist/lib/types/core/auth/formatProcessing.type.js +3 -0
  222. package/{lib → dist/lib}/types/index.d.ts +3 -3
  223. package/{lib → dist/lib}/types/index.js +3 -3
  224. package/dist/lib/util/assertType.d.ts +41 -0
  225. package/{lib → dist/lib}/util/assertType.js +38 -56
  226. package/dist/lib/util/asyncStore.d.ts +38 -0
  227. package/dist/lib/util/asyncStore.js +70 -0
  228. package/dist/lib/util/bytes.d.ts +2 -0
  229. package/dist/lib/util/bytes.js +33 -0
  230. package/dist/lib/util/debug.d.ts +2 -0
  231. package/{lib → dist/lib}/util/debug.js +15 -23
  232. package/dist/lib/util/deprecate.d.ts +1 -0
  233. package/dist/lib/util/deprecate.js +64 -0
  234. package/dist/lib/util/didYouMean.d.ts +2 -0
  235. package/{lib → dist/lib}/util/didYouMean.js +9 -15
  236. package/dist/lib/util/extractFields.d.ts +17 -0
  237. package/{lib → dist/lib}/util/extractFields.js +18 -32
  238. package/dist/lib/util/memoize.d.ts +7 -0
  239. package/{lib → dist/lib}/util/memoize.js +14 -21
  240. package/dist/lib/util/promback.d.ts +13 -0
  241. package/dist/lib/util/promback.js +60 -0
  242. package/dist/lib/util/requestAssertions.d.ts +10 -0
  243. package/dist/lib/util/requestAssertions.js +143 -0
  244. package/dist/lib/util/safeObject.d.ts +3 -0
  245. package/{lib → dist/lib}/util/safeObject.js +7 -13
  246. package/dist/lib/util/stackTrace.d.ts +19 -0
  247. package/{lib → dist/lib}/util/stackTrace.js +35 -41
  248. package/dist/lib/util/wildcard.d.ts +1 -0
  249. package/{lib → dist/lib}/util/wildcard.js +21 -30
  250. package/dist/package.json +120 -0
  251. package/package.json +45 -58
  252. package/bin/start-kuzzle-server +0 -126
  253. package/check-node-version.js +0 -17
  254. package/lib/api/controllers/adminController.js +0 -229
  255. package/lib/api/controllers/bulkController.js +0 -210
  256. package/lib/api/controllers/collectionController.js +0 -502
  257. package/lib/api/controllers/documentController.js +0 -1156
  258. package/lib/api/controllers/indexController.js +0 -179
  259. package/lib/api/controllers/memoryStorageController.js +0 -1023
  260. package/lib/api/controllers/realtimeController.js +0 -155
  261. package/lib/api/controllers/securityController.js +0 -1571
  262. package/lib/api/controllers/serverController.js +0 -381
  263. package/lib/api/documentExtractor.js +0 -309
  264. package/lib/api/funnel.js +0 -1143
  265. package/lib/api/httpRoutes.js +0 -1547
  266. package/lib/api/rateLimiter.js +0 -87
  267. package/lib/cluster/command.js +0 -284
  268. package/lib/cluster/node.js +0 -1203
  269. package/lib/cluster/publisher.js +0 -386
  270. package/lib/cluster/subscriber.js +0 -776
  271. package/lib/cluster/workers/IDCardRenewer.js +0 -144
  272. package/lib/config/index.js +0 -351
  273. package/lib/config/sdkCompatibility.json +0 -9
  274. package/lib/core/auth/formatProcessing.js +0 -66
  275. package/lib/core/auth/passportWrapper.js +0 -126
  276. package/lib/core/cache/cacheEngine.js +0 -278
  277. package/lib/core/network/accessLogger.js +0 -322
  278. package/lib/core/network/context.js +0 -80
  279. package/lib/core/network/entryPoint.js +0 -358
  280. package/lib/core/network/httpRouter/index.js +0 -316
  281. package/lib/core/network/httpRouter/routeHandler.js +0 -111
  282. package/lib/core/network/httpRouter/routePart.js +0 -147
  283. package/lib/core/network/protocols/httpMessage.js +0 -69
  284. package/lib/core/network/protocols/httpwsProtocol.js +0 -1254
  285. package/lib/core/network/protocols/internalProtocol.js +0 -109
  286. package/lib/core/network/protocols/mqttProtocol.js +0 -291
  287. package/lib/core/network/protocols/protocol.js +0 -102
  288. package/lib/core/network/router.js +0 -255
  289. package/lib/core/plugin/plugin.js +0 -436
  290. package/lib/core/plugin/pluginRepository.js +0 -132
  291. package/lib/core/plugin/pluginsManager.js +0 -1244
  292. package/lib/core/realtime/notification/document.js +0 -108
  293. package/lib/core/realtime/notification/user.js +0 -70
  294. package/lib/core/realtime/notifier.js +0 -541
  295. package/lib/core/security/README.md +0 -223
  296. package/lib/core/security/roleRepository.js +0 -569
  297. package/lib/core/security/securityLoader.js +0 -174
  298. package/lib/core/security/userRepository.js +0 -446
  299. package/lib/core/shared/README.md +0 -3
  300. package/lib/core/shared/abstractManifest.js +0 -102
  301. package/lib/core/shared/sdk/impersonatedSdk.js +0 -94
  302. package/lib/core/statistics/index.js +0 -24
  303. package/lib/core/statistics/statistics.js +0 -373
  304. package/lib/core/storage/clientAdapter.js +0 -1045
  305. package/lib/core/storage/storageEngine.js +0 -63
  306. package/lib/core/validation/baseType.js +0 -80
  307. package/lib/core/validation/index.js +0 -24
  308. package/lib/core/validation/types/date.js +0 -284
  309. package/lib/core/validation/types/email.js +0 -92
  310. package/lib/core/validation/types/enum.js +0 -100
  311. package/lib/core/validation/types/geoShape.js +0 -370
  312. package/lib/core/validation/types/ipAddress.js +0 -83
  313. package/lib/core/validation/types/numeric.js +0 -108
  314. package/lib/core/validation/types/object.js +0 -88
  315. package/lib/core/validation/types/string.js +0 -110
  316. package/lib/core/validation/types/url.js +0 -83
  317. package/lib/core/validation/validation.js +0 -1180
  318. package/lib/kerror/codes/0-core.json +0 -194
  319. package/lib/kerror/codes/1-services.json +0 -351
  320. package/lib/kerror/codes/2-api.json +0 -195
  321. package/lib/kerror/codes/3-network.json +0 -151
  322. package/lib/kerror/codes/4-plugin.json +0 -498
  323. package/lib/kerror/codes/5-validation.json +0 -158
  324. package/lib/kerror/codes/6-protocol.json +0 -28
  325. package/lib/kerror/codes/7-security.json +0 -283
  326. package/lib/kerror/codes/8-cluster.json +0 -16
  327. package/lib/kerror/codes/index.js +0 -208
  328. package/lib/kuzzle/dumpGenerator.js +0 -259
  329. package/lib/kuzzle/event/pipeRunner.js +0 -144
  330. package/lib/kuzzle/event/waterfall.js +0 -101
  331. package/lib/kuzzle/internalIndexHandler.js +0 -234
  332. package/lib/kuzzle/vault.js +0 -89
  333. package/lib/model/storage/apiKey.js +0 -158
  334. package/lib/model/storage/baseModel.js +0 -275
  335. package/lib/service/cache/redis.js +0 -282
  336. package/lib/service/service.js +0 -84
  337. package/lib/service/storage/7/esWrapper.js +0 -303
  338. package/lib/service/storage/8/esWrapper.js +0 -303
  339. package/lib/util/asyncStore.js +0 -112
  340. package/lib/util/bytes.js +0 -36
  341. package/lib/util/deprecate.js +0 -82
  342. package/lib/util/promback.js +0 -66
  343. package/lib/util/readYamlFile.d.ts +0 -2
  344. package/lib/util/readYamlFile.js +0 -10
  345. package/lib/util/requestAssertions.js +0 -157
  346. /package/{index.d.ts → dist/index.d.ts} +0 -0
  347. /package/{index.js → dist/index.js} +0 -0
  348. /package/{lib → dist/lib}/api/controllers/baseController.d.ts +0 -0
  349. /package/{lib → dist/lib}/api/controllers/baseController.js +0 -0
  350. /package/{lib → dist/lib}/api/controllers/debugController.d.ts +0 -0
  351. /package/{lib → dist/lib}/api/controllers/debugController.js +0 -0
  352. /package/{lib → dist/lib}/api/openapi/OpenApiManager.d.ts +0 -0
  353. /package/{lib → dist/lib}/api/openapi/OpenApiManager.js +0 -0
  354. /package/{lib → dist/lib}/api/openapi/index.d.ts +0 -0
  355. /package/{lib → dist/lib}/api/openapi/index.js +0 -0
  356. /package/{lib → dist/lib}/api/openapi/openApiGenerator.d.ts +0 -0
  357. /package/{lib → dist/lib}/api/openapi/openApiGenerator.js +0 -0
  358. /package/{lib → dist/lib}/api/request/index.d.ts +0 -0
  359. /package/{lib → dist/lib}/api/request/index.js +0 -0
  360. /package/{lib → dist/lib}/api/request/kuzzleRequest.js +0 -0
  361. /package/{lib → dist/lib}/api/request/requestContext.js +0 -0
  362. /package/{lib → dist/lib}/api/request/requestInput.d.ts +0 -0
  363. /package/{lib → dist/lib}/api/request/requestInput.js +0 -0
  364. /package/{lib → dist/lib}/api/request/requestResponse.d.ts +0 -0
  365. /package/{lib → dist/lib}/api/request/requestResponse.js +0 -0
  366. /package/{lib → dist/lib}/cluster/idCardHandler.d.ts +0 -0
  367. /package/{lib → dist/lib}/cluster/idCardHandler.js +0 -0
  368. /package/{lib → dist/lib}/cluster/protobuf/command.proto +0 -0
  369. /package/{lib → dist/lib}/cluster/protobuf/sync.proto +0 -0
  370. /package/{lib → dist/lib}/cluster/state.d.ts +0 -0
  371. /package/{lib → dist/lib}/cluster/state.js +0 -0
  372. /package/{lib → dist/lib}/config/default.config.d.ts +0 -0
  373. /package/{lib → dist/lib}/config/default.config.js +0 -0
  374. /package/{lib → dist/lib}/config/documentEventAliases.js +0 -0
  375. /package/{lib → dist/lib}/core/auth/tokenManager.d.ts +0 -0
  376. /package/{lib → dist/lib}/core/auth/tokenManager.js +0 -0
  377. /package/{lib → dist/lib}/core/backend/applicationManager.d.ts +0 -0
  378. /package/{lib → dist/lib}/core/backend/applicationManager.js +0 -0
  379. /package/{lib → dist/lib}/core/backend/backend.d.ts +0 -0
  380. /package/{lib → dist/lib}/core/backend/backend.js +0 -0
  381. /package/{lib → dist/lib}/core/backend/backendCluster.d.ts +0 -0
  382. /package/{lib → dist/lib}/core/backend/backendCluster.js +0 -0
  383. /package/{lib → dist/lib}/core/backend/backendConfig.d.ts +0 -0
  384. /package/{lib → dist/lib}/core/backend/backendController.d.ts +0 -0
  385. /package/{lib → dist/lib}/core/backend/backendController.js +0 -0
  386. /package/{lib → dist/lib}/core/backend/backendErrors.d.ts +0 -0
  387. /package/{lib → dist/lib}/core/backend/backendHook.d.ts +0 -0
  388. /package/{lib → dist/lib}/core/backend/backendHook.js +0 -0
  389. /package/{lib → dist/lib}/core/backend/backendImport.d.ts +0 -0
  390. /package/{lib → dist/lib}/core/backend/backendImport.js +0 -0
  391. /package/{lib → dist/lib}/core/backend/backendOpenApi.d.ts +0 -0
  392. /package/{lib → dist/lib}/core/backend/backendOpenApi.js +0 -0
  393. /package/{lib → dist/lib}/core/backend/backendPipe.d.ts +0 -0
  394. /package/{lib → dist/lib}/core/backend/backendPipe.js +0 -0
  395. /package/{lib → dist/lib}/core/backend/backendPlugin.d.ts +0 -0
  396. /package/{lib → dist/lib}/core/backend/backendPlugin.js +0 -0
  397. /package/{lib → dist/lib}/core/backend/backendStorage.d.ts +0 -0
  398. /package/{lib → dist/lib}/core/backend/backendStorage.js +0 -0
  399. /package/{lib → dist/lib}/core/backend/backendSubscription.d.ts +0 -0
  400. /package/{lib → dist/lib}/core/backend/backendSubscription.js +0 -0
  401. /package/{lib → dist/lib}/core/backend/backendVault.d.ts +0 -0
  402. /package/{lib → dist/lib}/core/backend/backendVault.js +0 -0
  403. /package/{lib → dist/lib}/core/backend/index.d.ts +0 -0
  404. /package/{lib → dist/lib}/core/backend/index.js +0 -0
  405. /package/{lib → dist/lib}/core/backend/internalLogger.d.ts +0 -0
  406. /package/{lib → dist/lib}/core/backend/internalLogger.js +0 -0
  407. /package/{lib → dist/lib}/core/cache/cacheDbEnum.d.ts +0 -0
  408. /package/{lib → dist/lib}/core/cache/cacheDbEnum.js +0 -0
  409. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.d.ts +0 -0
  410. /package/{lib → dist/lib}/core/debug/kuzzleDebugger.js +0 -0
  411. /package/{lib → dist/lib}/core/plugin/pluginContext.d.ts +0 -0
  412. /package/{lib → dist/lib}/core/realtime/channel.d.ts +0 -0
  413. /package/{lib → dist/lib}/core/realtime/channel.js +0 -0
  414. /package/{lib → dist/lib}/core/realtime/connectionRooms.d.ts +0 -0
  415. /package/{lib → dist/lib}/core/realtime/connectionRooms.js +0 -0
  416. /package/{lib → dist/lib}/core/realtime/hotelClerk.d.ts +0 -0
  417. /package/{lib → dist/lib}/core/realtime/hotelClerk.js +0 -0
  418. /package/{lib → dist/lib}/core/realtime/room.d.ts +0 -0
  419. /package/{lib → dist/lib}/core/realtime/room.js +0 -0
  420. /package/{lib → dist/lib}/core/realtime/subscription.d.ts +0 -0
  421. /package/{lib → dist/lib}/core/realtime/subscription.js +0 -0
  422. /package/{lib → dist/lib}/core/security/profileRepository.d.ts +0 -0
  423. /package/{lib → dist/lib}/core/security/profileRepository.js +0 -0
  424. /package/{lib → dist/lib}/core/security/tokenRepository.d.ts +0 -0
  425. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.d.ts +0 -0
  426. /package/{lib → dist/lib}/core/shared/KoncordeWrapper.js +0 -0
  427. /package/{lib → dist/lib}/core/shared/ObjectRepository.d.ts +0 -0
  428. /package/{lib → dist/lib}/core/shared/ObjectRepository.js +0 -0
  429. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.d.ts +0 -0
  430. /package/{lib → dist/lib}/core/shared/sdk/embeddedSdk.js +0 -0
  431. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.d.ts +0 -0
  432. /package/{lib → dist/lib}/core/shared/sdk/funnelProtocol.js +0 -0
  433. /package/{lib → dist/lib}/core/shared/store.js +0 -0
  434. /package/{lib → dist/lib}/core/storage/indexCache.d.ts +0 -0
  435. /package/{lib → dist/lib}/core/storage/indexCache.js +0 -0
  436. /package/{lib → dist/lib}/core/storage/storeScopeEnum.d.ts +0 -0
  437. /package/{lib → dist/lib}/core/storage/storeScopeEnum.js +0 -0
  438. /package/{lib → dist/lib}/kerror/errors/badRequestError.d.ts +0 -0
  439. /package/{lib → dist/lib}/kerror/errors/badRequestError.js +0 -0
  440. /package/{lib → dist/lib}/kerror/errors/externalServiceError.d.ts +0 -0
  441. /package/{lib → dist/lib}/kerror/errors/externalServiceError.js +0 -0
  442. /package/{lib → dist/lib}/kerror/errors/forbiddenError.d.ts +0 -0
  443. /package/{lib → dist/lib}/kerror/errors/forbiddenError.js +0 -0
  444. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.d.ts +0 -0
  445. /package/{lib → dist/lib}/kerror/errors/gatewayTimeoutError.js +0 -0
  446. /package/{lib → dist/lib}/kerror/errors/index.d.ts +0 -0
  447. /package/{lib → dist/lib}/kerror/errors/index.js +0 -0
  448. /package/{lib → dist/lib}/kerror/errors/internalError.d.ts +0 -0
  449. /package/{lib → dist/lib}/kerror/errors/internalError.js +0 -0
  450. /package/{lib → dist/lib}/kerror/errors/kuzzleError.d.ts +0 -0
  451. /package/{lib → dist/lib}/kerror/errors/kuzzleError.js +0 -0
  452. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.d.ts +0 -0
  453. /package/{lib → dist/lib}/kerror/errors/multipleErrorsError.js +0 -0
  454. /package/{lib → dist/lib}/kerror/errors/notFoundError.d.ts +0 -0
  455. /package/{lib → dist/lib}/kerror/errors/notFoundError.js +0 -0
  456. /package/{lib → dist/lib}/kerror/errors/partialError.d.ts +0 -0
  457. /package/{lib → dist/lib}/kerror/errors/partialError.js +0 -0
  458. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.d.ts +0 -0
  459. /package/{lib → dist/lib}/kerror/errors/pluginImplementationError.js +0 -0
  460. /package/{lib → dist/lib}/kerror/errors/preconditionError.d.ts +0 -0
  461. /package/{lib → dist/lib}/kerror/errors/preconditionError.js +0 -0
  462. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.d.ts +0 -0
  463. /package/{lib → dist/lib}/kerror/errors/serviceUnavailableError.js +0 -0
  464. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.d.ts +0 -0
  465. /package/{lib → dist/lib}/kerror/errors/sizeLimitError.js +0 -0
  466. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.d.ts +0 -0
  467. /package/{lib → dist/lib}/kerror/errors/tooManyRequestsError.js +0 -0
  468. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.d.ts +0 -0
  469. /package/{lib → dist/lib}/kerror/errors/unauthorizedError.js +0 -0
  470. /package/{lib → dist/lib}/kerror/index.js +0 -0
  471. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.d.ts +0 -0
  472. /package/{lib → dist/lib}/kuzzle/event/KuzzleEventEmitter.js +0 -0
  473. /package/{lib → dist/lib}/kuzzle/index.d.ts +0 -0
  474. /package/{lib → dist/lib}/kuzzle/index.js +0 -0
  475. /package/{lib → dist/lib}/model/security/profile.d.ts +0 -0
  476. /package/{lib → dist/lib}/model/security/profile.js +0 -0
  477. /package/{lib → dist/lib}/model/security/role.js +0 -0
  478. /package/{lib → dist/lib}/model/security/token.d.ts +0 -0
  479. /package/{lib → dist/lib}/model/security/token.js +0 -0
  480. /package/{lib → dist/lib}/model/security/user.js +0 -0
  481. /package/{lib → dist/lib}/service/storage/8/elasticsearch.d.ts +0 -0
  482. /package/{lib → dist/lib}/service/storage/Elasticsearch.d.ts +0 -0
  483. /package/{lib → dist/lib}/service/storage/Elasticsearch.js +0 -0
  484. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.d.ts +0 -0
  485. /package/{lib → dist/lib}/service/storage/commons/queryTranslator.js +0 -0
  486. /package/{lib → dist/lib}/types/ClientConnection.d.ts +0 -0
  487. /package/{lib → dist/lib}/types/ClientConnection.js +0 -0
  488. /package/{lib → dist/lib}/types/Deprecation.d.ts +0 -0
  489. /package/{lib → dist/lib}/types/Deprecation.js +0 -0
  490. /package/{lib → dist/lib}/types/EventHandler.d.ts +0 -0
  491. /package/{lib → dist/lib}/types/EventHandler.js +0 -0
  492. /package/{lib → dist/lib}/types/Global.d.ts +0 -0
  493. /package/{lib → dist/lib}/types/Global.js +0 -0
  494. /package/{lib → dist/lib}/types/HttpMessage.d.ts +0 -0
  495. /package/{lib → dist/lib}/types/HttpMessage.js +0 -0
  496. /package/{lib → dist/lib}/types/HttpStream.d.ts +0 -0
  497. /package/{lib → dist/lib}/types/HttpStream.js +0 -0
  498. /package/{lib → dist/lib}/types/Kuzzle.d.ts +0 -0
  499. /package/{lib → dist/lib}/types/Kuzzle.js +0 -0
  500. /package/{lib → dist/lib}/types/KuzzleDocument.d.ts +0 -0
  501. /package/{lib → dist/lib}/types/KuzzleDocument.js +0 -0
  502. /package/{lib → dist/lib}/types/OpenApiDefinition.d.ts +0 -0
  503. /package/{lib → dist/lib}/types/OpenApiDefinition.js +0 -0
  504. /package/{lib → dist/lib}/types/PasswordPolicy.d.ts +0 -0
  505. /package/{lib → dist/lib}/types/PasswordPolicy.js +0 -0
  506. /package/{lib → dist/lib}/types/Plugin.js +0 -0
  507. /package/{lib → dist/lib}/types/PluginManifest.d.ts +0 -0
  508. /package/{lib → dist/lib}/types/PluginManifest.js +0 -0
  509. /package/{lib → dist/lib}/types/Policy.d.ts +0 -0
  510. /package/{lib → dist/lib}/types/Policy.js +0 -0
  511. /package/{lib → dist/lib}/types/PolicyRestrictions.d.ts +0 -0
  512. /package/{lib → dist/lib}/types/PolicyRestrictions.js +0 -0
  513. /package/{lib → dist/lib}/types/ProfileDefinition.d.ts +0 -0
  514. /package/{lib → dist/lib}/types/ProfileDefinition.js +0 -0
  515. /package/{lib → dist/lib}/types/RoleDefinition.d.ts +0 -0
  516. /package/{lib → dist/lib}/types/RoleDefinition.js +0 -0
  517. /package/{lib → dist/lib}/types/StrategyDefinition.d.ts +0 -0
  518. /package/{lib → dist/lib}/types/StrategyDefinition.js +0 -0
  519. /package/{lib → dist/lib}/types/Target.d.ts +0 -0
  520. /package/{lib → dist/lib}/types/Target.js +0 -0
  521. /package/{lib → dist/lib}/types/Token.d.ts +0 -0
  522. /package/{lib → dist/lib}/types/Token.js +0 -0
  523. /package/{lib → dist/lib}/types/User.d.ts +0 -0
  524. /package/{lib → dist/lib}/types/User.js +0 -0
  525. /package/{lib → dist/lib}/types/config/DumpConfiguration.d.ts +0 -0
  526. /package/{lib → dist/lib}/types/config/DumpConfiguration.js +0 -0
  527. /package/{lib → dist/lib}/types/config/HttpConfiguration.d.ts +0 -0
  528. /package/{lib → dist/lib}/types/config/HttpConfiguration.js +0 -0
  529. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.d.ts +0 -0
  530. /package/{lib → dist/lib}/types/config/KuzzleConfiguration.js +0 -0
  531. /package/{lib → dist/lib}/types/config/LimitsConfiguration.d.ts +0 -0
  532. /package/{lib → dist/lib}/types/config/LimitsConfiguration.js +0 -0
  533. /package/{lib → dist/lib}/types/config/PluginsConfiguration.d.ts +0 -0
  534. /package/{lib → dist/lib}/types/config/PluginsConfiguration.js +0 -0
  535. /package/{lib → dist/lib}/types/config/SecurityConfiguration.d.ts +0 -0
  536. /package/{lib → dist/lib}/types/config/SecurityConfiguration.js +0 -0
  537. /package/{lib → dist/lib}/types/config/ServerConfiguration.d.ts +0 -0
  538. /package/{lib → dist/lib}/types/config/ServerConfiguration.js +0 -0
  539. /package/{lib → dist/lib}/types/config/ServicesConfiguration.d.ts +0 -0
  540. /package/{lib → dist/lib}/types/config/ServicesConfiguration.js +0 -0
  541. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.d.ts +0 -0
  542. /package/{lib → dist/lib}/types/config/internalCache/InternalCacheRedisConfiguration.js +0 -0
  543. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.d.ts +0 -0
  544. /package/{lib → dist/lib}/types/config/publicCache/PublicCacheRedisConfiguration.js +0 -0
  545. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.d.ts +0 -0
  546. /package/{lib → dist/lib}/types/config/storageEngine/StorageEngineElasticsearchConfiguration.js +0 -0
  547. /package/{lib/types → dist/lib/types/controllers}/Controller.js +0 -0
  548. /package/{lib/types → dist/lib/types/controllers}/ControllerDefinition.js +0 -0
  549. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.d.ts +0 -0
  550. /package/{lib/types → dist/lib/types/controllers}/ControllerRights.js +0 -0
  551. /package/{lib → dist/lib}/types/errors/ErrorDefinition.d.ts +0 -0
  552. /package/{lib → dist/lib}/types/errors/ErrorDefinition.js +0 -0
  553. /package/{lib → dist/lib}/types/errors/ErrorDomains.d.ts +0 -0
  554. /package/{lib → dist/lib}/types/errors/ErrorDomains.js +0 -0
  555. /package/{lib → dist/lib}/types/events/EventGenericDocument.d.ts +0 -0
  556. /package/{lib → dist/lib}/types/events/EventGenericDocument.js +0 -0
  557. /package/{lib → dist/lib}/types/events/EventProtocol.d.ts +0 -0
  558. /package/{lib → dist/lib}/types/events/EventProtocol.js +0 -0
  559. /package/{lib → dist/lib}/types/realtime/RealtimeScope.d.ts +0 -0
  560. /package/{lib → dist/lib}/types/realtime/RealtimeScope.js +0 -0
  561. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.d.ts +0 -0
  562. /package/{lib → dist/lib}/types/realtime/RealtimeUsers.js +0 -0
  563. /package/{lib → dist/lib}/types/realtime/RoomList.d.ts +0 -0
  564. /package/{lib → dist/lib}/types/realtime/RoomList.js +0 -0
  565. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.d.ts +0 -0
  566. /package/{lib → dist/lib}/types/shared/StoreCollectionsDefinition.js +0 -0
  567. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.d.ts +0 -0
  568. /package/{lib → dist/lib}/types/storage/7/Elasticsearch.js +0 -0
  569. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.d.ts +0 -0
  570. /package/{lib → dist/lib}/types/storage/8/Elasticsearch.js +0 -0
  571. /package/{lib → dist/lib}/util/Inflector.d.ts +0 -0
  572. /package/{lib → dist/lib}/util/Inflector.js +0 -0
  573. /package/{lib → dist/lib}/util/array.d.ts +0 -0
  574. /package/{lib → dist/lib}/util/array.js +0 -0
  575. /package/{lib → dist/lib}/util/async.d.ts +0 -0
  576. /package/{lib → dist/lib}/util/async.js +0 -0
  577. /package/{lib → dist/lib}/util/bufferedPassThrough.d.ts +0 -0
  578. /package/{lib → dist/lib}/util/bufferedPassThrough.js +0 -0
  579. /package/{lib → dist/lib}/util/crypto.d.ts +0 -0
  580. /package/{lib → dist/lib}/util/crypto.js +0 -0
  581. /package/{lib → dist/lib}/util/dump-collection.d.ts +0 -0
  582. /package/{lib → dist/lib}/util/dump-collection.js +0 -0
  583. /package/{lib → dist/lib}/util/esRequest.d.ts +0 -0
  584. /package/{lib → dist/lib}/util/esRequest.js +0 -0
  585. /package/{lib → dist/lib}/util/koncordeCompat.d.ts +0 -0
  586. /package/{lib → dist/lib}/util/koncordeCompat.js +0 -0
  587. /package/{lib → dist/lib}/util/mutex.d.ts +0 -0
  588. /package/{lib → dist/lib}/util/mutex.js +0 -0
  589. /package/{lib → dist/lib}/util/name-generator.d.ts +0 -0
  590. /package/{lib → dist/lib}/util/name-generator.js +0 -0
  591. /package/{lib → dist/lib}/util/time.d.ts +0 -0
  592. /package/{lib → dist/lib}/util/time.js +0 -0
@@ -1,1180 +0,0 @@
1
- /*
2
- * Kuzzle, a backend software, self-hostable and ready to use
3
- * to power modern apps
4
- *
5
- * Copyright 2015-2022 Kuzzle
6
- * mailto: support AT kuzzle.io
7
- * website: http://kuzzle.io
8
- *
9
- * Licensed under the Apache License, Version 2.0 (the "License");
10
- * you may not use this file except in compliance with the License.
11
- * You may obtain a copy of the License at
12
- *
13
- * https://www.apache.org/licenses/LICENSE-2.0
14
- *
15
- * Unless required by applicable law or agreed to in writing, software
16
- * distributed under the License is distributed on an "AS IS" BASIS,
17
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- * See the License for the specific language governing permissions and
19
- * limitations under the License.
20
- */
21
-
22
- "use strict";
23
-
24
- const Bluebird = require("bluebird");
25
- const _ = require("lodash");
26
- const { Koncorde } = require("koncorde");
27
-
28
- const debug = require("../../util/debug")("core:validation");
29
- const kerror = require("../../kerror");
30
- const { KuzzleError } = require("../../kerror/errors");
31
- const { has, isPlainObject, get } = require("../../util/safeObject");
32
- const { koncordeTest, toKoncordeIndex } = require("../../util/koncordeCompat");
33
-
34
- const assertionError = kerror.wrap("validation", "assert");
35
- /**
36
- * @class Validation
37
- */
38
- class Validation {
39
- constructor() {
40
- /** @type {...ValidationType} */
41
- this.types = {};
42
-
43
- /** @type {string[]} */
44
- this.typeAllowsChildren = [];
45
-
46
- /** @type {DocumentSpecification} */
47
- this.specification = {};
48
-
49
- /** @type {Koncorde} */
50
- this.koncorde = new Koncorde();
51
-
52
- this.rawConfiguration = {};
53
- this.logger = global.kuzzle.log.child("core:validation");
54
- }
55
-
56
- /**
57
- * Walks through all types in "defaultTypesFiles" initializes all types
58
- */
59
- init() {
60
- [
61
- "anything",
62
- "boolean",
63
- "date",
64
- "email",
65
- "enum",
66
- "geoPoint",
67
- "geoShape",
68
- "integer",
69
- "ipAddress",
70
- "numeric",
71
- "object",
72
- "string",
73
- "url",
74
- ].forEach((typeFile) => {
75
- const TypeConstructor = require(`./types/${typeFile}`);
76
- this.addType(new TypeConstructor());
77
- });
78
- }
79
-
80
- /**
81
- * Validates a document against its collection specifications
82
- *
83
- * @param {Request} request
84
- * @param {boolean} [verbose]
85
- * @returns {Promise.<{documentBody: *, errorMessages:string[], valid: boolean}|KuzzleRequest>}
86
- */
87
- async validate(request, verbose = false) {
88
- const { _id, index, collection } = request.input.resource,
89
- collectionSpec =
90
- (isPlainObject(this.specification) &&
91
- has(this.specification, index) &&
92
- get(this.specification[index], collection)) ||
93
- {};
94
-
95
- let isUpdate = false,
96
- body = request.input.body;
97
-
98
- if (
99
- request.input.controller === "document" &&
100
- request.input.action === "update"
101
- ) {
102
- isUpdate = true;
103
-
104
- const document = await global.kuzzle.ask(
105
- "core:storage:public:document:get",
106
- index,
107
- collection,
108
- _id,
109
- );
110
-
111
- // Avoid side effects on the request during the update validation
112
- body = _.cloneDeep(request.input.body);
113
- _.defaultsDeep(body, document._source);
114
- }
115
-
116
- const errorMessages = verbose ? {} : [];
117
- let isValid = true;
118
-
119
- if (collectionSpec) {
120
- if (collectionSpec.fields && collectionSpec.fields.children) {
121
- try {
122
- isValid = this.recurseFieldValidation(
123
- body,
124
- collectionSpec.fields.children,
125
- collectionSpec.strict,
126
- errorMessages,
127
- verbose,
128
- );
129
- } catch (error) {
130
- // The strictness message can be received here only if it happens at
131
- // the validation of the document's root
132
- if (error.message !== "strictness") {
133
- throw error;
134
- }
135
-
136
- isValid = false;
137
- manageErrorMessage(
138
- "document",
139
- errorMessages,
140
- `The document validation is strict. Cannot add unspecified sub-field "${error.details.field}"`,
141
- verbose,
142
- );
143
- }
144
- }
145
-
146
- if (collectionSpec.validators) {
147
- const filters = koncordeTest(
148
- this.koncorde,
149
- index,
150
- collection,
151
- body,
152
- _id,
153
- );
154
-
155
- if (filters.length === 0 || filters[0] !== collectionSpec.validators) {
156
- isValid = false;
157
- manageErrorMessage(
158
- "document",
159
- errorMessages,
160
- "The document does not match validation filters.",
161
- verbose,
162
- );
163
- }
164
- }
165
- }
166
-
167
- if (!verbose) {
168
- // We only modify the request if the validation succeeds
169
- if (collectionSpec.fields && collectionSpec.fields.children) {
170
- request.input.body = this.recurseApplyDefault(
171
- isUpdate,
172
- request.input.body,
173
- collectionSpec.fields.children,
174
- );
175
- }
176
-
177
- return request;
178
- }
179
-
180
- return { errorMessages, valid: isValid };
181
- }
182
-
183
- /**
184
- * @param {boolean} isUpdate
185
- * @param {*} documentSubset
186
- * @param {...StructuredFieldSpecification} collectionSpecSubset
187
- */
188
- recurseApplyDefault(isUpdate, documentSubset, collectionSpecSubset) {
189
- Object.keys(collectionSpecSubset).forEach((fieldName) => {
190
- const specSubset = collectionSpecSubset[fieldName],
191
- field = documentSubset[fieldName];
192
-
193
- if (
194
- has(documentSubset, fieldName) &&
195
- this.types[specSubset.type].allowChildren &&
196
- specSubset.children
197
- ) {
198
- if (Array.isArray(field)) {
199
- for (let i = 0; i < field.length; i++) {
200
- field[i] = this.recurseApplyDefault(
201
- isUpdate,
202
- field[i],
203
- specSubset.children,
204
- );
205
- }
206
- } else {
207
- documentSubset[fieldName] = this.recurseApplyDefault(
208
- isUpdate,
209
- field,
210
- specSubset.children,
211
- );
212
- }
213
- } else if (
214
- specSubset.defaultValue &&
215
- (field === null || (!isUpdate && !has(documentSubset, fieldName)))
216
- ) {
217
- documentSubset[fieldName] = specSubset.defaultValue;
218
- }
219
- });
220
-
221
- return documentSubset;
222
- }
223
-
224
- /**
225
- * @param {*} documentSubset
226
- * @param {StructuredFieldSpecification} collectionSpecSubset
227
- * @param {boolean} strictness
228
- * @param {string[]} errorMessages
229
- * @param {boolean} verbose
230
- */
231
- recurseFieldValidation(
232
- documentSubset,
233
- collectionSpecSubset,
234
- strictness,
235
- errorMessages,
236
- verbose,
237
- ) {
238
- if (strictness) {
239
- for (const field of Object.keys(documentSubset)) {
240
- if (!collectionSpecSubset[field]) {
241
- const error = new Error("strictness");
242
- error.details = { field };
243
- throw error;
244
- }
245
- }
246
- }
247
-
248
- if (!verbose) {
249
- // We stop as soon as one field is not valid
250
- return Object.keys(collectionSpecSubset).every((fieldName) =>
251
- this.isValidField(
252
- fieldName,
253
- documentSubset,
254
- collectionSpecSubset,
255
- strictness,
256
- errorMessages,
257
- verbose,
258
- ),
259
- );
260
- }
261
-
262
- // We try to validate every field in order to get all error messages if any
263
- return Object.keys(collectionSpecSubset).reduce(
264
- (reductionResult, fieldName) =>
265
- this.isValidField(
266
- fieldName,
267
- documentSubset,
268
- collectionSpecSubset,
269
- strictness,
270
- errorMessages,
271
- verbose,
272
- ) && reductionResult,
273
- true,
274
- );
275
- }
276
-
277
- /**
278
- * @param {string} fieldName
279
- * @param {*} documentSubset
280
- * @param {StructuredFieldSpecification} collectionSpecSubset
281
- * @param {boolean} strictness
282
- * @param {string[]} errorMessages
283
- * @param {boolean} verbose
284
- * @returns {boolean}
285
- */
286
- isValidField(
287
- fieldName,
288
- documentSubset,
289
- collectionSpecSubset,
290
- strictness,
291
- errorMessages,
292
- verbose,
293
- ) {
294
- /** @type StructuredFieldSpecification */
295
- const field = collectionSpecSubset[fieldName];
296
- let result = true;
297
-
298
- if (
299
- field.mandatory &&
300
- !has(field, "defaultValue") &&
301
- _.isNil(documentSubset[fieldName])
302
- ) {
303
- manageErrorMessage(
304
- field.path,
305
- errorMessages,
306
- "The field is mandatory.",
307
- verbose,
308
- );
309
- return false;
310
- }
311
-
312
- if (!_.isNil(documentSubset[fieldName])) {
313
- let nestedStrictness = false,
314
- fieldValues;
315
-
316
- if (field.multivalued.value) {
317
- if (!Array.isArray(documentSubset[fieldName])) {
318
- manageErrorMessage(
319
- field.path,
320
- errorMessages,
321
- "The field must be multivalued, unary value provided.",
322
- verbose,
323
- );
324
- return false;
325
- }
326
-
327
- if (
328
- has(field.multivalued, "minCount") &&
329
- documentSubset[fieldName].length < field.multivalued.minCount
330
- ) {
331
- manageErrorMessage(
332
- field.path,
333
- errorMessages,
334
- `Not enough elements. Minimum count is set to ${field.multivalued.minCount}.`,
335
- verbose,
336
- );
337
- return false;
338
- }
339
-
340
- if (
341
- has(field.multivalued, "maxCount") &&
342
- documentSubset[fieldName].length > field.multivalued.maxCount
343
- ) {
344
- manageErrorMessage(
345
- field.path,
346
- errorMessages,
347
- `Too many elements. Maximum count is set to ${field.multivalued.maxCount}.`,
348
- verbose,
349
- );
350
- return false;
351
- }
352
-
353
- fieldValues = documentSubset[fieldName];
354
- } else {
355
- if (Array.isArray(documentSubset[fieldName])) {
356
- manageErrorMessage(
357
- field.path,
358
- errorMessages,
359
- "The field is not a multivalued field; Multiple values provided.",
360
- verbose,
361
- );
362
- return false;
363
- }
364
-
365
- fieldValues = [documentSubset[fieldName]];
366
- }
367
-
368
- if (this.types[field.type].allowChildren) {
369
- nestedStrictness = this.types[field.type].getStrictness(
370
- field.typeOptions,
371
- strictness,
372
- );
373
- }
374
-
375
- for (const val of fieldValues) {
376
- const fieldErrors = [];
377
-
378
- if (
379
- !this.types[field.type].validate(field.typeOptions, val, fieldErrors)
380
- ) {
381
- if (fieldErrors.length === 0) {
382
- // We still want to trigger an error, even if no message is provided
383
- manageErrorMessage(
384
- field.path,
385
- errorMessages,
386
- "An error has occurred during validation.",
387
- verbose,
388
- );
389
- } else {
390
- fieldErrors.forEach((message) =>
391
- manageErrorMessage(field.path, errorMessages, message, verbose),
392
- );
393
- }
394
- return false;
395
- }
396
-
397
- if (this.types[field.type].allowChildren && field.children) {
398
- try {
399
- if (
400
- !this.recurseFieldValidation(
401
- val,
402
- field.children,
403
- nestedStrictness,
404
- errorMessages,
405
- verbose,
406
- )
407
- ) {
408
- result = false;
409
- }
410
- } catch (error) {
411
- if (error.message === "strictness") {
412
- manageErrorMessage(
413
- field.path,
414
- errorMessages,
415
- `The field is set to "strict"; cannot add unspecified sub-field "${error.details.field}".`,
416
- verbose,
417
- );
418
- } else if (verbose) {
419
- manageErrorMessage(
420
- field.path,
421
- errorMessages,
422
- error.message,
423
- verbose,
424
- );
425
- } else {
426
- throw error;
427
- }
428
-
429
- result = false;
430
- }
431
- }
432
- }
433
- }
434
- return result;
435
- }
436
-
437
- /**
438
- * @returns {Promise.<T>}
439
- */
440
- curateSpecification() {
441
- const promises = [],
442
- specification = {};
443
-
444
- return getValidationConfiguration().then((validation) => {
445
- this.rawConfiguration = validation;
446
-
447
- for (const indexName of Object.keys(this.rawConfiguration)) {
448
- for (const collectionName of Object.keys(
449
- this.rawConfiguration[indexName],
450
- )) {
451
- const promise = this.curateCollectionSpecification(
452
- indexName,
453
- collectionName,
454
- this.rawConfiguration[indexName][collectionName],
455
- )
456
- .then((curatedSpec) => {
457
- if (!has(specification, indexName)) {
458
- specification[indexName] = {};
459
- }
460
-
461
- specification[indexName][collectionName] = curatedSpec;
462
-
463
- return null;
464
- })
465
- .catch((error) => {
466
- this.logger.error(
467
- `Specification for the collection ${collectionName} triggered an error`,
468
- );
469
- this.logger.error(`Error: ${error.message}`);
470
-
471
- return null;
472
- });
473
- promises.push(promise);
474
- }
475
- }
476
-
477
- return Bluebird.all(promises).then(() => {
478
- this.specification = specification;
479
- });
480
- });
481
- }
482
-
483
- /**
484
- * @param {string} indexName
485
- * @param {string} collectionName
486
- * @param {CollectionSpecification} collectionSpec
487
- * @param {boolean} [verboseErrors]
488
- * @returns {Promise<object>}
489
- */
490
- validateFormat(
491
- indexName,
492
- collectionName,
493
- collectionSpec,
494
- verboseErrors = false,
495
- ) {
496
- // We make a deep clone to avoid side effects
497
- const specification = _.cloneDeep(collectionSpec);
498
-
499
- return (
500
- this.curateCollectionSpecification(
501
- indexName,
502
- collectionName,
503
- specification,
504
- true,
505
- verboseErrors,
506
- )
507
- .then((result) => {
508
- if (verboseErrors && result.isValid === false) {
509
- return result;
510
- }
511
- return { isValid: true };
512
- })
513
- // we do not want to reject since this method goal is
514
- // to know what is going wrong with the given spec
515
- .catch((error) => ({ errors: [error], isValid: false }))
516
- );
517
- }
518
-
519
- /**
520
- * @param {string} index
521
- * @param {string} collection
522
- * @param {CollectionSpecification} spec
523
- * @param {boolean} [dryRun]
524
- * @param {boolean} [verbose]
525
- * @returns {Promise<CollectionSpecification>}
526
- * @rejects PreconditionError
527
- */
528
- async curateCollectionSpecification(
529
- index,
530
- collection,
531
- spec,
532
- dryRun = false,
533
- verbose = false,
534
- ) {
535
- let error = "";
536
- const processed = {
537
- fields: {},
538
- strict: spec.strict || false,
539
- validators: null,
540
- };
541
- const allowed = ["strict", "fields", "validators"];
542
-
543
- if (!checkAllowedProperties(spec, allowed)) {
544
- error = assertionError.get(
545
- "unexpected_properties",
546
- `${index}.${collection}`,
547
- allowed.join(", "),
548
- );
549
-
550
- if (verbose) {
551
- return { errors: [error.message], isValid: false };
552
- }
553
-
554
- throw error;
555
- }
556
-
557
- if (spec.fields) {
558
- const result = this.structureCollectionValidation(
559
- spec,
560
- index,
561
- collection,
562
- verbose,
563
- );
564
-
565
- if (result.isValid === false) {
566
- if (verbose) {
567
- // do not fail fast if we need verbose errors
568
- return result;
569
- }
570
-
571
- throw assertionError.get(
572
- "invalid_specifications",
573
- result.errors.join("\n\t- "),
574
- );
575
- }
576
- processed.fields = result;
577
- }
578
-
579
- if (spec.validators && Array.isArray(spec.validators)) {
580
- try {
581
- const filterId = this.curateValidatorFilter(
582
- index,
583
- collection,
584
- spec.validators,
585
- dryRun,
586
- );
587
-
588
- processed.validators = filterId;
589
- } catch (e) {
590
- this.logger.error(e);
591
- throw assertionError.getFrom(e, "invalid_filters", e.message);
592
- }
593
- }
594
-
595
- return processed;
596
- }
597
-
598
- structureCollectionValidation(
599
- collectionSpec,
600
- indexName,
601
- collectionName,
602
- verboseErrors = false,
603
- ) {
604
- const fields = {};
605
- let errors = [],
606
- maxDepth = 0;
607
-
608
- for (const fieldName of Object.keys(collectionSpec.fields)) {
609
- const // We deep clone the field because we will modify it
610
- fieldSpecClone = _.cloneDeep(collectionSpec.fields[fieldName]);
611
-
612
- try {
613
- const result = this.curateFieldSpecification(
614
- fieldSpecClone,
615
- indexName,
616
- collectionName,
617
- fieldName,
618
- verboseErrors,
619
- );
620
-
621
- if (result.isValid === false) {
622
- errors = _.concat(errors, result.errors);
623
- this.logger.error(result.errors.join("\n"));
624
- } else {
625
- const field = result.fieldSpec;
626
-
627
- field.path = fieldName.split("/");
628
- field.depth = field.path.length;
629
-
630
- if (field.depth > maxDepth) {
631
- maxDepth = field.depth;
632
- }
633
-
634
- if (!fields[field.depth]) {
635
- fields[field.depth] = [];
636
- }
637
-
638
- fields[field.depth].push(field);
639
- }
640
- } catch (error) {
641
- this.logger.error(error);
642
- throwOrStoreError(error, verboseErrors, errors);
643
- }
644
- }
645
-
646
- if (errors.length > 0) {
647
- return { errors, isValid: false };
648
- }
649
-
650
- if (Object.keys(fields).length > 0) {
651
- return curateStructuredFields(this.typeAllowsChildren, fields, maxDepth);
652
- }
653
- return {};
654
- }
655
-
656
- /**
657
- * @param {FieldSpecification} fieldSpec
658
- * @param {string} indexName
659
- * @param {string} collectionName
660
- * @param {string} fieldName
661
- * @param {boolean} [verboseErrors]
662
- * @returns {object}
663
- * @throws PreconditionError
664
- */
665
- curateFieldSpecification(
666
- fieldSpec,
667
- indexName,
668
- collectionName,
669
- fieldName,
670
- verboseErrors = false,
671
- ) {
672
- const errors = [];
673
-
674
- const result = this.curateFieldSpecificationFormat(
675
- fieldSpec,
676
- indexName,
677
- collectionName,
678
- fieldName,
679
- verboseErrors,
680
- );
681
-
682
- if (result.isValid === false) {
683
- return result;
684
- }
685
-
686
- _.defaultsDeep(fieldSpec, {
687
- mandatory: false,
688
- multivalued: {
689
- value: false,
690
- },
691
- });
692
-
693
- if (!has(fieldSpec, "typeOptions")) {
694
- fieldSpec.typeOptions = {};
695
- }
696
-
697
- const allowed = this.types[fieldSpec.type].allowedTypeOptions || [];
698
-
699
- if (!checkAllowedProperties(fieldSpec.typeOptions, allowed)) {
700
- throwOrStoreError(
701
- assertionError.get(
702
- "unexpected_properties",
703
- `${indexName}.${collectionName}.${fieldName}`,
704
- allowed.join(", "),
705
- ),
706
- verboseErrors,
707
- errors,
708
- );
709
- }
710
-
711
- try {
712
- fieldSpec.typeOptions = this.types[
713
- fieldSpec.type
714
- ].validateFieldSpecification(fieldSpec.typeOptions);
715
- } catch (e) {
716
- if (!verboseErrors) {
717
- if (e instanceof KuzzleError) {
718
- throw e;
719
- }
720
- throw kerror.getFrom(
721
- e,
722
- "plugin",
723
- "runtime",
724
- "unexpected_error",
725
- e.message,
726
- );
727
- }
728
-
729
- errors.push(e.message);
730
- }
731
-
732
- if (errors.length > 0) {
733
- return { errors, isValid: false };
734
- }
735
-
736
- debug(
737
- "Loaded field validator: %s/%s/%s: %o",
738
- indexName,
739
- collectionName,
740
- fieldName,
741
- fieldSpec,
742
- );
743
-
744
- return { fieldSpec, isValid: true };
745
- }
746
-
747
- /**
748
- * @param {FieldSpecification} fieldSpec
749
- * @param {string} indexName
750
- * @param {string} collectionName
751
- * @param {string} fieldName
752
- * @param {boolean} [verboseErrors]
753
- * @returns {object}
754
- * @throws PreconditionError
755
- */
756
- curateFieldSpecificationFormat(
757
- fieldSpec,
758
- indexName,
759
- collectionName,
760
- fieldName,
761
- verboseErrors = false,
762
- ) {
763
- const errors = [];
764
-
765
- const props = [
766
- "mandatory",
767
- "type",
768
- "defaultValue",
769
- "description",
770
- "multivalued",
771
- "typeOptions",
772
- ];
773
-
774
- if (!checkAllowedProperties(fieldSpec, props)) {
775
- throwOrStoreError(
776
- assertionError.get(
777
- "unexpected_properties",
778
- `${indexName}.${collectionName}.${fieldName}`,
779
- props.join(", "),
780
- ),
781
- verboseErrors,
782
- errors,
783
- );
784
- }
785
-
786
- if (!has(fieldSpec, "type")) {
787
- throwOrStoreError(
788
- assertionError.get(
789
- "missing_type",
790
- `${indexName}.${collectionName}.${fieldName}`,
791
- ),
792
- verboseErrors,
793
- errors,
794
- );
795
- }
796
-
797
- if (!has(this.types, fieldSpec.type)) {
798
- throwOrStoreError(
799
- assertionError.get(
800
- "unknown_type",
801
- `${indexName}.${collectionName}.${fieldName}`,
802
- fieldSpec.type,
803
- ),
804
- verboseErrors,
805
- errors,
806
- );
807
- }
808
-
809
- if (has(fieldSpec, "multivalued")) {
810
- const multivaluedProps = ["value", "minCount", "maxCount"];
811
- if (!checkAllowedProperties(fieldSpec.multivalued, multivaluedProps)) {
812
- throwOrStoreError(
813
- assertionError.get(
814
- "unexpected_properties",
815
- `${indexName}.${collectionName}.${fieldName}.multivalued`,
816
- multivaluedProps.join(", "),
817
- ),
818
- verboseErrors,
819
- errors,
820
- );
821
- }
822
-
823
- if (!has(fieldSpec.multivalued, "value")) {
824
- throwOrStoreError(
825
- assertionError.get(
826
- "missing_value",
827
- `${indexName}.${collectionName}.${fieldName}.multivalued`,
828
- ),
829
- verboseErrors,
830
- errors,
831
- );
832
- }
833
-
834
- if (typeof fieldSpec.multivalued.value !== "boolean") {
835
- throwOrStoreError(
836
- assertionError.get(
837
- "invalid_type",
838
- `${indexName}.${collectionName}.${fieldName}.multivalued.value`,
839
- "boolean",
840
- ),
841
- verboseErrors,
842
- errors,
843
- );
844
- }
845
-
846
- for (const unexpected of ["minCount", "maxCount"]) {
847
- if (
848
- !fieldSpec.multivalued.value &&
849
- has(fieldSpec.multivalued, unexpected)
850
- ) {
851
- throwOrStoreError(
852
- assertionError.get(
853
- "not_multivalued",
854
- `${indexName}.${collectionName}.${fieldName}`,
855
- unexpected,
856
- ),
857
- verboseErrors,
858
- errors,
859
- );
860
- }
861
- }
862
-
863
- if (
864
- has(fieldSpec.multivalued, "minCount") &&
865
- has(fieldSpec.multivalued, "maxCount") &&
866
- fieldSpec.multivalued.minCount > fieldSpec.multivalued.maxCount
867
- ) {
868
- throwOrStoreError(
869
- assertionError.get(
870
- "invalid_range",
871
- `${indexName}.${collectionName}.${fieldName}`,
872
- "minCount",
873
- "maxCount",
874
- ),
875
- verboseErrors,
876
- errors,
877
- );
878
- }
879
- }
880
-
881
- if (errors.length > 0) {
882
- return { errors, isValid: false };
883
- }
884
-
885
- return { isValid: true };
886
- }
887
-
888
- /**
889
- * @param {string} indexName
890
- * @param {string} collectionName
891
- * @param {*} validatorFilter
892
- * @param {boolean} dryRun
893
- * @returns {string}
894
- */
895
- curateValidatorFilter(indexName, collectionName, validatorFilter, dryRun) {
896
- const query = {
897
- bool: {
898
- must: validatorFilter,
899
- },
900
- };
901
-
902
- this.koncorde.validate(query);
903
-
904
- if (!dryRun) {
905
- debug(
906
- "Registering filter validator %s/%s: %O",
907
- indexName,
908
- collectionName,
909
- query,
910
- );
911
-
912
- return this.koncorde.register(
913
- query,
914
- toKoncordeIndex(indexName, collectionName),
915
- );
916
- }
917
-
918
- return null;
919
- }
920
-
921
- /**
922
- * @param {ValidationType} validationType
923
- * @throws {PluginImplementationError}
924
- */
925
- addType(validationType) {
926
- if (!validationType.typeName) {
927
- throw kerror.get("validation", "types", "missing_type_name");
928
- }
929
-
930
- if (
931
- !validationType.validate ||
932
- typeof validationType.validate !== "function"
933
- ) {
934
- throw kerror.get(
935
- "validation",
936
- "types",
937
- "missing_function",
938
- validationType.typeName,
939
- "validate",
940
- );
941
- }
942
-
943
- if (
944
- !validationType.validateFieldSpecification ||
945
- typeof validationType.validateFieldSpecification !== "function"
946
- ) {
947
- throw kerror.get(
948
- "validation",
949
- "types",
950
- "missing_function",
951
- validationType.typeName,
952
- "validateFieldSpecification",
953
- );
954
- }
955
-
956
- if (has(validationType, "allowChildren") && validationType.allowChildren) {
957
- if (
958
- !validationType.getStrictness ||
959
- typeof validationType.getStrictness !== "function"
960
- ) {
961
- throw kerror.get(
962
- "validation",
963
- "types",
964
- "missing_function",
965
- validationType.typeName,
966
- "getStrictness",
967
- );
968
- }
969
-
970
- this.typeAllowsChildren.push(validationType.typeName);
971
- }
972
-
973
- if (this.types[validationType.typeName]) {
974
- throw kerror.get(
975
- "validation",
976
- "types",
977
- "already_exists",
978
- validationType.typeName,
979
- );
980
- }
981
-
982
- this.types[validationType.typeName] = validationType;
983
- }
984
- }
985
-
986
- /**
987
- * @param {*} object
988
- * @param {string[]} allowedProperties
989
- * @returns {boolean}
990
- */
991
- function checkAllowedProperties(object, allowedProperties) {
992
- if (!isPlainObject(object)) {
993
- return false;
994
- }
995
-
996
- return !Object.keys(object).some(
997
- (propertyName) => !allowedProperties.includes(propertyName),
998
- );
999
- }
1000
-
1001
- /**
1002
- * @param {string[]} typeAllowsChildren
1003
- * @param {StructuredFieldSpecification[][]} fields
1004
- * @param {number} maxDepth : depth of the fields; counting starts at 1
1005
- * @throws PreconditionError
1006
- */
1007
- function curateStructuredFields(typeAllowsChildren, fields, maxDepth) {
1008
- const /** @type StructuredFieldSpecification */
1009
- structuredFields = {
1010
- children: {},
1011
- root: true,
1012
- };
1013
-
1014
- for (let i = 1; i <= maxDepth; i++) {
1015
- if (!has(fields, i)) {
1016
- throw assertionError.get("missing_nested_spec");
1017
- }
1018
-
1019
- fields[i].forEach((field) => {
1020
- const parent = getParent(structuredFields, field.path),
1021
- childKey = field.path[field.path.length - 1];
1022
-
1023
- if (!parent.root && typeAllowsChildren.indexOf(parent.type) === -1) {
1024
- throw assertionError.get("unexpected_children", parent.type);
1025
- }
1026
-
1027
- if (!has(parent, "children")) {
1028
- parent.children = {};
1029
- }
1030
-
1031
- parent.children[childKey] = field;
1032
- });
1033
- }
1034
-
1035
- return structuredFields;
1036
- }
1037
-
1038
- /**
1039
- * @param {StructuredFieldSpecification} structuredFields
1040
- * @param {string[]}fieldPath
1041
- * @returns {StructuredFieldSpecification}
1042
- */
1043
- function getParent(structuredFields, fieldPath) {
1044
- if (fieldPath.length === 1) {
1045
- return structuredFields;
1046
- }
1047
-
1048
- let pointer = structuredFields;
1049
-
1050
- for (let i = 0; i < fieldPath.length - 1; i++) {
1051
- if (!has(pointer.children, fieldPath[i])) {
1052
- throw assertionError.get("missing_parent", fieldPath.join("."));
1053
- }
1054
-
1055
- pointer = pointer.children[fieldPath[i]];
1056
- }
1057
-
1058
- return pointer;
1059
- }
1060
-
1061
- /**
1062
- * @param {KuzzleError} error
1063
- * @param {boolean} doNotThrow
1064
- * @param {string[]} errors
1065
- */
1066
- function throwOrStoreError(error, doNotThrow, errorMessages) {
1067
- if (!doNotThrow) {
1068
- throw error;
1069
- }
1070
-
1071
- errorMessages.push(error.message);
1072
- }
1073
-
1074
- /**
1075
- * @param {string|string[]} errorContext
1076
- * @param {string[]|{documentScope:string[], fieldScope: {children: ...*}}} errorHolder
1077
- * @param {string} message
1078
- * @param {boolean} structured
1079
- */
1080
- function manageErrorMessage(errorContext, errorHolder, message, structured) {
1081
- if (structured) {
1082
- if (errorContext === "document") {
1083
- if (!errorHolder.documentScope) {
1084
- errorHolder.documentScope = [];
1085
- }
1086
-
1087
- errorHolder.documentScope.push(message);
1088
- } else {
1089
- if (!errorHolder.fieldScope) {
1090
- errorHolder.fieldScope = {};
1091
- }
1092
-
1093
- let pointer = errorHolder.fieldScope;
1094
-
1095
- for (let i = 0; i < errorContext.length; i++) {
1096
- if (!pointer.children) {
1097
- pointer.children = {};
1098
- }
1099
-
1100
- if (!has(pointer.children, errorContext[i])) {
1101
- pointer.children[errorContext[i]] = {};
1102
- }
1103
- pointer = pointer.children[errorContext[i]];
1104
- }
1105
-
1106
- if (!has(pointer, "messages")) {
1107
- pointer.messages = [];
1108
- }
1109
-
1110
- pointer.messages.push(message);
1111
- }
1112
- } else if (errorContext === "document") {
1113
- throw kerror.get("validation", "check", "failed_document", message);
1114
- } else {
1115
- throw kerror.get(
1116
- "validation",
1117
- "check",
1118
- "failed_field",
1119
- errorContext.join("."),
1120
- message,
1121
- );
1122
- }
1123
- }
1124
-
1125
- /**
1126
- * Retrieve the plugins list from the database and returns it,
1127
- * along with their configuration
1128
- *
1129
- * @returns {Promise}
1130
- */
1131
- function getValidationConfiguration() {
1132
- return global.kuzzle.internalIndex
1133
- .search("validations", {}, { from: 0, size: 1000 })
1134
- .then((result) => {
1135
- let validation = {};
1136
-
1137
- if (result && Array.isArray(result.hits) && result.hits.length > 0) {
1138
- for (const { _source, _id } of result.hits) {
1139
- const collectionName = `${_id.split("#")[0]}/${_id.split("#")[1]}`;
1140
-
1141
- if (!get(_source, "index")) {
1142
- throw assertionError.get(
1143
- "incorrect_validation_format",
1144
- collectionName,
1145
- "index",
1146
- );
1147
- }
1148
-
1149
- if (!get(_source, "collection")) {
1150
- throw assertionError.get(
1151
- "incorrect_validation_format",
1152
- collectionName,
1153
- "collection",
1154
- );
1155
- }
1156
-
1157
- if (!get(_source, "validation")) {
1158
- throw assertionError.get(
1159
- "incorrect_validation_format",
1160
- collectionName,
1161
- "validation",
1162
- );
1163
- }
1164
-
1165
- if (!has(validation, _source.index)) {
1166
- validation[_source.index] = {};
1167
- }
1168
-
1169
- validation[_source.index][_source.collection] = _source.validation;
1170
- }
1171
- } else if (global.kuzzle.config.validation) {
1172
- // We can't wait prepareDb as it runs outside of the rest of the start
1173
- validation = global.kuzzle.config.validation;
1174
- }
1175
-
1176
- return validation;
1177
- });
1178
- }
1179
-
1180
- module.exports = Validation;