Skip to content

Commit

Permalink
Merge branch 'error_management' into postgres
Browse files Browse the repository at this point in the history
  • Loading branch information
oded leiba committed Aug 1, 2016
2 parents cbad9a6 + 06a1386 commit 3c5e67d
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 28 deletions.
6 changes: 6 additions & 0 deletions lib/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,12 @@ function qa_transports (myToken) {

function production_transports (myToken) {
var temp = [
new (winston.transports.Console)({
level: 'info',
colorize: true,
silent: false,
timestamp: custom_time_stamp1
})
// new (winston.transports.Console)({
// level: 'info',
// colorize: true,
Expand Down
1 change: 1 addition & 0 deletions lib/properties.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ module.exports = function (settingsDir) {
properties_default.redis.port = process.env.REDISPORT || properties_default.redis.port
properties_default.redis.user = process.env.REDISUSER || properties_default.redis.user
properties_default.redis.pass = process.env.REDISPASS || properties_default.redis.pass
properties_default.redis.prefix = process.env.REDISPREFIX || properties_default.redis.prefix
}
if (environment !== 'production') {
try {
Expand Down
121 changes: 99 additions & 22 deletions lib/router.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

var express = require('express')
var merge = require('merge')
var clone = require('clone')
var jf = require('jsonfile')
var fs = require('fs')
var path = require('path')

function build_rest_path (path, params) {
if (params) {
Expand Down Expand Up @@ -43,40 +47,48 @@ function parse_error_msg (err) {

function get_params_from_request (request, params_template, mandatory, callback) {
var params = {}
var errors
params_template = params_template || []
for (var index = 0; index < params_template.length; index++) {
var param_name = params_template[index]
var param
var error
if (request.check) {
if (mandatory) request.assert(param_name, 'Missing param: ' + param_name).notEmpty()
var errors = request.validationErrors()
if (errors) {
if (!Array.isArray(errors)) errors = [errors]
var msgs = errors.map(function (err) {
return parse_error_msg(err)
})
var msg = msgs.join('\n')
// console.error(msg)
var err = {
message: msg,
status: 400
}
return callback(err)
}
param = extract_param(request, param_name)
errors = request.validationErrors()
} else {
param = extract_param(request, param_name)
}
if (!(typeof param === 'undefined')) params[param_name] = param
}

if (request.check) {
errors = request.validationErrors()
if (errors) {
if (!Array.isArray(errors)) errors = [errors]
var explanations = errors.map(function (err) {
return parse_error_msg(err)
})
var explanation = explanations.join('\n')
console.error(explanation)
var err = {
message: 'Validation error',
explanation: explanation,
status: 400
}
return callback(err)
}
}

callback(null, params)
}

function build_function_call (controllers_path, path_element) {
var function_name_array = path_element.function_name.split('.')
var cFile = controllers_path + function_name_array[0] + '.js'
var cFunction = function_name_array[1]
var version = function_name_array[0]
var file_name = function_name_array[1]
var cFile = path.join(controllers_path, version, file_name + '.js')
var cFunction = function_name_array[2]
return function (request, response, next) {
return require(cFile)[cFunction](request, response, next)
}
Expand All @@ -99,7 +111,7 @@ function build_request_params (path_element) {
}
}

function connect_paths (router, method, controllers_path, auth, routes, private_area, custom_middlewares) {
function connect_paths (router, version, method, controllers_path, auth, routes, private_area, custom_middlewares) {
for (var path in routes) {
var middlewares = []
var path_element = routes[path]
Expand All @@ -126,16 +138,81 @@ function connect_paths (router, method, controllers_path, auth, routes, private_

var handler = build_function_call(controllers_path, path_element)
middlewares.push(handler)

path = '/' + version + path
rest_path = '/' + version + rest_path
router[method](path, middlewares)
router[method](rest_path, middlewares)
}
}

module.exports = function (routes, controllers_path, auth, router, custom_middlewares) {
var build_routes = function (routes_path) {
var routes = {}
var GET_public = {}
var GET_private = {}
var POST_public = {}
var POST_private = {}
var PUT_public = {}
var PUT_private = {}
var DELETE_public = {}
var DELETE_private = {}

var version_folders = fs.readdirSync(routes_path)
version_folders.forEach(function (folder) {
var folder_path = path.join(routes_path, folder)
if (!fs.lstatSync(folder_path).isDirectory() || folder[0] !== 'v' || isNaN(folder.substring(1, folder.length))) {
throw new Error('routes path must contain only folders of the format "v"<number>')
}
})
version_folders.sort(function (folder1, folder2) {
return parseInt(folder1.substring(1, folder1.length)) - parseInt(folder2.substring(1, folder2.length))
}).forEach(function (version) {
var merge = merge_route(version, routes_path)
merge(GET_public, 'GET-public.json')
merge(GET_private, 'GET-private.json')
merge(POST_public, 'POST-public.json')
merge(POST_private, 'POST-private.json')
merge(PUT_public, 'PUT-public.json')
merge(PUT_private, 'PUT-private.json')
merge(DELETE_public, 'DELETE-public.json')
merge(DELETE_private, 'DELETE-private.json')

routes[version] = {
// Routing settings
GET: { Public: clone(GET_public), Private: clone(GET_private) },
POST: { Public: clone(POST_public), Private: clone(POST_private) },
PUT: { Public: clone(PUT_public), Private: clone(PUT_private) },
DELETE: { Public: clone(DELETE_public), Private: clone(DELETE_private) }
}
})

return routes
}

var merge_route = function (version, routes_path) {
var versioned_routes_path = path.join(routes_path, version)
return function (route, file_name) {
var route_path = path.join(versioned_routes_path, file_name)
try {
var json = jf.readFileSync(route_path)
Object.keys(json).forEach(function (path) {
json[path].function_name = version + '.' + json[path].function_name
})
merge(route, json)
} catch (e) {
// file does not exist - do nothing
}
}
}

module.exports = function (routes_path, controllers_path, auth, router, custom_middlewares) {
var routes = build_routes(routes_path)
router = router || express.Router()
for (var method in routes) {
connect_paths(router, method.toLowerCase(), controllers_path, auth, routes[method].Public, false, custom_middlewares)
connect_paths(router, method.toLowerCase(), controllers_path, auth, routes[method].Private, true, custom_middlewares)
for (var version in routes) {
for (var method in routes[version]) {
connect_paths(router, version, method.toLowerCase(), controllers_path, auth, routes[version][method].Public, false, custom_middlewares)
connect_paths(router, version, method.toLowerCase(), controllers_path, auth, routes[version][method].Private, true, custom_middlewares)
}
}
console.log('----------------------------------------------------------------------------------')
console.log('------------------------------- Created Routes -------------------------------')
Expand Down
10 changes: 7 additions & 3 deletions lib/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ module.exports = function (properties) {
var redis_user = properties.redis && properties.redis.user
var redis_password = properties.redis && properties.redis.password
var redis_options = properties.redis && properties.redis.options
var redis_prefix = properties.redis && properties.redis.prefix
var mount = properties.faye && properties.faye.mount
var timeout = properties.faye && properties.faye.timeout
var engine_type = properties.engine && properties.engine.type || 'jade'
Expand All @@ -48,7 +49,7 @@ module.exports = function (properties) {
var static_folder = properties.engine && properties.engine.static_folder
var admin_users = properties.basic && properties.basic.admin_users
var realm = properties.basic && properties.basic.realm
var validator = { customValidators: properties.modules && properties.modules.validator }
var validator = properties.modules && properties.modules.validator
var router = properties.modules && properties.modules.router
var error = properties.modules && properties.modules.error
var logger = properties.modules && properties.modules.logger
Expand Down Expand Up @@ -114,11 +115,11 @@ module.exports = function (properties) {
app.use(favicon(faviconDir)) // Fast fav icon middleware
app.use(cors()) // Allowing CORS comunication
app.use(bodyParser.json()) // Support for JSON-encoded bodies
app.use(bodyParser.urlencoded({ extended: true })) // Support for URL-encoded bodies
app.use(bodyParser.urlencoded({ extended: true })) // Support for URL-encoded bodies
app.engine(file_extantion, consolidate[engine_type]) // assign the template engine to the file extantion
app.set('view engine', file_extantion) // set file extantion as the default extension
app.set('views', views_folder) // Changing default view folder
app.use(expressValidator(validator)) // Parameter validation middleware
app.use(validator || expressValidator()) // Parameter validation middleware
router && app.use(router) // Load the router to the server
static_folder && app.use(express.static(static_folder)) // Optional HTTP static server middleware
logger && app.use(expressWinston.errorLogger({ // Adds optional express error logging to winston logger
Expand Down Expand Up @@ -227,6 +228,9 @@ module.exports = function (properties) {
sub.buffers = true
}
var redis_socketio_options = { pubClient: pub, subClient: sub }
if (redis_prefix) {
redis_socketio_options.key = redis_prefix
}
var redis_socketio_adapter = socketio_redis(redis_socketio_options)
server.io_server.adapter(redis_socketio_adapter)

Expand Down
9 changes: 6 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "casimircore",
"version": "0.8.17",
"version": "0.8.20",
"description": "The core modules for the Casimir webapp framework",
"author": {
"name": "thehobbit85",
Expand Down Expand Up @@ -43,6 +43,7 @@
"license": "MIT",
"dependencies": {
"body-parser": "^1.13.3",
"clone": "^1.0.2",
"compression": "^1.5.2",
"consolidate": "^0.13.1",
"cookie-parser": "^1.3.5",
Expand All @@ -52,6 +53,7 @@
"express-winston": "^0.4.1",
"faye": "^1.1.2",
"findhit-proxywrap": "^0.3.10",
"fs": "0.0.2",
"http-auth": "^2.2.8",
"iniparser": "^1.0.5",
"jade": "^1.11.0",
Expand All @@ -68,15 +70,16 @@
"passport": "^0.3.0",
"passport-http": "^0.3.0",
"passport-http-bearer": "^1.0.1",
"path": "^0.12.7",
"pg": "4.5.2",
"piwik-tracker": "^0.1.2",
"prettyjson": "^1.1.3",
"qs": "^5.0.0",
"redis": "^2.4.2",
"request": "^2.61.0",
"serve-favicon": "^2.3.0",
"socket.io": "^1.3.6",
"socket.io-client": "^1.3.7",
"socket.io": "git+https://github.com/tal-beja/socket.io.git",
"socket.io-client": "git+https://github.com/tal-beja/socket.io-redis.git",
"socket.io-redis": "^1.0.0",
"uuid": "^2.0.1",
"winston": "^1.0.1",
Expand Down

0 comments on commit 3c5e67d

Please sign in to comment.