@avonjs/avonjs
Version:
A fluent Node.js API generator.
231 lines (230 loc) • 7.05 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 Avon_1 = __importDefault(require("../../Avon"));
const Contracts_1 = require("../../Contracts");
const ModelNotFoundException_1 = __importDefault(require("../../Exceptions/ModelNotFoundException"));
const ResourceNotFoundException_1 = __importDefault(require("../../Exceptions/ResourceNotFoundException"));
const FormRequest_1 = __importDefault(require("./FormRequest"));
class AvonRequest extends FormRequest_1.default {
/**
* The repository transaction instance.
*/
_trx;
/**
* The user instance.
*/
_user = null;
/**
* Get the transaction instance.
*/
getTransaction() {
return this._trx;
}
/**
* Get the transaction instance.
*/
transaction(callback) {
return this.repository().transaction(async (repository, transaction) => {
this._trx = transaction;
const value = await callback(repository, transaction);
this._trx = undefined;
return value;
});
}
/**
* Determine if this request is a create or attach request.
*/
isCreateOrAttachRequest() {
return (this.type() === Contracts_1.RequestTypes.ResourceCreateOrAttachRequest ||
(this.query('editing') === 'true' &&
['create', 'attach'].includes(this.query('editMode'))));
}
/**
* Determine if this request is an update or update-attached request.
*/
isUpdateOrUpdateAttachedRequest() {
return (this.type() === Contracts_1.RequestTypes.ResourceUpdateOrUpdateAttachedRequest ||
(this.query('editing') === 'true' &&
['update', 'update-attached'].includes(this.query('editMode'))));
}
/**
* Determine if this request is a resource index request.
*/
isResourceIndexRequest() {
return this.type() === Contracts_1.RequestTypes.ResourceIndexRequest;
}
/**
* Determine if this request is a resource detail request.
*
* @return bool
*/
isResourceDetailRequest() {
return this.type() === Contracts_1.RequestTypes.ResourceDetailRequest;
}
/**
* Determine if this request is a resource review request.
*
* @return bool
*/
isResourceReviewRequest() {
return this.type() === Contracts_1.RequestTypes.ResourceReviewRequest;
}
/**
* Determine if this request is a resource association request.
*
* @return bool
*/
isResourceAssociationRequest() {
return this.type() === Contracts_1.RequestTypes.AssociableRequest;
}
/**
* Determine if this request is an action request.
*/
isActionRequest() {
return this.type() === Contracts_1.RequestTypes.ActionRequest;
}
/**
* Determine if this request is an schema request.
*/
isSchemaRequest() {
return this.type() === Contracts_1.RequestTypes.SchemaRequest;
}
/**
* Determine if this request is either create, attach, update, update-attached or action request.
*/
isFormRequest() {
return (this.isCreateOrAttachRequest() ||
this.isUpdateOrUpdateAttachedRequest() ||
this.isActionRequest());
}
/**
* Determine if this request is an index or detail request.
*/
isPresentationRequest() {
return this.isResourceIndexRequest() || this.isResourceDetailRequest();
}
/**
* Determine if this request is an delete or force-delete request.
*/
isDeleteRequest() {
return [
Contracts_1.RequestTypes.ResourceDeleteRequest,
Contracts_1.RequestTypes.ResourceForceDeleteRequest,
].includes(this.type());
}
/**
* Determine if the requested resource is soft deleting.
*/
resourceSoftDeletes() {
return this.resource().softDeletes();
}
/**
* Get the resource instance for the request or abort.
*/
resource() {
const resource = Avon_1.default.resourceForKey(this.resourceName());
ResourceNotFoundException_1.default.unless(resource);
return resource;
}
/**
* Get the repository for resource being requested.
*/
repository() {
this.logger()?.dump(`Resolving the "${this.resourceName()} repository ..."`);
return this.resource().resolveRepository(this);
}
/**
* Get the model for resource being requested.
*/
model() {
this.logger()?.dump(`Resolving the "${this.resourceName()} model ..."`);
return this.repository().model();
}
/**
* Make a new model for given attributes.
*/
newModel(attributes) {
const Constructor = this.model().constructor.prototype.constructor;
return new Constructor(attributes);
}
/**
* Create new instance of the resource being requested for given item.
*/
newResource(resource) {
return this.resource().forModel(resource ?? this.model());
}
/**
* Find the resource instance for the request or abort.
*/
async findResourceOrFail(resourceId) {
return this.newResource(await this.findModelOrFail(resourceId));
}
/**
* Find the resource instance for the request.
*/
async findResource(resourceId) {
return this.newResource(await this.findModel(resourceId));
}
/**
* Find the model instance for the request or throw an exception.
*/
async findModelOrFail(resourceId) {
const item = await this.findModel(resourceId);
ModelNotFoundException_1.default.unless(item);
return item;
}
/**
* Find the model instance for the request.
*/
async findModel(resourceId) {
this.logger()?.dump(`Searching repository "${this.resourceName()} by id ..."`);
return this.findModelQuery(resourceId).first();
}
/**
* Find the model instance for the request.
*/
findModelQuery(resourceId) {
return this.repository().whereKey(resourceId ?? this.resourceId());
}
/**
* Get resource "id" from route or query.
*/
resourceId() {
return this.route('resourceId') ?? this.query('resourceId');
}
/**
* Get resource "name" from route or query.
*/
resourceName() {
return this.route('resourceName') ?? this.query('resourceName');
}
/**
* Get trashed status.
*/
trashed() {
return this.query('trashed') ?? Contracts_1.TrashedStatus.DEFAULT;
}
/**
* Get jwt payload.
*/
auth() {
return this.getRequest().auth;
}
/**
* Get the user instance.
*/
user() {
return this._user;
}
/**
* Set the user instance.
*/
setUser(user) {
this._user = user;
return this;
}
}
exports.default = AvonRequest;