UNPKG

yahoi

Version:

Yet Another Highly Opinionated Isomorphic Framework

183 lines (145 loc) 4.05 kB
import ParameterBag from './ParameterBag'; import Joi from 'joi'; import path from 'path'; import * as Renderer from './Renderer'; import * as Responders from './ResponderTypes'; export default class ActionContext { constructor(props) { this.res = props.res; this.req = props.req; this.action = props.action; this.controller = props.controller; this.response = null; this.renderer = props.renderer; this.app = props.app; this.config = props.config; this.__reject = props.reject; this.parameterBag = new ParameterBag({ parameters: props.req.query, body: props.req.body, routeParams: typeof(props.match)!='undefined' ? props.match.match : {}, autoReject: this.autoValidationReject.bind(this) }); this.Joi = Joi; this.__send = props.send; this.__sendHasBeenCalled = false; } // String renderString(str, data) { return (new Renderer.StringRenderer({ string: str, data: data })).render(); } sendString(str, data) { this.renderString(str, data).then(renderedString => { let Responder = new Responders.StringResponder({ string: renderedString }); this.response = Responder; this.__send(this); }).catch(e => { this.__send(String(e)); }); } // Raw send(body) { try { let Responder = new Responders.RawResponder({ body: body }); this.response = Responder; this.__send(this); } catch(e) { this.__send(String(e)); } } // Json renderJson(data) { return (new Renderer.JsonRenderer({ data: data })).render(); } sendJson(data) { this.renderJson(data).then(renderedJson => { let Responder = new Responders.JsonResponder({ data: renderedJson }); this.response = Responder; this.__send(this); }).catch(e => { this.__send(String(e)); }); } // View renderView(templatePath, data) { return (new Renderer.ViewRenderer({ filePath: path.resolve(this.controller.getViewDirectory(), templatePath), data: data })).render(); } sendView(templatePath, data) { this.renderView(templatePath, data).then(renderedView => { let Responder = new Responders.ViewResponder({ body: renderedView }); this.response = Responder; this.__send(this); }).catch(e => { this.__send(String(e)); }); } //Client renderClient(props) { console.log('r c'); return (new Renderer.ClientRenderer({ projectPath: path.resolve(this.controller.getProjectDirectory()), state: props.state || {}, req: this.req, targetView: props.view || 'Client/index' })).render(); } sendClient(props) { this.renderClient(props).then(renderedClient => { let Responder = new Responders.ClientResponder({ body: renderedClient }); this.response = Responder; this.__send(this); }).catch(e => { this.__send(String(e)); }); } require(schema) { this.parameterBag.setSchema(schema); } autoValidationReject(validationResult) { this.sendJson({ validationResult: validationResult }); } getEnvironment() { return this.app.getEnvironment(); } getService(name) { return this.app.getService(name) } /* sendComponent(componentPath) { this.response = new ResponseTypes.RenderComponent(path.resolve(this.controller.getComponentDirectory(), componentPath)) this.__send(this); } */ setResponse(response) { this.response = response; } getResponse() { return this.response; } redirect(url, props) { let Responder = new Responders.RedirectResponder({ url: url }); this.response = Responder; this.__send(this); } reject(e) { this.__reject(e); } run() { try { this.action(this.parameterBag); } catch(e) { console.log('rejecting due to error'); this.__reject(e); } } }