adonis-api-resources
Version:
API resources for AdonisJS
75 lines (74 loc) • 2.19 kB
JavaScript
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;
};