11import { FabrixApp } from '@fabrix/fabrix'
2- import { get , omit } from 'lodash'
2+ import { get , omit , isString } from 'lodash'
33import { Router } from 'call'
44import { IRoute } from './interfaces/IRoute'
55
@@ -16,6 +16,13 @@ export const Utils = {
1616 'PATCH'
1717 ] ,
1818
19+ /**
20+ *
21+ */
22+ stringToArray ( strOrArray ) : string [ ] {
23+ return isString ( strOrArray ) ? [ strOrArray ] : strOrArray
24+ } ,
25+
1926 /**
2027 * Build a complete route, with bound handler and attached preconditions
2128 */
@@ -37,13 +44,14 @@ export const Utils = {
3744 Utils . getHandlerFromString ( app , orgRoute )
3845
3946 orgRoute . config . pre = orgRoute . config . pre
40- . map ( pre => Utils . getHandlerFromPrerequisite ( app , pre ) )
47+ . map ( pre => Utils . getPolicyFromPrerequisite ( app , pre ) )
4148 . filter ( handler => ! ! handler )
4249
43- const orgRouteHandlers = Object . keys ( orgRoute ) . filter ( value => - 1 !== Utils . methods . indexOf ( value ) )
50+ const orgRouteHandlers = Object . keys ( orgRoute )
51+ . filter ( value => - 1 !== Utils . methods . indexOf ( value ) )
4452
4553 if ( ! orgRouteHandlers . some ( v => Utils . methods . indexOf ( v ) >= 0 || ! ! orgRoute [ v ] ) ) {
46- app . log . error ( 'spool-orgRouter: orgRoute ' , path , ' handler [' , orgRouteHandlers . join ( ', ' ) , ']' ,
54+ app . log . error ( 'spool-router: route ' , path , ' handler [' , orgRouteHandlers . join ( ', ' ) , ']' ,
4755 'does not correspond to any defined Controller handler' )
4856 return { }
4957 }
@@ -53,7 +61,8 @@ export const Utils = {
5361 orgRoute [ method ] . config = orgRoute [ method ] . config || orgRoute . config
5462 orgRoute [ method ] . config . pre = orgRoute [ method ] . config . pre || orgRoute . config . pre
5563 orgRoute [ method ] . config . pre = orgRoute [ method ] . config . pre
56- . map ( pre => Utils . getHandlerFromPrerequisite ( app , pre ) )
64+ . map ( pre => Utils . getPolicyFromPrerequisite ( app , pre ) )
65+ // .map(pre => Utils.getPolicyFromPrerequisite(app, pre))
5766 . filter ( handler => ! ! handler )
5867 }
5968 } )
@@ -116,14 +125,33 @@ export const Utils = {
116125 return get ( app . policies , handler )
117126 } ,
118127
128+ /**
129+ * Get a Controller's method's policies
130+ */
131+ getControllerPolicy ( app : FabrixApp , handler , routeMethod , pre = [ ] ) {
132+ if ( app . config . get ( 'policies.*.*' ) ) {
133+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( 'policies.*.*' ) ) ] ) ]
134+ }
135+ if ( app . config . get ( `policies.*.${ routeMethod } ` ) ) {
136+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( `policies.*.${ routeMethod } ` ) ) ] ) ]
137+ }
138+ if ( handler && app . config . get ( `policies.${ handler } .${ routeMethod } ` ) ) {
139+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( `policies.${ handler } .${ routeMethod } ` ) ) ] ) ]
140+ }
141+ return pre
142+ } ,
143+
119144 /**
120145 * Get handler method from a "hapi/hapi-like" prerequisite object/string
121146 */
122- getHandlerFromPrerequisite ( app : FabrixApp , pre ) {
147+ getPolicyFromPrerequisite ( app : FabrixApp , pre ) {
123148 let handler
124149 if ( pre && typeof pre === 'string' ) {
125150 handler = Utils . getPolicyFromString ( app , pre )
126151 }
152+ else if ( pre && Array . isArray ( pre ) ) {
153+ handler = pre . map ( p => Utils . getPolicyFromString ( app , p ) ) . filter ( p => p )
154+ }
127155 else if ( pre && typeof pre . method === 'string' ) {
128156 handler = Utils . getPolicyFromString ( app , pre . method )
129157 }
@@ -158,15 +186,32 @@ export const Utils = {
158186
159187 Utils . methods . forEach ( method => {
160188 if ( route [ method ] ) {
189+ route . config = route . config || { }
190+ route . config . pre = Utils . getControllerPolicy ( app , null , method , route . config . pre )
191+
161192 if ( typeof route [ method ] === 'string' ) {
162- return route [ method ] = { handler : Utils . getControllerFromString ( app , route [ method ] ) }
193+ route . config . pre = Utils . getControllerPolicy ( app , route [ method ] , method , route . config . pre )
194+ return route [ method ] = {
195+ handler : Utils . getControllerFromString ( app , route [ method ] ) ,
196+ config : route . config
197+ }
163198 }
164199 else if ( route [ method ] instanceof Object && route [ method ] . hasOwnProperty ( 'handler' ) ) {
200+ route [ method ] . config = route [ method ] . config || route . config
201+ route [ method ] . config . pre = route [ method ] . config . pre || route . config . pre
202+
165203 if ( typeof route [ method ] . handler === 'string' ) {
166- return route [ method ] . handler = Utils . getControllerFromString ( app , route [ method ] . handler )
204+ route . config . pre = Utils . getControllerPolicy ( app , route [ method ] . handler , method , route . config . pre )
205+ return route [ method ] = {
206+ ...route [ method ] ,
207+ handler : Utils . getControllerFromString ( app , route [ method ] . handler )
208+ }
167209 }
168210 else {
169- return route [ method ] . handler
211+ return route [ method ] = {
212+ ...route [ method ] ,
213+ handler : route [ method ] . handler
214+ }
170215 }
171216 }
172217 else {
@@ -176,6 +221,20 @@ export const Utils = {
176221 } )
177222 } ,
178223
224+ // /**
225+ // *
226+ // */
227+ // getControllerPolicyFromString(app: FabrixApp, handlerString: string) {
228+ // let pre = []
229+ // if (app.config.get('policies.*')) {
230+ // pre.push(Utils.policyStringToArray(app.config.get('policies.*')))
231+ // }
232+ // if (app.config.get(`policies.${handlerString}`)) {
233+ // pre = [...pre, ...Utils.policyStringToArray(app.config.get(`policies.${handlerString}`))]
234+ // }
235+ // return { pre: pre }
236+ // },
237+
179238 /**
180239 * Build a route collection
181240 */
0 commit comments