yahoi
Version:
Yet Another Highly Opinionated Isomorphic Framework
183 lines (145 loc) • 4.05 kB
JavaScript
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);
}
}
}