-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathutils.js
More file actions
128 lines (121 loc) · 3.23 KB
/
Copy pathutils.js
File metadata and controls
128 lines (121 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
'use strict'
const Controller = require('trails/controller')
const Policy = require('trails/policy')
const Joi = require('joi')
const methods = require('methods')
const _ = require('lodash')
module.exports = {
extendsExpressRouter: app => {
methods.concat('all').forEach(function (method) {
const originalMethod = app[method]
app[method] = function (key) {
const args = [].slice.call(arguments)
const config = args[1]
// Check if second argument is the route config object
if (_.isPlainObject(config)) {
args[1] = function(req, res, next){
req.route.config = config
next()
}
}
return originalMethod.apply(this, args)
}
})
},
isTrailsStandard: function(obj) {
const className = obj.constructor.name
if (className == Controller.name || className == Policy.name) {
return true
}
else if (className == 'Object') {
return false
}
else {
return this.isTrailsStandard(obj.__proto__)
}
},
/**
* Transform express request to hapi like request
* @param req as express
* @param res as express
* @returns request hapi like object
*/
createRequest: function(req, res) {
return {
raw: {
req: req,
res: res
},
params: req.params,
payload: req.body,
query: req.query,
headers: req.headers,
route: req.route,
url: req.url
}
},
/**
* Transform express response to hapi like response
* @param req as express
* @param res as express
* @param next as express
* @returns response hapi like object
*/
createResponse: function(req, res, next) {
const response = (data) => {
return new Promise((resolve, reject) => {
if (!data) {
next()
}
else if (data instanceof Error) {
if (!data.output) {
data.output = {}
}
const code = data.code || data.output.statusCode
res.status(code || 500).send(data.message)
}
else {
res.send(data)
}
resolve()
})
}
response.continue = () => {
return new Promise((resolve, reject) => {
next()
resolve()
})
}
response.header = (key, value) => {
return new Promise((resolve, reject) => {
res.set(key, value)
resolve()
})
}
return response
},
/**
* Returnn an hapi like validation middleware for epxress
* @param trails route configuration
* @returns Joi validation Rules
*/
createJoiValidationRules: function(route) {
if (route.config.validate.payload) {
route.config.validate.body = route.config.validate.payload // hapi compatibility
}
const validation = route.config.validate
const types = ['headers', 'params', 'query', 'body']
types.forEach((type) => {
let rule = validation[type]
// null, undefined, true - anything allowed
// false - nothing allowed
// {...} - ... allowed
rule = (rule === false ? Joi.object({}).allow(null) :
typeof rule === 'function' ? rule :
!rule || rule === true ? Joi.any() :
Joi.compile(rule))
validation[type] = rule
})
return validation
}
}