@avonjs/avonjs
Version:
A fluent Node.js API generator.
179 lines (178 loc) • 7.16 kB
JavaScript
"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;