You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					281 lines
				
				7.7 KiB
			
		
		
			
		
	
	
					281 lines
				
				7.7 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = void 0; | ||
|  | 
 | ||
|  | var _ = require(".."); | ||
|  | 
 | ||
|  | var _utils = require("../../utils"); | ||
|  | 
 | ||
|  | var _decorators = require("../../decorators"); | ||
|  | 
 | ||
|  | /* eslint-disable @typescript-eslint/no-empty-function */ | ||
|  | 
 | ||
|  | /* eslint-disable @typescript-eslint/no-unused-vars */ | ||
|  | 
 | ||
|  | /* eslint class-methods-use-this: 0 no-unused-vars: 0 */ | ||
|  | 
 | ||
|  | /* eslint no-useless-constructor: 0 */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * Representation of a ORM Resource in AdminJS. Visually resource is a list item in the sidebar. | ||
|  |  * Each resource has many records and many properties. | ||
|  |  * | ||
|  |  * Analogy is REST resource. | ||
|  |  * | ||
|  |  * It is an __abstract class__ and all database adapters should implement extend it implement | ||
|  |  * following methods: | ||
|  |  * | ||
|  |  * - (static) {@link BaseResource.isAdapterFor isAdapterFor()} | ||
|  |  * - {@link BaseResource#databaseName databaseName()} | ||
|  |  * - {@link BaseResource#name name()} | ||
|  |  * - {@link BaseResource#id id()} | ||
|  |  * - {@link BaseResource#properties properties()} | ||
|  |  * - {@link BaseResource#property property()} | ||
|  |  * - {@link BaseResource#count count()} | ||
|  |  * - {@link BaseResource#find find()} | ||
|  |  * - {@link BaseResource#findOne findOne()} | ||
|  |  * - {@link BaseResource#findMany findMany()} | ||
|  |  * - {@link BaseResource#create create()} | ||
|  |  * - {@link BaseResource#update update()} | ||
|  |  * - {@link BaseResource#delete delete()} | ||
|  |  * @category Base | ||
|  |  * @abstract | ||
|  |  * @hideconstructor | ||
|  |  */ | ||
|  | class BaseResource { | ||
|  |   /** | ||
|  |    * Checks if given adapter supports resource provided by the user. | ||
|  |    * This function has to be implemented only if you want to create your custom | ||
|  |    * database adapter. | ||
|  |    * | ||
|  |    * For one time Admin Resource creation - it is not needed. | ||
|  |    * | ||
|  |    * @param  {any}  rawResource resource provided in AdminJSOptions#resources array | ||
|  |    * @return {Boolean}          if given adapter supports this resource - returns true | ||
|  |    * @abstract | ||
|  |    */ | ||
|  |   static isAdapterFor(rawResource) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource.isAdapterFor'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Creates given resource based on the raw resource object | ||
|  |    * | ||
|  |    * @param   {Object}  [resource] | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   constructor(resource) { | ||
|  |     this._decorated = null; | ||
|  |   } | ||
|  |   /** | ||
|  |    * The name of the database to which resource belongs. When resource is | ||
|  |    * a mongoose model it should be database name of the mongo database. | ||
|  |    * | ||
|  |    * Visually, by default, all resources are nested in sidebar under their database names. | ||
|  |    * @return {String}         database name | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   databaseName() { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#databaseName'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Returns type of the database. It is used to compute sidebar icon for | ||
|  |    * given resource. Default: 'database' | ||
|  |    * @return {String} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   databaseType() { | ||
|  |     return 'other'; | ||
|  |   } | ||
|  |   /** | ||
|  |    * Each resource has to have uniq id which will be put to an URL of AdminJS routes. | ||
|  |    * For instance in {@link Router} path for the `new` form is `/resources/{resourceId}/new` | ||
|  |    * @return {String} uniq resource id | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   id() { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#id'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * returns array of all properties which belongs to resource | ||
|  |    * @return {BaseProperty[]} | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   properties() { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#properties'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * returns property object for given field | ||
|  |    * @param {String} path           path/name of the property. Take a look at | ||
|  |    *                                {@link BaseProperty} to learn more about | ||
|  |    *                                property paths. | ||
|  |    * @return {BaseProperty | null} | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   property(path) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#property'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Returns number of elements for given resource by including filters | ||
|  |    * @param  {Filter} filter        represents what data should be included | ||
|  |    * @return {Promise<Number>} | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async count(filter) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#count'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Returns actual records for given resource | ||
|  |    * | ||
|  |    * @param  {Filter} filters                        what data should be included | ||
|  |    * @param  {Object} options | ||
|  |    * @param  {Number} [options.limit]                  how many records should be taken | ||
|  |    * @param  {Number} [options.offset]                 offset | ||
|  |    * @param  {Object} [options.sort]                   sort | ||
|  |    * @param  {Number} [options.sort.sortBy]            sortable field | ||
|  |    * @param  {Number} [options.sort.direction]         either asc or desc | ||
|  |    * @return {Promise<BaseRecord[]>}                          list of records | ||
|  |    * @abstract | ||
|  |    * @example | ||
|  |    * // filters example
 | ||
|  |    * { | ||
|  |    *    name: 'Tom', | ||
|  |    *    createdAt: { from: '2019-01-01', to: '2019-01-18' } | ||
|  |    * } | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async find(filter, options) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#find'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Finds one Record in the Resource by its id | ||
|  |    * | ||
|  |    * @param  {String} id      uniq id of the Resource Record | ||
|  |    * @return {Promise<BaseRecord> | null}   record | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async findOne(id) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#findOne'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Finds many records based on the resource ids | ||
|  |    * | ||
|  |    * @param   {Array<string>}              list of ids to find | ||
|  |    * | ||
|  |    * @return  {Promise<Array<BaseRecord>>} records | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async findMany(ids) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#findMany'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Builds new Record of given Resource. | ||
|  |    * | ||
|  |    * Each Record is an representation of the resource item. Before it can be saved, | ||
|  |    * it has to be instantiated. | ||
|  |    * | ||
|  |    * This function has to be implemented if you want to create new records. | ||
|  |    * | ||
|  |    * @param  {Record<string, any>} params | ||
|  |    * @return {BaseRecord} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   build(params) { | ||
|  |     return new _.BaseRecord(params, this); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Creates new record | ||
|  |    * | ||
|  |    * @param  {Record<string, any>}     params | ||
|  |    * @return {Promise<Object>}         created record converted to raw Object which | ||
|  |    *                                   can be used to initiate new {@link BaseRecord} instance | ||
|  |    * @throws {ValidationError}         If there are validation errors it should be thrown | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async create(params) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#create'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Updates an the record. | ||
|  |    * | ||
|  |    * @param  {String} id               uniq id of the Resource Record | ||
|  |    * @param  {Record<string, any>}     params | ||
|  |    * @return {Promise<Object>}         created record converted to raw Object which | ||
|  |    *                                   can be used to initiate new {@link BaseRecord} instance | ||
|  |    * @throws {ValidationError}         If there are validation errors it should be thrown | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async update(id, params) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#update'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Delete given record by id | ||
|  |    * | ||
|  |    * @param  {String | Number}           id id of the Record | ||
|  |    * @throws {ValidationError}           If there are validation errors it should be thrown | ||
|  |    * @abstract | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   async delete(id) { | ||
|  |     throw new _utils.NotImplementedError('BaseResource#delete'); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Assigns given decorator to the Resource. Than it will be available under | ||
|  |    * resource.decorate() method | ||
|  |    * | ||
|  |    * @param  {BaseDecorator}  Decorator | ||
|  |    * @param  {AdminJS}       admin         current instance of AdminJS | ||
|  |    * @param  {ResourceOptions} [options] | ||
|  |    * @private | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   assignDecorator(admin, options = {}) { | ||
|  |     this._decorated = new _decorators.ResourceDecorator({ | ||
|  |       resource: this, | ||
|  |       admin, | ||
|  |       options | ||
|  |     }); | ||
|  |   } | ||
|  |   /** | ||
|  |    * Gets decorator object for given resource | ||
|  |    * @return {BaseDecorator | null} | ||
|  |    */ | ||
|  | 
 | ||
|  | 
 | ||
|  |   decorate() { | ||
|  |     if (!this._decorated) { | ||
|  |       throw new Error('resource does not have any assigned decorator yet'); | ||
|  |     } | ||
|  | 
 | ||
|  |     return this._decorated; | ||
|  |   } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | var _default = BaseResource; | ||
|  | exports.default = _default; |