Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Routing and Controllers #27

Merged
merged 9 commits into from
Nov 30, 2016
14 changes: 12 additions & 2 deletions eos-cli/actions/action_helpers/env_config.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
const Util = require('../../util/util.js');
const Servers = require(`../../../templates/servers/servers.js`);
const Routers = require(`../../../templates/servers/routers.js`);
const Controllers = require(`../../../templates/servers/controllers.js`);
const Start = require('./start.js');

const defaultExpress = (path, name) => {
Expand All @@ -9,8 +11,10 @@ const defaultExpress = (path, name) => {
&& cd ${name} \
&& mkdir static \
&& echo "${Servers.express()}" >> ${name}.js \
&& echo "${Routers.express()}" >> routes.js \
&& echo "${Controllers.express()}" >> controller.js \
&& npm init --yes \
&& npm install --save express morgan \
&& npm install --save express morgan eos-redux body-parser \
`).on('close', (data) => {
console.log(Util.chalk.blue('Created Express Server'));
console.log('Installing server dependencies. This could take a few minutes...');
Expand All @@ -22,8 +26,10 @@ const express = (name) => {
mkdir ${name} \
&& cd ${name} \
&& echo "${Servers.express()}" >> ${name}.js \
&& echo "${Routers.express()}" >> routes.js \
&& echo "${Controllers.express()}" >> controller.js \
&& npm init --yes \
&& npm install --save express morgan \
&& npm install --save express morgan eos-redux body-parser \
`).on('close', (data) => {
console.log(Util.chalk.blue('Created Express Server'));
console.log('Installing server dependencies. This could take a few minutes...');
Expand All @@ -36,10 +42,14 @@ const flask = (name) => {
&& mkdir ${name} \
&& cd ${name} \
&& echo "${Servers.flask()}" >> ${name}.py \
&& echo "${Routers.flask()}" >> routes.py \
&& echo "${Controllers.flask()}" >> controller.py \
&& pip install virtualenv \
&& virtualenv -p python3 venv \
&& source venv/bin/activate \
&& pip install flask \
&& pip install requests \
&& pip install eos_python_utils \
&& pip freeze > requirements.txt \
&& deactivate \
`).on('close', (data) => {
Expand Down
28 changes: 28 additions & 0 deletions templates/servers/controllers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
const express = () => {
return `module.exports = {

root(){
return 'This is the Root';
}

};`
};

const flask = () => {
return `def root():
return 'ROOT'

def error(code):
errors = {
404: 'Route Not Found'
}
text = errors[code]
return 'ERROR: ' + str(code) + ' ' + text`
};

const Controllers = {
express: express,
flask: flask
}

module.exports = Controllers;
48 changes: 48 additions & 0 deletions templates/servers/routers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
const express = () => {
return `const [GET, POST, PUT, PATCH, DELETE] = [{}, {}, {}, {}, {}];

GET['/'] = 'root';
GET['/test'] = 'test';
GET['/test/nest'] = 'nest';
GET['/test/nest/{id}'] = 'param';
GET['/test/nest/{id}/edit'] = 'param2';

POST['/testpost'] = 'testpost';

//to add routes:
//<METHOD>[<route>] = <controller action>

const Routes = {
GET: GET,
POST: POST,
PUT: PUT,
PATCH: PATCH,
DELETE: DELETE
};

module.exports = Routes;`
};

const flask = () => {
return `from collections import defaultdict
GET = defaultdict(lambda: None)
POST = defaultdict(lambda: None)
PATCH = defaultdict(lambda: None)
PUT = defaultdict(lambda: None)
DELETE = defaultdict(lambda: None)

GET['/'] = 'root'

# To add routes:
# <METHOD>[<route>] = <controller action>

def routes_for(method):
return globals()[method]`
};

const Routers = {
express: express,
flask: flask
};

module.exports = Routers;
91 changes: 72 additions & 19 deletions templates/servers/servers.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,62 @@
const express = () => {
return `const express = require('express');
const app = express();
var path = require('path');
var logger = require('morgan');
const Routes = require('./routes');
const Routing = require('eos-redux/utils/routing');
const Errors = require('eos-redux/utils/errors');
const Controller = require('./controller');
const path = require('path');
const logger = require('morgan');
const BodyParser = require('body-parser');

const processRequest = function(req){
let response;
let action;
let status;
let data = { data: null };
if(req.method === 'POST'){
console.log(req.body);
data = { data: req.body };
}
const params = Routing.getParams(Routes[req.method], req.path);
if(params){
action = Routes[req.method][params.path];
response = Controller[action](params.params, data.data);
status = 200;
} else {
response = Errors.code(404);
status = 404;
}
return { response: response, status: status };
}

app.use(logger('dev'));
app.use(express.static('server/static'));
app.use(BodyParser.json());

app.get(/\\/*/, function(req, res){
const responseParams = processRequest(req);
res.status(responseParams.status).send(responseParams.response);
});

app.post(/\\/*/, function(req, res){
const responseParams = processRequest(req);
res.status(responseParams.status).send(responseParams.response);
});

app.get('/', function(req, res){
res.sendFile(path.resolve('frontend/index.html'));
app.put(/\\/*/, function(req, res){
const responseParams = processRequest(req);
res.status(responseParams.status).send(responseParams.response);
});

app.patch(/\\/*/, function(req, res){
const responseParams = processRequest(req);
res.status(responseParams.status).send(responseParams.response);
});

app.delete(/\\/*/, function(req, res){
const responseParams = processRequest(req);
res.status(responseParams.status).send(responseParams.response);
});

if (module === require.main) {
Expand All @@ -23,26 +71,31 @@ module.exports = server;`

const flask = () => {
return `import sys
from flask import Flask, url_for
import requests
import routes
import controller
from eos_python_utils import get_params
from flask import Flask, request

app = Flask(__name__)

@app.route('/hello')
def say_hello():
return 'Flask server 2 says hello!'

@app.route('/')
def root():
return app.send_static_file('index.html')
action = routes.GET['/']
response = getattr(controller, action)()
return response

@app.route('/<path:path>')
def static_file(path):
mimetype = ''
if path.split('.')[1] == 'css':
mimetype = 'text/css'
if path.split('.')[1] == 'js':
mimetype = 'application/javascript'
return app.send_static_file(path), 200, {'Content-Type': mimetype}
@app.route('/<path:path>', methods=['GET', 'POST', 'PATCH', 'PUT', 'DELETE'])
def send_to_router(path):
routes_table = routes.routes_for(request.method)
params = get_params(routes_table, path)
data = { 'data': request.get_json(force=True) }
if not params:
content = getattr(controller, 'error')(404)
return content, 404
action = routes_table[params['path']]
response = getattr(controller, action)(params['params'], data['data'])
return response, 200

if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] == 'development':
Expand All @@ -56,4 +109,4 @@ const Servers = {
flask: flask
};

module.exports = Servers
module.exports = Servers;
12 changes: 12 additions & 0 deletions utils/errors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
const errors = {
404: '404 Route Not Found',
500: 'Internal Server Error'
}

function code(errorCode){
return errors[errorCode];
}

module.exports = {
code: code
}
37 changes: 37 additions & 0 deletions utils/routing.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
function getParams(routeMap, requestPath){
const routes = Object.keys(routeMap);
for (var i = 0; i < routes.length; i++) {
let params = matchRoute(routes[i], requestPath);
if(params){
return {
params: params,
path: routes[i]
}
}
}
return null;
}

function matchRoute(route, requestPath){
let params = {};
const routeArr = removeWhitespace(route.split('/'));
const requestArr = removeWhitespace(requestPath.split('/'));
if(routeArr.length !== requestArr.length){ return null; }
for(var i = 0; i < requestArr.length; i++){
if(routeArr[i].match(/^{.*}$/)){
params[routeArr[i].slice(1, -1)] = requestArr[i];
} else if(routeArr[i] !== requestArr[i]){ return null; }
}
return params;
}

function removeWhitespace(arr){
const length = arr.length - 1;
const start = arr[0].length ? 0 : 1;
const end = arr.slice(-1)[0].length ? arr.length : arr.length -1;
return arr.slice(start, end);
}

module.exports = {
getParams: getParams
}