diff --git a/.eslintignore b/.eslintignore index d849ec6cc..581c5c65e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -12,3 +12,7 @@ src/core/security/Role.js src/utils/interfaces.js src/core/searchResult/SearchResultBase.js src/core/searchResult/Document.js +src/core/searchResult/Profile.js +src/core/searchResult/Role.js +src/core/searchResult/Specifications.js +src/core/searchResult/User.js diff --git a/.gitignore b/.gitignore index 1a1af6994..d0ef8a16d 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,7 @@ src/core/security/Role.js src/utils/interfaces.js src/core/searchResult/SearchResultBase.js src/core/searchResult/Document.js +src/core/searchResult/Profile.js +src/core/searchResult/Role.js +src/core/searchResult/Specifications.js +src/core/searchResult/User.js diff --git a/index.ts b/index.ts index b88efa680..8552aebd8 100644 --- a/index.ts +++ b/index.ts @@ -18,7 +18,7 @@ import { SearchResultBase } from './src/core/searchResult/SearchResultBase'; import { DocumentSearchResult } from './src/core/searchResult/Document'; import { ProfileSearchResult } from './src/core/searchResult/Profile'; import { RoleSearchResult } from './src/core/searchResult/Role'; -import { SpecificationSearchResult } from './src/core/searchResult/Specifications'; +import { SpecificationsSearchResult } from './src/core/searchResult/Specifications'; import { UserSearchResult } from './src/core/searchResult/User'; const exported = { @@ -32,7 +32,7 @@ const exported = { DocumentSearchResult, ProfileSearchResult, RoleSearchResult, - SpecificationSearchResult, + SpecificationsSearchResult, UserSearchResult } diff --git a/src/controllers/Auth.ts b/src/controllers/Auth.ts index 2d8ef3ce6..7ae066f9e 100644 --- a/src/controllers/Auth.ts +++ b/src/controllers/Auth.ts @@ -495,7 +495,7 @@ export class AuthController extends BaseController { */ _id: string; /** - * Expiration date in UNIX micro-timestamp format (-1 if the token never expires) + * Expiration date in Epoch-millis format (-1 if the token never expires) */ expiresAt: number; /** diff --git a/src/core/searchResult/Profile.js b/src/core/searchResult/Profile.js deleted file mode 100644 index ac7de860b..000000000 --- a/src/core/searchResult/Profile.js +++ /dev/null @@ -1,29 +0,0 @@ -const { Profile } = require('../security/Profile'); -const { SearchResultBase } = require('./SearchResultBase'); - -class ProfileSearchResult extends SearchResultBase { - constructor (kuzzle, request, options, response) { - super(kuzzle, request, options, response); - - this._searchAction = 'searchProfiles'; - this._scrollAction = 'scrollProfiles'; - this.hits = response.hits.map( - hit => new Profile(this._kuzzle, hit._id, hit._source)); - } - - next () { - return super.next() - .then(nextSearchResult => { - if (! nextSearchResult) { - return null; - } - - nextSearchResult.hits = nextSearchResult._response.hits.map( - hit => new Profile(nextSearchResult._kuzzle, hit._id, hit._source)); - - return nextSearchResult; - }); - } -} - -module.exports = { ProfileSearchResult }; diff --git a/src/core/searchResult/Profile.ts b/src/core/searchResult/Profile.ts new file mode 100644 index 000000000..08d9e131c --- /dev/null +++ b/src/core/searchResult/Profile.ts @@ -0,0 +1,29 @@ +import { Profile } from '../security/Profile'; +import { SearchResultBase } from './SearchResultBase'; + +export class ProfileSearchResult extends SearchResultBase { + constructor (kuzzle, request, options, response) { + super(kuzzle, request, options, response); + + this._searchAction = 'searchProfiles'; + this._scrollAction = 'scrollProfiles'; + this.hits = response.hits.map(hit => ( + new Profile(this._kuzzle, hit._id, hit._source) + )); + } + + next () { + return super.next() + .then((nextSearchResult: ProfileSearchResult) => { + if (! nextSearchResult) { + return null; + } + + nextSearchResult.hits = nextSearchResult._response.hits.map(hit => ( + new Profile(nextSearchResult._kuzzle, hit._id, hit._source) + )); + + return nextSearchResult; + }); + } +} diff --git a/src/core/searchResult/Role.js b/src/core/searchResult/Role.ts similarity index 63% rename from src/core/searchResult/Role.js rename to src/core/searchResult/Role.ts index 241e310da..4cbbb48aa 100644 --- a/src/core/searchResult/Role.js +++ b/src/core/searchResult/Role.ts @@ -1,7 +1,7 @@ -const { Role } = require('../security/Role'); -const { SearchResultBase } = require('./SearchResultBase'); +import { Role } from '../security/Role'; +import { SearchResultBase } from './SearchResultBase'; -class RoleSearchResult extends SearchResultBase { +export class RoleSearchResult extends SearchResultBase { constructor (kuzzle, query, options, response) { super(kuzzle, query, options, response); @@ -9,7 +9,9 @@ class RoleSearchResult extends SearchResultBase { this._searchAction = 'searchRoles'; this._scrollAction = null; // scrollRoles action does not exists in Kuzzle API. - this.hits = this._response.hits.map(hit => new Role(this._kuzzle, hit._id, hit._source.controllers)); + this.hits = this._response.hits.map(hit => ( + new Role(this._kuzzle, hit._id, hit._source.controllers) + )); } next () { @@ -20,16 +22,16 @@ class RoleSearchResult extends SearchResultBase { } return super.next() - .then(nextSearchResult => { + .then((nextSearchResult: RoleSearchResult) => { if (! nextSearchResult) { return null; } - nextSearchResult.hits = nextSearchResult._response.hits.map(hit => new Role(nextSearchResult._kuzzle, hit._id, hit._source.controllers)); + nextSearchResult.hits = nextSearchResult._response.hits.map(hit => ( + new Role(nextSearchResult._kuzzle, hit._id, hit._source.controllers) + )); return nextSearchResult; }); } } - -module.exports = { RoleSearchResult }; diff --git a/src/core/searchResult/SearchResultBase.ts b/src/core/searchResult/SearchResultBase.ts index a6c2da445..b183d54b2 100644 --- a/src/core/searchResult/SearchResultBase.ts +++ b/src/core/searchResult/SearchResultBase.ts @@ -55,17 +55,10 @@ export class SearchResultBase implements SearchResult { public fetched: number; - /** - * - * @param {Kuzzle} kuzzle - * @param {object} request - * @param {object} options - * @param {object} response - */ constructor ( kuzzle: Kuzzle, request: KuzzleRequest = {}, - options: any = {}, + options: JSONObject = {}, response: any = {} ) { Reflect.defineProperty(this, '_kuzzle', { @@ -80,10 +73,18 @@ export class SearchResultBase implements SearchResult { Reflect.defineProperty(this, '_response', { value: response }); - - this._controller = request.controller; - this._searchAction = 'search'; - this._scrollAction = 'scroll'; + Reflect.defineProperty(this, '_controller', { + value: request.controller, + writable: true + }); + Reflect.defineProperty(this, '_searchAction', { + value: 'search', + writable: true + }); + Reflect.defineProperty(this, '_scrollAction', { + value: 'scroll', + writable: true + }); this.aggregations = response.aggregations; this.hits = response.hits || []; @@ -166,7 +167,7 @@ export class SearchResultBase implements SearchResult { return Promise.reject(new Error('Unable to retrieve next results from search: missing scrollId, from/sort, or from/size params')); } - _get (object, path) { + protected _get (object, path) { if (!object) { return object; } @@ -179,7 +180,7 @@ export class SearchResultBase implements SearchResult { return this._get(object[key], path); } - _buildNextSearchResult (response) { + protected _buildNextSearchResult (response) { const Constructor: any = this.constructor; const nextSearchResult = new Constructor(this._kuzzle, this._request, this._options, response.result); @@ -187,7 +188,6 @@ export class SearchResultBase implements SearchResult { return nextSearchResult; } - } diff --git a/src/core/searchResult/Specifications.js b/src/core/searchResult/Specifications.ts similarity index 56% rename from src/core/searchResult/Specifications.js rename to src/core/searchResult/Specifications.ts index 15d2d2410..54b21df0f 100644 --- a/src/core/searchResult/Specifications.js +++ b/src/core/searchResult/Specifications.ts @@ -1,6 +1,7 @@ -const { SearchResultBase } = require('./SearchResultBase'); +import { SearchResultBase } from './SearchResultBase'; +import { JSONObject } from '../../utils/interfaces'; -class SpecificationsSearchResult extends SearchResultBase { +export class SpecificationsSearchResult extends SearchResultBase { constructor (kuzzle, query, options, response) { super(kuzzle, query, options, response); @@ -10,5 +11,3 @@ class SpecificationsSearchResult extends SearchResultBase { this._scrollAction = 'scrollSpecifications'; } } - -module.exports = { SpecificationsSearchResult }; diff --git a/src/core/searchResult/User.js b/src/core/searchResult/User.js deleted file mode 100644 index 20ec93dcb..000000000 --- a/src/core/searchResult/User.js +++ /dev/null @@ -1,27 +0,0 @@ -const { SearchResultBase } = require('./SearchResultBase'); -const { User } = require('../security/User'); - -class UserSearchResult extends SearchResultBase { - - constructor (kuzzle, query, options, response) { - super(kuzzle, query, options, response); - - this._searchAction = 'searchUsers'; - this._scrollAction = 'scrollUsers'; - this.hits = this._response.hits.map(hit => new User(this._kuzzle, hit._id, hit._source)); - } - - next () { - return super.next() - .then(nextSearchResult => { - if (! nextSearchResult) { - return null; - } - - nextSearchResult.hits = nextSearchResult._response.hits.map(hit => new User(nextSearchResult._kuzzle, hit._id, hit._source)); - return nextSearchResult; - }); - } -} - -module.exports = { UserSearchResult }; diff --git a/src/core/searchResult/User.ts b/src/core/searchResult/User.ts new file mode 100644 index 000000000..501b88b71 --- /dev/null +++ b/src/core/searchResult/User.ts @@ -0,0 +1,30 @@ +import { SearchResultBase } from './SearchResultBase'; +import { User } from '../security/User'; + +export class UserSearchResult extends SearchResultBase { + + constructor (kuzzle, query, options, response) { + super(kuzzle, query, options, response); + + this._searchAction = 'searchUsers'; + this._scrollAction = 'scrollUsers'; + this.hits = this._response.hits.map(hit => ( + new User(this._kuzzle, hit._id, hit._source) + )); + } + + next () { + return super.next() + .then((nextSearchResult: UserSearchResult) => { + if (! nextSearchResult) { + return null; + } + + nextSearchResult.hits = nextSearchResult._response.hits.map(hit => ( + new User(nextSearchResult._kuzzle, hit._id, hit._source) + )); + + return nextSearchResult; + }); + } +} diff --git a/src/core/security/Profile.ts b/src/core/security/Profile.ts index 12e18010a..044844635 100644 --- a/src/core/security/Profile.ts +++ b/src/core/security/Profile.ts @@ -52,6 +52,3 @@ export class Profile { options); } } - -module.exports = { Profile }; - diff --git a/src/utils/interfaces.ts b/src/utils/interfaces.ts index 6062231a3..fe4cc1f89 100644 --- a/src/utils/interfaces.ts +++ b/src/utils/interfaces.ts @@ -21,6 +21,7 @@ export interface KuzzleRequest extends JSONObject { jwt?: string; volatile?: JSONObject; body?: JSONObject; + [key: string]: any; } /** @@ -88,8 +89,14 @@ export interface ProfilePolicy { * @see https://docs.kuzzle.io/core/2/guides/essentials/security#defining-roles */ export interface RoleRightsDefinition { + /** + * API controller name + */ [key: string]: { actions: { + /** + * API action name + */ [key: string]: boolean } } @@ -112,7 +119,7 @@ export interface ApiKey { */ userId: string; /** - * Expiration date in UNIX micro-timestamp format (-1 if the token never expires) + * Expiration date in Epoch-millis format (-1 if the token never expires) */ expiresAt: number; /** @@ -178,6 +185,11 @@ export interface Document { /** * Document retrieved from a search + * + * @property _id + * @property _version + * @property _source + * @property _score */ export interface DocumentHit extends Document { /**