UNPKG

@avonjs/avonjs

Version:

A fluent Node.js API generator.

231 lines (230 loc) 7.05 kB
"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;