kuzzle 2.16.11 → 2.17.2

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 (187) hide show
  1. package/lib/api/controllers/adminController.js +3 -3
  2. package/lib/api/controllers/authController.js +12 -12
  3. package/lib/api/controllers/baseController.js +60 -3
  4. package/lib/api/controllers/clusterController.js +1 -1
  5. package/lib/api/controllers/collectionController.js +7 -5
  6. package/lib/api/controllers/documentController.js +130 -17
  7. package/lib/api/controllers/indexController.js +1 -1
  8. package/lib/api/controllers/memoryStorageController.js +39 -38
  9. package/lib/api/controllers/realtimeController.js +1 -1
  10. package/lib/api/controllers/securityController.js +50 -50
  11. package/lib/api/controllers/serverController.js +73 -27
  12. package/lib/api/documentExtractor.js +3 -3
  13. package/lib/api/funnel.js +44 -21
  14. package/lib/api/httpRoutes.js +9 -4
  15. package/lib/api/openapi/OpenApiManager.d.ts +11 -0
  16. package/lib/api/openapi/OpenApiManager.js +96 -0
  17. package/lib/api/openapi/{document → components/document}/count.yaml +2 -2
  18. package/lib/api/openapi/{document → components/document}/create.yaml +2 -2
  19. package/lib/api/openapi/{document → components/document}/createOrReplace.yaml +2 -2
  20. package/lib/api/openapi/{document → components/document}/delete.yaml +1 -1
  21. package/lib/api/openapi/{document → components/document}/deleteByQuery.yaml +2 -2
  22. package/lib/api/openapi/{document → components/document}/exists.yaml +1 -1
  23. package/lib/api/openapi/{document → components/document}/get.yaml +1 -1
  24. package/lib/api/openapi/{document → components/document}/index.d.ts +2 -0
  25. package/lib/api/openapi/{document → components/document}/index.js +7 -2
  26. package/lib/api/openapi/{document → components/document}/replace.yaml +2 -2
  27. package/lib/api/openapi/{document → components/document}/scroll.yaml +1 -1
  28. package/lib/api/openapi/{document → components/document}/update.yaml +2 -2
  29. package/lib/api/openapi/components/document/validate.yaml +42 -0
  30. package/lib/api/openapi/components/index.d.ts +2 -0
  31. package/lib/api/openapi/components/index.js +18 -0
  32. package/lib/api/openapi/{payloads.yaml → components/payloads.yaml} +0 -0
  33. package/lib/api/openapi/index.d.ts +1 -2
  34. package/lib/api/openapi/index.js +1 -5
  35. package/lib/api/openapi/openApiGenerator.d.ts +7 -0
  36. package/lib/api/openapi/openApiGenerator.js +133 -0
  37. package/lib/api/request/kuzzleRequest.js +8 -6
  38. package/lib/cluster/node.js +9 -9
  39. package/lib/cluster/publisher.js +1 -1
  40. package/lib/cluster/state.js +20 -4
  41. package/lib/cluster/subscriber.js +1 -1
  42. package/lib/cluster/workers/IDCardRenewer.js +2 -2
  43. package/lib/config/default.config.js +1 -0
  44. package/lib/config/index.js +6 -6
  45. package/lib/core/auth/passportResponse.js +6 -6
  46. package/lib/core/auth/passportWrapper.js +5 -5
  47. package/lib/core/backend/backend.d.ts +11 -3
  48. package/lib/core/backend/backend.js +22 -17
  49. package/lib/core/backend/backendConfig.d.ts +5 -1
  50. package/lib/core/backend/backendConfig.js +25 -2
  51. package/lib/core/backend/backendController.js +21 -5
  52. package/lib/core/backend/backendErrors.d.ts +58 -0
  53. package/lib/core/backend/backendErrors.js +121 -0
  54. package/lib/core/backend/backendHook.js +21 -5
  55. package/lib/core/backend/backendImport.js +21 -5
  56. package/lib/core/backend/backendOpenApi.d.ts +9 -0
  57. package/lib/core/backend/backendOpenApi.js +69 -0
  58. package/lib/core/backend/backendPipe.js +21 -5
  59. package/lib/core/backend/backendPlugin.js +22 -3
  60. package/lib/core/backend/backendVault.js +21 -2
  61. package/lib/core/backend/index.d.ts +2 -0
  62. package/lib/core/backend/index.js +2 -0
  63. package/lib/core/network/accessLogger.js +6 -6
  64. package/lib/core/network/clientConnection.js +1 -1
  65. package/lib/core/network/entryPoint.js +5 -5
  66. package/lib/core/network/httpRouter/index.js +5 -5
  67. package/lib/core/network/httpRouter/routeHandler.js +3 -3
  68. package/lib/core/network/httpRouter/routePart.js +5 -5
  69. package/lib/core/network/protocolManifest.js +1 -1
  70. package/lib/core/network/protocols/httpMessage.js +2 -2
  71. package/lib/core/network/protocols/httpwsProtocol.js +228 -50
  72. package/lib/core/network/protocols/mqttProtocol.js +3 -3
  73. package/lib/core/network/protocols/protocol.js +3 -3
  74. package/lib/core/network/router.js +7 -6
  75. package/lib/core/plugin/plugin.js +38 -64
  76. package/lib/core/plugin/pluginContext.js +22 -3
  77. package/lib/core/plugin/pluginManifest.js +3 -3
  78. package/lib/core/plugin/pluginRepository.js +5 -5
  79. package/lib/core/plugin/pluginsManager.js +29 -28
  80. package/lib/core/realtime/channel.js +20 -4
  81. package/lib/core/realtime/hotelClerk.js +24 -5
  82. package/lib/core/realtime/notification/server.js +1 -1
  83. package/lib/core/realtime/notification/user.js +1 -1
  84. package/lib/core/realtime/notifier.js +5 -5
  85. package/lib/core/security/index.js +1 -1
  86. package/lib/core/security/profileRepository.d.ts +176 -0
  87. package/lib/core/security/profileRepository.js +445 -443
  88. package/lib/core/security/roleRepository.js +16 -16
  89. package/lib/core/security/securityLoader.js +2 -2
  90. package/lib/core/security/tokenRepository.js +11 -11
  91. package/lib/core/security/userRepository.js +8 -8
  92. package/lib/core/shared/abstractManifest.js +4 -4
  93. package/lib/core/shared/repository.js +5 -5
  94. package/lib/core/shared/sdk/embeddedSdk.js +21 -2
  95. package/lib/core/shared/sdk/funnelProtocol.js +1 -1
  96. package/lib/core/shared/sdk/impersonatedSdk.js +1 -1
  97. package/lib/core/shared/store.js +30 -23
  98. package/lib/core/statistics/statistics.js +17 -17
  99. package/lib/core/storage/clientAdapter.js +45 -10
  100. package/lib/core/storage/indexCache.js +20 -4
  101. package/lib/core/validation/baseType.js +5 -5
  102. package/lib/core/validation/types/anything.js +1 -1
  103. package/lib/core/validation/types/boolean.js +2 -2
  104. package/lib/core/validation/types/date.js +9 -9
  105. package/lib/core/validation/types/email.js +5 -5
  106. package/lib/core/validation/types/enum.js +6 -6
  107. package/lib/core/validation/types/geoPoint.js +2 -2
  108. package/lib/core/validation/types/geoShape.js +28 -25
  109. package/lib/core/validation/types/integer.js +4 -4
  110. package/lib/core/validation/types/ipAddress.js +7 -6
  111. package/lib/core/validation/types/numeric.js +4 -4
  112. package/lib/core/validation/types/object.js +5 -5
  113. package/lib/core/validation/types/string.js +5 -5
  114. package/lib/core/validation/types/url.js +7 -6
  115. package/lib/core/validation/validation.js +95 -84
  116. package/lib/kerror/codes/1-services.json +12 -0
  117. package/lib/kerror/codes/2-api.json +12 -0
  118. package/lib/kerror/codes/3-network.json +12 -0
  119. package/lib/kerror/codes/4-plugin.json +6 -0
  120. package/lib/kerror/codes/index.js +11 -11
  121. package/lib/kerror/errors/multipleErrorsError.d.ts +1 -1
  122. package/lib/kerror/errors/multipleErrorsError.js +3 -3
  123. package/lib/kerror/index.d.ts +82 -0
  124. package/lib/kerror/index.js +176 -143
  125. package/lib/kuzzle/dumpGenerator.js +3 -3
  126. package/lib/kuzzle/event/kuzzleEventEmitter.js +4 -4
  127. package/lib/kuzzle/event/pipeRunner.js +1 -1
  128. package/lib/kuzzle/event/waterfall.js +6 -6
  129. package/lib/kuzzle/kuzzle.js +59 -9
  130. package/lib/kuzzle/log.js +3 -3
  131. package/lib/kuzzle/vault.js +3 -3
  132. package/lib/model/security/profile.d.ts +54 -0
  133. package/lib/model/security/profile.js +192 -232
  134. package/lib/model/security/rights.js +1 -1
  135. package/lib/model/security/role.d.ts +40 -0
  136. package/lib/model/security/role.js +174 -190
  137. package/lib/model/security/user.d.ts +29 -0
  138. package/lib/model/security/user.js +103 -52
  139. package/lib/model/storage/apiKey.js +2 -2
  140. package/lib/model/storage/baseModel.js +3 -3
  141. package/lib/service/cache/redis.js +7 -7
  142. package/lib/service/storage/elasticsearch.js +152 -90
  143. package/lib/service/storage/esWrapper.js +2 -3
  144. package/lib/types/ControllerDefinition.d.ts +3 -3
  145. package/lib/types/ControllerRights.d.ts +22 -0
  146. package/lib/types/ControllerRights.js +23 -0
  147. package/lib/types/HttpStream.d.ts +32 -0
  148. package/lib/types/HttpStream.js +70 -0
  149. package/lib/types/OpenApiDefinition.d.ts +43 -0
  150. package/lib/types/{config/StorageService/StorageServiceElasticsearchConfiguration.js → OpenApiDefinition.js} +1 -1
  151. package/lib/types/Plugin.js +20 -4
  152. package/lib/types/Policy.d.ts +25 -0
  153. package/lib/types/{InternalLogger.js → Policy.js} +2 -2
  154. package/lib/types/PolicyRestrictions.d.ts +21 -0
  155. package/lib/types/PolicyRestrictions.js +23 -0
  156. package/lib/types/Target.d.ts +15 -0
  157. package/lib/types/Target.js +23 -0
  158. package/lib/types/config/KuzzleConfiguration.d.ts +4 -0
  159. package/lib/types/config/ServicesConfiguration.d.ts +2 -2
  160. package/lib/types/config/{StorageService/StorageServiceElasticsearchConfiguration.d.ts → storageEngine/StorageEngineElasticsearchConfiguration.d.ts} +10 -3
  161. package/lib/types/config/storageEngine/StorageEngineElasticsearchConfiguration.js +3 -0
  162. package/lib/types/errors/ErrorDefinition.d.ts +27 -0
  163. package/lib/types/errors/ErrorDefinition.js +3 -0
  164. package/lib/types/errors/ErrorDomains.d.ts +17 -0
  165. package/lib/types/errors/ErrorDomains.js +3 -0
  166. package/lib/types/index.d.ts +9 -1
  167. package/lib/types/index.js +9 -1
  168. package/lib/util/array.d.ts +11 -0
  169. package/lib/util/array.js +57 -0
  170. package/lib/util/assertType.js +6 -6
  171. package/lib/util/bufferedPassThrough.d.ts +76 -0
  172. package/lib/util/bufferedPassThrough.js +161 -0
  173. package/lib/util/deprecate.js +7 -5
  174. package/lib/util/didYouMean.js +1 -1
  175. package/lib/util/dump-collection.d.ts +3 -0
  176. package/lib/util/dump-collection.js +284 -0
  177. package/lib/util/extractFields.js +2 -2
  178. package/lib/util/inflector.d.ts +8 -0
  179. package/lib/util/inflector.js +16 -0
  180. package/lib/util/mutex.js +21 -2
  181. package/lib/util/requestAssertions.js +7 -7
  182. package/lib/util/wildcard.js +55 -0
  183. package/package-lock.json +535 -75
  184. package/package.json +5 -3
  185. package/lib/api/openApiGenerator.d.ts +0 -7
  186. package/lib/api/openApiGenerator.js +0 -197
  187. package/lib/types/InternalLogger.d.ts +0 -25
@@ -38,7 +38,7 @@ const { generateRandomName } = require('../../util/name-generator');
38
38
  * @class SecurityController
39
39
  */
40
40
  class SecurityController extends NativeController {
41
- constructor() {
41
+ constructor () {
42
42
  super([
43
43
  'checkRights',
44
44
  'createApiKey',
@@ -136,7 +136,7 @@ class SecurityController extends NativeController {
136
136
  const expiresIn = request.input.args.expiresIn || -1;
137
137
  const refresh = request.getRefresh('wait_for');
138
138
  const userId = request.getString('userId');
139
- const apiKeyId = request.getId({ ifMissing: 'ignore' });
139
+ const apiKeyId = request.getId({ ifMissing: 'generate' });
140
140
  const description = request.getBodyString('description');
141
141
 
142
142
  const user = await this.ask('core:security:user:get', userId);
@@ -229,9 +229,9 @@ class SecurityController extends NativeController {
229
229
  * @returns {Promise}
230
230
  */
231
231
  async getProfileMapping () {
232
- const {properties} = await global.kuzzle.internalIndex.getMapping('profiles');
232
+ const { properties } = await global.kuzzle.internalIndex.getMapping('profiles');
233
233
 
234
- return {mapping: properties};
234
+ return { mapping: properties };
235
235
  }
236
236
 
237
237
  /**
@@ -252,9 +252,9 @@ class SecurityController extends NativeController {
252
252
  * @returns {Promise}
253
253
  */
254
254
  async getUserMapping () {
255
- const {properties} = await global.kuzzle.internalIndex.getMapping('users');
255
+ const { properties } = await global.kuzzle.internalIndex.getMapping('users');
256
256
 
257
- return {mapping: properties};
257
+ return { mapping: properties };
258
258
  }
259
259
 
260
260
  /**
@@ -275,7 +275,7 @@ class SecurityController extends NativeController {
275
275
  * @param {Request} request
276
276
  * @returns {Promise<Object>}
277
277
  */
278
- async getRole(request) {
278
+ async getRole (request) {
279
279
  const id = request.getId();
280
280
 
281
281
  const role = await this.ask('core:security:role:get', id);
@@ -289,7 +289,7 @@ class SecurityController extends NativeController {
289
289
  * @param {Request} request
290
290
  * @returns {Promise<Object>}
291
291
  */
292
- async mGetRoles(request) {
292
+ async mGetRoles (request) {
293
293
  const ids = request.getBodyArray('ids');
294
294
  const roles = await this.ask('core:security:role:mGet', ids);
295
295
 
@@ -305,7 +305,7 @@ class SecurityController extends NativeController {
305
305
  async refresh (request) {
306
306
  const collection = request.getCollection();
307
307
 
308
- if (!this.securityCollections.includes(collection)) {
308
+ if (! this.securityCollections.includes(collection)) {
309
309
  throw kerror.get(
310
310
  'api',
311
311
  'assert',
@@ -360,7 +360,7 @@ class SecurityController extends NativeController {
360
360
  * @param {Request} request
361
361
  * @returns {Promise<Object>}
362
362
  */
363
- async createOrReplaceRole(request) {
363
+ async createOrReplaceRole (request) {
364
364
  const id = request.getId();
365
365
  const body = request.getBody();
366
366
  const userId = request.getKuid();
@@ -402,7 +402,7 @@ class SecurityController extends NativeController {
402
402
  * @param {Request} request
403
403
  * @returns {Promise<Object>}
404
404
  */
405
- async deleteRole(request) {
405
+ async deleteRole (request) {
406
406
  const id = request.getId();
407
407
 
408
408
  await this.ask('core:security:role:delete', id, {
@@ -422,7 +422,7 @@ class SecurityController extends NativeController {
422
422
  * @param {Request} request
423
423
  * @returns {Promise<Object>}
424
424
  */
425
- async getProfile(request) {
425
+ async getProfile (request) {
426
426
  const id = request.getId();
427
427
 
428
428
  const profile = await this.ask('core:security:profile:get', id);
@@ -436,7 +436,7 @@ class SecurityController extends NativeController {
436
436
  * @param {Request} request
437
437
  * @returns {Promise<Object>}
438
438
  */
439
- async mGetProfiles(request) {
439
+ async mGetProfiles (request) {
440
440
  const ids = request.getBodyArray('ids');
441
441
 
442
442
  const profiles = await this.ask('core:security:profile:mGet', ids);
@@ -512,7 +512,7 @@ class SecurityController extends NativeController {
512
512
  * @param {Request} request
513
513
  * @returns {Promise<Object>}
514
514
  */
515
- async deleteProfile(request) {
515
+ async deleteProfile (request) {
516
516
  const id = request.getId();
517
517
  const userId = request.getKuid();
518
518
  const options = {
@@ -579,7 +579,7 @@ class SecurityController extends NativeController {
579
579
  * @param {Request} request
580
580
  * @returns {Promise<Object>}
581
581
  */
582
- async getUser(request) {
582
+ async getUser (request) {
583
583
  const id = request.getId();
584
584
  const user = await this.ask('core:security:user:get', id);
585
585
 
@@ -592,7 +592,7 @@ class SecurityController extends NativeController {
592
592
  * @param {Request} request
593
593
  * @returns {Promise.<Object>}
594
594
  */
595
- async mGetUsers(request) {
595
+ async mGetUsers (request) {
596
596
  let ids;
597
597
 
598
598
  if ( request.input.body
@@ -616,7 +616,7 @@ class SecurityController extends NativeController {
616
616
  * @param {Request} request
617
617
  * @returns {Promise<Object>}
618
618
  */
619
- async getProfileRights(request) {
619
+ async getProfileRights (request) {
620
620
  const id = request.getId();
621
621
 
622
622
  const profile = await this.ask('core:security:profile:get', id);
@@ -637,7 +637,7 @@ class SecurityController extends NativeController {
637
637
  * @param {Request} request
638
638
  * @returns {Promise<Object>}
639
639
  */
640
- async getUserRights(request) {
640
+ async getUserRights (request) {
641
641
  const id = request.getId();
642
642
 
643
643
  const user = await this.ask('core:security:user:get', id);
@@ -658,7 +658,7 @@ class SecurityController extends NativeController {
658
658
  * @param {Request} request
659
659
  * @returns {Promise<Object>}
660
660
  */
661
- async getUserStrategies(request) {
661
+ async getUserStrategies (request) {
662
662
  const userId = request.getId();
663
663
  const checkPromises = [];
664
664
 
@@ -695,7 +695,7 @@ class SecurityController extends NativeController {
695
695
  * @param {Request} request
696
696
  * @returns {Promise<Object>}
697
697
  */
698
- async searchUsers(request) {
698
+ async searchUsers (request) {
699
699
  const size = this._getSearchPageSize(request);
700
700
  const { from, scrollTTL, searchBody } = request.getSearchParams();
701
701
  const lang = request.getLangParam();
@@ -751,7 +751,7 @@ class SecurityController extends NativeController {
751
751
  * @param {Request} request
752
752
  * @returns {Promise<Object>}
753
753
  */
754
- async deleteUser(request) {
754
+ async deleteUser (request) {
755
755
  const id = request.getId();
756
756
  const options = { refresh: request.getRefresh('wait_for') };
757
757
 
@@ -768,7 +768,7 @@ class SecurityController extends NativeController {
768
768
  * @param {Request} request
769
769
  * @returns {Promise<Object>}
770
770
  */
771
- async createUser(request) {
771
+ async createUser (request) {
772
772
  const content = request.getBodyObject('content');
773
773
  const profileIds = get(content, 'profileIds');
774
774
  const humanReadableId = request.getString('kuid', 'human') !== 'uuid';
@@ -777,7 +777,7 @@ class SecurityController extends NativeController {
777
777
  throw kerror.get('api', 'assert', 'missing_argument', 'body.content.profileIds');
778
778
  }
779
779
 
780
- if (!Array.isArray(profileIds)) {
780
+ if (! Array.isArray(profileIds)) {
781
781
  throw kerror.get('api', 'assert', 'invalid_type', 'body.content.profileIds', 'array');
782
782
  }
783
783
 
@@ -790,7 +790,7 @@ class SecurityController extends NativeController {
790
790
  * @param {Request} request
791
791
  * @returns {Promise<Object>}
792
792
  */
793
- async createRestrictedUser(request) {
793
+ async createRestrictedUser (request) {
794
794
  const content = request.getBodyObject('content', {});
795
795
  const humanReadableId = request.getString('kuid', 'human') !== 'uuid';
796
796
 
@@ -811,7 +811,7 @@ class SecurityController extends NativeController {
811
811
  * @param {Request} request
812
812
  * @returns {Promise<Object>}
813
813
  */
814
- async updateUser(request) {
814
+ async updateUser (request) {
815
815
  const id = request.getId();
816
816
  const content = request.getBody();
817
817
  const userId = request.getKuid();
@@ -865,7 +865,7 @@ class SecurityController extends NativeController {
865
865
  * @param {Request} request
866
866
  * @returns {Promise<Object>}
867
867
  */
868
- async updateProfile(request) {
868
+ async updateProfile (request) {
869
869
  const id = request.getId();
870
870
  const body = request.getBody();
871
871
  const userId = request.getKuid();
@@ -887,7 +887,7 @@ class SecurityController extends NativeController {
887
887
  * @param {Request} request
888
888
  * @returns {Promise<Object>}
889
889
  */
890
- async updateRole(request) {
890
+ async updateRole (request) {
891
891
  const id = request.getId();
892
892
  const body = request.getBody();
893
893
  const userId = request.getKuid();
@@ -951,7 +951,7 @@ class SecurityController extends NativeController {
951
951
  * @param {Request} request
952
952
  * @returns {Promise<Object>}
953
953
  */
954
- mDeleteProfiles(request) {
954
+ mDeleteProfiles (request) {
955
955
  return this._mDelete('profile', request);
956
956
  }
957
957
 
@@ -961,7 +961,7 @@ class SecurityController extends NativeController {
961
961
  * @param {Request} request
962
962
  * @returns {Promise<Object>}
963
963
  */
964
- mDeleteRoles(request) {
964
+ mDeleteRoles (request) {
965
965
  return this._mDelete('role', request);
966
966
  }
967
967
 
@@ -971,7 +971,7 @@ class SecurityController extends NativeController {
971
971
  * @param {Request} request
972
972
  * @returns {Promise<Object>}
973
973
  */
974
- mDeleteUsers(request) {
974
+ mDeleteUsers (request) {
975
975
  return this._mDelete('user', request);
976
976
  }
977
977
 
@@ -981,7 +981,7 @@ class SecurityController extends NativeController {
981
981
  * @param {Request} request
982
982
  * @returns {Promise<Object>}
983
983
  */
984
- async scrollUsers(request) {
984
+ async scrollUsers (request) {
985
985
  const id = request.getString('scrollId');
986
986
  const ttl = request.getScrollTTLParam();
987
987
 
@@ -998,7 +998,7 @@ class SecurityController extends NativeController {
998
998
  * @param {Request} request
999
999
  * @returns {Promise<Object>}
1000
1000
  */
1001
- async scrollProfiles(request) {
1001
+ async scrollProfiles (request) {
1002
1002
  const id = request.getString('scrollId');
1003
1003
  const ttl = request.getScrollTTLParam();
1004
1004
 
@@ -1013,7 +1013,7 @@ class SecurityController extends NativeController {
1013
1013
  * @param {Request} request
1014
1014
  * @returns {Promise<Object>}
1015
1015
  */
1016
- async createCredentials(request) {
1016
+ async createCredentials (request) {
1017
1017
  const id = request.getId();
1018
1018
  const body = request.getBody();
1019
1019
  const strategy = request.getString('strategy');
@@ -1037,7 +1037,7 @@ class SecurityController extends NativeController {
1037
1037
  * @param {Request} request
1038
1038
  * @returns {Promise<Object>}
1039
1039
  */
1040
- async updateCredentials(request) {
1040
+ async updateCredentials (request) {
1041
1041
  const id = request.getId();
1042
1042
  const body = request.getBody();
1043
1043
  const strategy = request.getString('strategy');
@@ -1062,7 +1062,7 @@ class SecurityController extends NativeController {
1062
1062
  * @param {Request} request
1063
1063
  * @returns {Promise.<Object>}
1064
1064
  */
1065
- async hasCredentials(request) {
1065
+ async hasCredentials (request) {
1066
1066
  const id = request.getId();
1067
1067
  const strategy = request.getString('strategy');
1068
1068
 
@@ -1077,7 +1077,7 @@ class SecurityController extends NativeController {
1077
1077
  * @param {Request} request
1078
1078
  * @returns {Promise.<Object>}
1079
1079
  */
1080
- async validateCredentials(request) {
1080
+ async validateCredentials (request) {
1081
1081
  const strategy = request.getString('strategy');
1082
1082
 
1083
1083
  this.assertIsStrategyRegistered(strategy);
@@ -1096,7 +1096,7 @@ class SecurityController extends NativeController {
1096
1096
  * @param {Request} request
1097
1097
  * @returns {Promise<Object>}
1098
1098
  */
1099
- async deleteCredentials(request) {
1099
+ async deleteCredentials (request) {
1100
1100
  const id = request.getId();
1101
1101
  const strategy = request.getString('strategy');
1102
1102
 
@@ -1108,14 +1108,14 @@ class SecurityController extends NativeController {
1108
1108
 
1109
1109
  global.kuzzle.log.info(`[SECURITY] User "${request.getKuid()}" applied action "${request.input.action}" on user "${id}."`);
1110
1110
 
1111
- return {acknowledged: true};
1111
+ return { acknowledged: true };
1112
1112
  }
1113
1113
 
1114
1114
  /**
1115
1115
  * @param {Request} request
1116
1116
  * @returns {Promise<Object>}
1117
1117
  */
1118
- async getCredentials(request) {
1118
+ async getCredentials (request) {
1119
1119
  const id = request.getId();
1120
1120
  const strategy = request.getString('strategy');
1121
1121
 
@@ -1134,7 +1134,7 @@ class SecurityController extends NativeController {
1134
1134
  * @param {Request} request
1135
1135
  * @returns {Promise<Object>}
1136
1136
  */
1137
- async getCredentialsById(request) {
1137
+ async getCredentialsById (request) {
1138
1138
  const id = request.getId();
1139
1139
  const strategy = request.getString('strategy');
1140
1140
 
@@ -1153,7 +1153,7 @@ class SecurityController extends NativeController {
1153
1153
  * @param {Request} request
1154
1154
  * @returns {Promise<Object>}
1155
1155
  */
1156
- async getCredentialFields(request) {
1156
+ async getCredentialFields (request) {
1157
1157
  const strategy = request.getString('strategy');
1158
1158
 
1159
1159
  this.assertIsStrategyRegistered(strategy);
@@ -1164,7 +1164,7 @@ class SecurityController extends NativeController {
1164
1164
  /**
1165
1165
  * @returns {Promise<Object>}
1166
1166
  */
1167
- async getAllCredentialFields() {
1167
+ async getAllCredentialFields () {
1168
1168
  const strategyFields = {};
1169
1169
 
1170
1170
  global.kuzzle.pluginsManager.listStrategies()
@@ -1180,7 +1180,7 @@ class SecurityController extends NativeController {
1180
1180
  * @param {Request} request
1181
1181
  * @returns {Promise.<null>}
1182
1182
  */
1183
- async revokeTokens(request) {
1183
+ async revokeTokens (request) {
1184
1184
  const id = request.getId();
1185
1185
 
1186
1186
  await this.ask('core:security:token:deleteByKuid', id);
@@ -1207,7 +1207,7 @@ class SecurityController extends NativeController {
1207
1207
 
1208
1208
  await Bluebird.map(
1209
1209
  ids,
1210
- id => this.ask(`core:security:${type}:delete`, id, {refresh})
1210
+ id => this.ask(`core:security:${type}:delete`, id, { refresh })
1211
1211
  .then(() => successes.push(id))
1212
1212
  .catch(err => errors.push(err)));
1213
1213
 
@@ -1231,7 +1231,7 @@ class SecurityController extends NativeController {
1231
1231
  * @returns {Promise}
1232
1232
  * @private
1233
1233
  */
1234
- async _persistUser(request, profileIds, content, { humanReadableId=true } = {}) {
1234
+ async _persistUser (request, profileIds, content, { humanReadableId = true } = {}) {
1235
1235
  const credentials = request.getBodyObject('credentials', {});
1236
1236
  const strategies = Object.keys(credentials);
1237
1237
  const generator = humanReadableId
@@ -1253,7 +1253,7 @@ class SecurityController extends NativeController {
1253
1253
  });
1254
1254
 
1255
1255
  for (const strategy of strategies) {
1256
- if (!global.kuzzle.pluginsManager.listStrategies().includes(strategy)) {
1256
+ if (! global.kuzzle.pluginsManager.listStrategies().includes(strategy)) {
1257
1257
  throw kerror.get(
1258
1258
  'security',
1259
1259
  'credentials',
@@ -1293,12 +1293,12 @@ class SecurityController extends NativeController {
1293
1293
 
1294
1294
  for (const strategy of strategies) {
1295
1295
  try {
1296
- const validate = this.getStrategyMethod(strategy,'validate');
1296
+ const validate = this.getStrategyMethod(strategy, 'validate');
1297
1297
 
1298
1298
  await validate(request, credentials[strategy], id, strategy, false);
1299
1299
  }
1300
1300
  catch (error) {
1301
- creationFailure = {error, validation: true};
1301
+ creationFailure = { error, validation: true };
1302
1302
  break;
1303
1303
  }
1304
1304
 
@@ -1309,7 +1309,7 @@ class SecurityController extends NativeController {
1309
1309
  createdStrategies.push(strategy);
1310
1310
  }
1311
1311
  catch (error) {
1312
- creationFailure = {error, validation: false};
1312
+ creationFailure = { error, validation: false };
1313
1313
  break;
1314
1314
  }
1315
1315
  }
@@ -1379,7 +1379,7 @@ class SecurityController extends NativeController {
1379
1379
  * @param {number} limit
1380
1380
  * @throws
1381
1381
  */
1382
- _getSearchPageSize(request) {
1382
+ _getSearchPageSize (request) {
1383
1383
  const size = request.getInteger(
1384
1384
  'size',
1385
1385
  global.kuzzle.config.limits.documentsFetchCount);
@@ -23,9 +23,9 @@
23
23
 
24
24
  const os = require('os');
25
25
  const jsonToYaml = require('json2yaml');
26
+ const packagejson = require('../../../package.json');
26
27
 
27
28
  const { NativeController } = require('./baseController');
28
- const { generateOpenApi } = require('../openApiGenerator');
29
29
 
30
30
  const kerror = require('../../kerror');
31
31
 
@@ -33,9 +33,10 @@ const kerror = require('../../kerror');
33
33
  * @class ServerController
34
34
  */
35
35
  class ServerController extends NativeController {
36
- constructor() {
36
+ constructor () {
37
37
  super([
38
38
  'adminExists',
39
+ 'capabilities',
39
40
  'getAllStats',
40
41
  'getConfig',
41
42
  'getLastStats',
@@ -48,12 +49,28 @@ class ServerController extends NativeController {
48
49
  'openapi',
49
50
  ]);
50
51
 
51
- this._openApiDefinition = {
52
- json: null,
53
- yaml: null,
52
+ this._info = {
53
+ elasticsearch: null,
54
+ redis: null,
54
55
  };
55
56
  }
56
57
 
58
+ /**
59
+ * Init ServerController
60
+ * Used to perform asynchronous initialization safely: the funnel will wait
61
+ * for all controllers to be initialized before accepting requests.
62
+ *
63
+ * @returns {Promise}
64
+ */
65
+ async init () {
66
+ const [storageInfo, cacheInfo] = await Promise.all([
67
+ global.kuzzle.ask('core:storage:public:info:get'),
68
+ global.kuzzle.ask('core:cache:public:info:get'),
69
+ ]);
70
+ this._info.elasticsearch = storageInfo;
71
+ this._info.redis = cacheInfo;
72
+ }
73
+
57
74
  /**
58
75
  * Returns the statistics frame from a date
59
76
  *
@@ -110,6 +127,39 @@ class ServerController extends NativeController {
110
127
  return config;
111
128
  }
112
129
 
130
+ /**
131
+ * Returns the Kuzzle capabilities
132
+ * @returns {Promise<Object>}
133
+ */
134
+ async capabilities () {
135
+ const config = JSON.parse(JSON.stringify(global.kuzzle.config));
136
+ const publicApi = await this.publicApi();
137
+ const services = {};
138
+ const plugins = {};
139
+
140
+ for (const plugin of config.plugins.common.include) {
141
+ plugins[plugin] = {
142
+ version: packagejson.dependencies[plugin]
143
+ };
144
+ }
145
+
146
+ for (const [name, info] of Object.entries(config.services)) {
147
+ if (info.backend !== undefined) {
148
+ services[name] = {
149
+ backend: info.backend,
150
+ version: this._info[info.backend].version,
151
+ };
152
+ }
153
+ }
154
+
155
+ return {
156
+ limits: config.limits,
157
+ plugins: plugins,
158
+ routes: publicApi,
159
+ services: services,
160
+ version: config.version,
161
+ };
162
+ }
113
163
  /**
114
164
  * Checks if an admin user Exists
115
165
  *
@@ -140,7 +190,7 @@ class ServerController extends NativeController {
140
190
  if (typeof request.input.args.services === 'string') {
141
191
  services = request.input.args.services.split(',');
142
192
  }
143
- if (!services || services.includes('internalCache')) {
193
+ if (! services || services.includes('internalCache')) {
144
194
  try {
145
195
  await global.kuzzle.ask('core:cache:internal:info:get');
146
196
  result.services.internalCache = 'green';
@@ -151,7 +201,7 @@ class ServerController extends NativeController {
151
201
  result.status = 'red';
152
202
  }
153
203
  }
154
- if (!services || services.includes('memoryStorage')) {
204
+ if (! services || services.includes('memoryStorage')) {
155
205
  try {
156
206
  await global.kuzzle.ask('core:cache:public:info:get');
157
207
  result.services.memoryStorage = 'green';
@@ -162,7 +212,7 @@ class ServerController extends NativeController {
162
212
  result.status = 'red';
163
213
  }
164
214
  }
165
- if (!services || services.includes('storageEngine')) {
215
+ if (! services || services.includes('storageEngine')) {
166
216
  try {
167
217
  const response = await global.kuzzle.ask('core:storage:public:info:get');
168
218
 
@@ -247,7 +297,19 @@ class ServerController extends NativeController {
247
297
 
248
298
  async openapi (request) {
249
299
  const format = request.getString('format', 'json');
250
- const specifications = this.getOpenApiDefinition(format);
300
+ const scope = request.getString('scope', 'kuzzle');
301
+
302
+ let definition;
303
+
304
+ if (scope === 'kuzzle') {
305
+ definition = await global.kuzzle.ask('core:api:openapi:kuzzle');
306
+ }
307
+ else if (scope === 'app') {
308
+ definition = await global.kuzzle.ask('core:api:openapi:app');
309
+ }
310
+ else {
311
+ throw kerror.get('api', 'assert', 'unexpected_argument', scope, ['kuzzle', 'app']);
312
+ }
251
313
 
252
314
  request.response.configure({
253
315
  format: 'raw',
@@ -255,23 +317,7 @@ class ServerController extends NativeController {
255
317
  status: 200,
256
318
  });
257
319
 
258
- return specifications;
259
- }
260
-
261
- /**
262
- * Lazy loading of OpenAPI definition.
263
- *
264
- * Mainly because we need to wait all plugin to be loaded
265
- * to generate the definition.
266
- */
267
- getOpenApiDefinition (format) {
268
- if (! this._openApiDefinition[format]) {
269
- this._openApiDefinition[format] = format === 'json'
270
- ? generateOpenApi()
271
- : jsonToYaml.stringify(generateOpenApi());
272
- }
273
-
274
- return this._openApiDefinition[format];
320
+ return format === 'json' ? definition : jsonToYaml.stringify(definition);
275
321
  }
276
322
 
277
323
  /**
@@ -293,7 +339,7 @@ class ServerController extends NativeController {
293
339
  const actionList = {};
294
340
 
295
341
  for (const action of controller._actions) {
296
- actionList[action] = { action , controller: name };
342
+ actionList[action] = { action, controller: name };
297
343
 
298
344
  // resolve associated http route for each actions
299
345
  const routes = httpRoutes.filter(route => {
@@ -229,7 +229,7 @@ const extractors = ([
229
229
  }, {});
230
230
 
231
231
  class DocumentExtractor {
232
- constructor(request) {
232
+ constructor (request) {
233
233
  this.request = request;
234
234
 
235
235
  const extractor = extractors[request.input.action];
@@ -248,11 +248,11 @@ class DocumentExtractor {
248
248
  }
249
249
  }
250
250
 
251
- extract() {
251
+ extract () {
252
252
  return this.extractMethod(this.request);
253
253
  }
254
254
 
255
- insert(documents) {
255
+ insert (documents) {
256
256
  return this.insertMethod(documents, this.request);
257
257
  }
258
258
  }