@absolunet/ioc2.1.0

View on GitHub

foundation/exceptions/Handler/drivers/ViewDriver.js

//--------------------------------------------------------
//-- Node IoC - Foundation - Exceptions - Handler - Drivers - View Driver
//--------------------------------------------------------

import Driver from './Driver';


/**
 * Pretty Error exception render driver.
 *
 * @memberof foundation.exceptions.Handler.drivers
 * @augments foundation.exceptions.Handler.drivers.Driver
 */
class ViewDriver extends Driver {

	/**
	 * Class dependencies: <code>['app']</code>.
	 *
	 * @type {Array<string>}
	 */
	static get dependencies() {
		return ['app'];
	}

	/**
	 * @inheritdoc
	 */
	render(exception, request, response) {
		if (this.wantsJson(request)) {
			return response.json(this.renderJson(exception));
		}

		return response.end(this.renderView(exception));
	}

	/**
	 * Render view template, if possible.
	 * If not, fallback on text.
	 *
	 * @param {Error} exception - The exception to render.
	 * @returns {string} The rendered exception.
	 */
	renderView(exception) {
		if (this.app.isBound('view') && this.app.isBound('view.resolver')) {
			const viewResolver = this.app.make('view.resolver');
			let viewName = `errors.${exception.status || 500}`;

			if (!viewResolver.exists(viewName)) {
				viewName = 'errors.generic';
			}

			if (viewResolver.exists(viewName)) {
				return this.app.make('view').make(viewName, { exception });
			}
		}

		return this.renderText();
	}

	/**
	 * Render plain text.
	 *
	 * @returns {string} The rendered text.
	 */
	renderText() {
		const text = 'Something went wrong...';

		if (this.app.isBound('translator')) {
			return this.app.make('translator').translate(text);
		}

		return text;
	}

}


export default ViewDriver;