@@ -28,31 +28,65 @@ export const Utils = {
2828 Utils . getHandlerFromString ( app , route )
2929
3030 route . config . pre = route . config . pre
31- . map ( pre => this . getHandlerFromPrerequisite ( app , pre ) )
31+ . map ( pre => Utils . getHandlerFromPrerequisite ( app , pre ) )
3232 . filter ( handler => ! ! handler )
3333
3434 const routeHandlers = Object . keys ( route ) . filter ( value => - 1 !== Utils . methods . indexOf ( value ) )
3535
36- if ( ! routeHandlers . some ( v => Utils . methods . indexOf ( v ) >= 0 ) ) {
36+ if ( ! routeHandlers . some ( v => Utils . methods . indexOf ( v ) >= 0 || ! ! route [ v ] ) ) {
3737 app . log . error ( 'spool-router: route ' , path , ' handler [' , routeHandlers . join ( ', ' ) , ']' ,
3838 'does not correspond to any defined Controller handler' )
3939 return { }
4040 }
41+
42+ routeHandlers . forEach ( method => {
43+ if ( route [ method ] ) {
44+ route [ method ] . config = route [ method ] . config || route . config
45+ route [ method ] . config . pre = route [ method ] . config . pre || route . config . pre
46+ route [ method ] . config . pre = route [ method ] . config . pre
47+ . map ( pre => Utils . getHandlerFromPrerequisite ( app , pre ) )
48+ . filter ( handler => ! ! handler )
49+ }
50+ } )
51+
4152 return { path, route }
4253 } ,
4354
55+ /**
56+ * Expands the search for the prefix to the route or config.* level
57+ */
58+ getRouteLevelPrefix ( app : FabrixApp , route ) {
59+ const configuredPrefix = app . config . get ( route . config . prefix )
60+ const routePrefix = route . config . prefix
61+ if ( typeof configuredPrefix !== 'undefined' ) {
62+ if ( configuredPrefix ) {
63+ return ( configuredPrefix ) . replace ( / $ \/ / , '' )
64+ }
65+ else {
66+ return
67+ }
68+ }
69+ else {
70+ return ( routePrefix || '' ) . replace ( / $ \/ / , '' )
71+ }
72+ } ,
73+
74+ /**
75+ * Get's the prefix for a path
76+ */
4477 getPrefix ( app : FabrixApp , route ) : string {
4578 if ( ! route || ! ( route instanceof Object ) ) {
4679 throw new RangeError ( 'Expected a route object' )
4780 }
4881
4982 const hasPrefix = route . config && route . config . hasOwnProperty ( 'prefix' ) && route . config . prefix !== false
5083 const ignorePrefix = route . config && route . config . hasOwnProperty ( 'prefix' ) && route . config . prefix === false
51- const routeLevelPrefix = hasPrefix ? app . config . get ( route . config . prefix ) || route . config . prefix . replace ( '$/' , '' ) : null
84+ const routeLevelPrefix = hasPrefix ? Utils . getRouteLevelPrefix ( app , route ) : null
5285 const prefix = ( app . config . get ( 'router.prefix' ) || '' ) . replace ( / $ \/ / , '' )
5386
5487 return `${ ignorePrefix ? '' : routeLevelPrefix || prefix } `
5588 } ,
89+
5690 /**
5791 * Build the Path from the Route config
5892 */
@@ -67,16 +101,23 @@ export const Utils = {
67101 return `${ prefix } /${ path } `
68102 } ,
69103
104+ getPolicyFromString ( app : FabrixApp , handler ) {
105+ return get ( app . policies , handler )
106+ } ,
107+
70108 /**
71109 * Get handler method from a "hapi/hapi-like" prerequisite object/string
72110 */
73111 getHandlerFromPrerequisite ( app : FabrixApp , pre ) {
74112 let handler
75113 if ( pre && typeof pre === 'string' ) {
76- handler = get ( app . policies , pre )
114+ handler = Utils . getPolicyFromString ( app , pre )
77115 }
78116 else if ( pre && typeof pre . method === 'string' ) {
79- handler = get ( app . policies , pre . method )
117+ handler = Utils . getPolicyFromString ( app , pre . method )
118+ }
119+ else if ( pre && typeof pre === 'function' ) {
120+ handler = pre
80121 }
81122
82123 if ( ! handler ) {
@@ -88,6 +129,10 @@ export const Utils = {
88129 return handler
89130 } ,
90131
132+ getControllerFromString ( app : FabrixApp , handler ) {
133+ return get ( app . controllers , handler )
134+ } ,
135+
91136 /**
92137 * Get handler method from a controller.method string path
93138 */
@@ -103,7 +148,15 @@ export const Utils = {
103148 Utils . methods . forEach ( method => {
104149 if ( route [ method ] ) {
105150 if ( typeof route [ method ] === 'string' ) {
106- return route [ method ] = get ( app . controllers , route [ method ] )
151+ return route [ method ] = { handler : Utils . getControllerFromString ( app , route [ method ] ) }
152+ }
153+ else if ( route [ method ] instanceof Object && route [ method ] . hasOwnProperty ( 'handler' ) ) {
154+ if ( typeof route [ method ] . handler === 'string' ) {
155+ return route [ method ] . handler = Utils . getControllerFromString ( app , route [ method ] . handler )
156+ }
157+ else {
158+ return route [ method ] . handler
159+ }
107160 }
108161 else {
109162 return route [ method ]
@@ -112,6 +165,9 @@ export const Utils = {
112165 } )
113166 } ,
114167
168+ /**
169+ * Build a route collection
170+ */
115171 buildRoutes ( app : FabrixApp , routes , toReturn = { } ) {
116172 Object . keys ( routes ) . forEach ( r => {
117173 const { path, route } = Utils . buildRoute ( app , r , routes [ r ] )
@@ -120,6 +176,9 @@ export const Utils = {
120176 return Utils . sortRoutes ( toReturn , app . config . get ( 'router.sortOrder' ) )
121177 } ,
122178
179+ /**
180+ * Sort a route collection by object key
181+ */
123182 sortRoutes ( routes , order ) {
124183 const toReturn = { }
125184 const sorted = Object . keys ( routes ) . sort ( Utils . createSpecificityComparator ( { order : order } ) )
0 commit comments