UNPKG

adonis-api-resources

Version:
75 lines (74 loc) 2.19 kB
import EntityProcessor from './processors/entity.js'; import CollectionProcessor from './processors/collection.js'; import PaginatedProcessor from './processors/paginated.js'; import { paginate } from './utils/paginate.js'; export class Resource { data; constructor(data) { this.data = data; } _processor; isPaginated(data) { const ormPaginated = 'rows' in data && 'currentPage' in data; const odmPaginated = 'data' in data && 'meta' in data; const indeedPaginated = ormPaginated || odmPaginated; if (odmPaginated) data.getMeta = () => data.meta; return indeedPaginated; } isCollection(data) { return Array.isArray(data); } processor() { if (!this._processor) { if (this.isPaginated(this.data)) { this._processor = new PaginatedProcessor(new CollectionProcessor()); } else if (this.isCollection(this.data)) { this._processor = new CollectionProcessor(); } else { this._processor = new EntityProcessor(); } } return this._processor; } pick(...keys) { const processor = this.processor(); this.data = processor.pick(this.data, ...keys); return this; } omit(...keys) { const processor = this.processor(); this.data = processor.omit(this.data, ...keys); return this; } remap() { const processor = this.processor(); this.data = processor.remap(this.data, this.defineMap); return this; } paginate(page = 1, limit = 10) { if (!this.isCollection(this.data)) { throw new Error('Pagination requires an array of objects'); } this.data = paginate(this.data, page, limit); return this; } redefine() { return this.remap(); } get() { return this; } refine() { return this.remap(); } refinePaginate(page = 1, limit = 10) { return this.remap().paginate(page, limit); } } ; Resource.prototype.toJSON = function () { return this.data; };