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
						
					
					
				| "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; |