@avonjs/avonjs
Version:
A fluent Node.js API generator.
107 lines (106 loc) • 3.89 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const Contracts_1 = require("../Contracts");
exports.default = (Parent) => {
class PerformQueries extends Parent {
/**
* Search repository for incoming request.
*/
async search(request, filters = [], orderings = [], withTrashed = Contracts_1.TrashedStatus.DEFAULT) {
return this.indexQuery(request, this.applySoftDeleteConstraint(await this.initializeSearch(request, filters, orderings), withTrashed));
}
/**
* Initialize the search configuration.
*/
async initializeSearch(request, filters = [], orderings = []) {
const queryBuilder = this.queryBuilder(request);
await this.applyFilters(request, queryBuilder, filters);
await this.applyOrderings(request, queryBuilder, orderings);
return queryBuilder;
}
/**
* Get query builder.
*/
queryBuilder(request) {
return this.resolveRepository(request);
}
/**
* Resolve the resource repository.
*/
resolveRepository(request) {
return this.repository().setTransaction(request.getTransaction());
}
/**
* Apply the soft-delete into given query.
*/
applySoftDeleteConstraint(queryBuilder, withTrashed) {
const callback = {
[Contracts_1.TrashedStatus.WITH]: 'withTrashed',
[Contracts_1.TrashedStatus.ONLY]: 'onlyTrashed',
[Contracts_1.TrashedStatus.DEFAULT]: 'applySoftDelete',
}[withTrashed];
if (this.softDeletes() !== true) {
return queryBuilder;
}
// @ts-ignore
return queryBuilder[callback]();
}
/**
* Apply any applicable filters to the repository.
*/
async applyFilters(request, queryBuilder, filters) {
await Promise.all(filters.map(({ handler, value }) => {
return handler.apply(request, queryBuilder, value);
}));
return queryBuilder;
}
/**
* Apply any applicable orders to the repository.
*/
async applyOrderings(request, queryBuilder, orderings = []) {
await Promise.all(orderings.map(({ handler, value }) => {
return handler.apply(request, queryBuilder, value === Contracts_1.Direction.DESC ? Contracts_1.Direction.DESC : Contracts_1.Direction.ASC);
}));
return queryBuilder;
}
/**
* Build a "relatable" query for the given resource.
*
* This query determines which instances of the model may be attached to other resources.
*/
relatableQuery(request, queryBuilder) {
return queryBuilder;
}
/**
* Build an "index" query for the given resource.
*/
indexQuery(request, queryBuilder) {
return queryBuilder;
}
/**
* Build a "detail" query for the given resource.
*/
detailQuery(request, queryBuilder) {
return queryBuilder;
}
/**
* Build a "review" query for the given resource.
*/
reviewQuery(request, queryBuilder) {
return queryBuilder;
}
/**
* Determine if this resource uses soft deletes.
*/
softDeletes() {
return (
//@ts-ignore
typeof this.repository().withTrashed === 'function' &&
//@ts-ignore
typeof this.repository().onlyTrashed === 'function' &&
//@ts-ignore
typeof this.repository().applySoftDelete === 'function');
}
}
return PerformQueries;
};