UNPKG

@avonjs/avonjs

Version:

A fluent Node.js API generator.

107 lines (106 loc) 3.89 kB
"use strict"; 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; };