UNPKG

@avonjs/avonjs

Version:

A fluent Node.js API generator.

179 lines (178 loc) 7.16 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const pluralize_1 = require("pluralize"); const Contracts_1 = require("./Contracts"); const Authorizable_1 = __importDefault(require("./Mixins/Authorizable")); const FillsFields_1 = __importDefault(require("./Mixins/FillsFields")); const HasLifecycleMethods_1 = __importDefault(require("./Mixins/HasLifecycleMethods")); const PerformsQueries_1 = __importDefault(require("./Mixins/PerformsQueries")); const PerformsValidation_1 = __importDefault(require("./Mixins/PerformsValidation")); const RecordsResourceEvents_1 = __importDefault(require("./Mixins/RecordsResourceEvents")); const ResolvesActions_1 = __importDefault(require("./Mixins/ResolvesActions")); const ResolvesFields_1 = __importDefault(require("./Mixins/ResolvesFields")); const ResolvesFilters_1 = __importDefault(require("./Mixins/ResolvesFilters")); const ResolvesOrderings_1 = __importDefault(require("./Mixins/ResolvesOrderings")); const ResourceSchema_1 = __importDefault(require("./Mixins/ResourceSchema")); const helpers_1 = require("./helpers"); const mixin_1 = require("./support/mixin"); class Resource extends (0, mixin_1.mixin)(class { }, Authorizable_1.default, ResolvesFields_1.default, ResolvesFilters_1.default, ResolvesOrderings_1.default, ResolvesActions_1.default, ResourceSchema_1.default, FillsFields_1.default, PerformsValidation_1.default, PerformsQueries_1.default, RecordsResourceEvents_1.default, HasLifecycleMethods_1.default) { /** * The resource model instance. */ resource; /** * The number of results to display when searching relatable resource. */ relatableSearchResults = 10; constructor(resource) { super(); this.resource = resource ?? this.repository().model(); } /** * Create a new instance of the resource for the given model. */ forModel(resource) { const Constructor = this.constructor.prototype.constructor; return new Constructor(resource); } /** * Get the uri-key name of the resource */ uriKey() { return (0, helpers_1.slugify)((0, pluralize_1.plural)((0, pluralize_1.singular)(this.constructor.name))); } /** * Get the pagination per-page values */ perPageOptions() { return [15, 25, 50]; } /** * Prepare the resource for JSON serialization. */ async serializeForIndex(request) { return this.serializeIndex(request, this.indexFields(request, this.resource) .withoutUnresolvableFields() .fieldValues(request)); } /** * Prepare the resource for JSON serialization. */ async serializeForAssociation(request) { return this.serializeIndex(request, this.associationFields(request).fieldValues(request)); } /** * Prepare the resource for JSON serialization. */ async serializeIndex(request, fields) { return { metadata: this.resourceMetaData(), authorization: { authorizedToView: await this.authorizedTo(request, Contracts_1.Ability.view), authorizedToUpdate: await this.authorizedTo(request, Contracts_1.Ability.update), authorizedToDelete: await this.authorizedTo(request, Contracts_1.Ability.delete), authorizedToForceDelete: this.softDeletes() ? await this.authorizedTo(request, Contracts_1.Ability.forceDelete) : undefined, authorizedToRestore: this.softDeletes() ? await this.authorizedTo(request, Contracts_1.Ability.restore) : undefined, authorizedToReview: this.softDeletes() ? await this.authorizedTo(request, Contracts_1.Ability.restore) : undefined, }, fields, }; } /** * Prepare the resource for JSON serialization. */ async serializeForStore(request) { return { metadata: this.resourceMetaData(), authorization: { authorizedToUpdate: await this.authorizedTo(request, Contracts_1.Ability.update), authorizedToDelete: await this.authorizedTo(request, Contracts_1.Ability.delete), authorizedToForceDelete: this.softDeletes() ? await this.authorizedTo(request, Contracts_1.Ability.forceDelete) : undefined, }, fields: { id: this.resource.getKey() }, }; } /** * Prepare the resource for JSON serialization. */ async serializeForUpdate(request) { return { metadata: this.resourceMetaData(), authorization: { authorizedToDelete: await this.authorizedTo(request, Contracts_1.Ability.delete), authorizedToForceDelete: this.softDeletes() ? await this.authorizedTo(request, Contracts_1.Ability.forceDelete) : undefined, }, fields: { id: this.resource.getKey() }, }; } /** * Prepare the resource for JSON serialization. */ async serializeForDetail(request) { return { metadata: this.resourceMetaData(), authorization: { authorizedToUpdate: await this.authorizedTo(request, Contracts_1.Ability.update), authorizedToDelete: await this.authorizedTo(request, Contracts_1.Ability.delete), authorizedToForceDelete: this.softDeletes() ? await this.authorizedTo(request, Contracts_1.Ability.forceDelete) : undefined, }, fields: this.detailFields(request, this.resource) .withoutUnresolvableFields() .fieldValues(request), }; } /** * Prepare the resource for JSON serialization. */ async serializeForReview(request) { return { metadata: this.resourceMetaData(), authorization: { authorizedToForceDelete: await this.authorizedTo(request, Contracts_1.Ability.forceDelete), authorizedToRestore: await this.authorizedTo(request, Contracts_1.Ability.restore), }, fields: this.reviewFields(request, this.resource) .withoutUnresolvableFields() .fieldValues(request), }; } /** * Get the resource metadata. */ resourceMetaData() { return { softDeletes: this.softDeletes(), softDeleted: this.isSoftDeleted(), }; } /** * Determine whether a given resource is "soft-deleted". */ isSoftDeleted() { return (this.softDeletes() && this.repository().isSoftDeleted(this.resource)); } /** * Get the resource name fo events. */ resourceName() { return this.uriKey(); } } exports.default = Resource;