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,41 @@ 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+ const controller = Utils . getControllerFromHandler ( handler )
133+
134+ if ( app . config . get ( 'policies.*.*' ) ) {
135+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( 'policies.*.*' ) ) ] ) ]
136+ }
137+ if ( app . config . get ( `policies.*.${ routeMethod } ` ) ) {
138+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( `policies.*.${ routeMethod } ` ) ) ] ) ]
139+ }
140+ if ( handler && controller && app . config . get ( `policies.${ controller } .*.*` ) ) {
141+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( `policies.${ controller } .*.*` ) ) ] ) ]
142+ }
143+ if ( handler && controller && app . config . get ( `policies.${ controller } .*.${ routeMethod } ` ) ) {
144+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( `policies.${ controller } .*.${ routeMethod } ` ) ) ] ) ]
145+ }
146+ if ( handler && app . config . get ( `policies.${ handler } .${ routeMethod } ` ) ) {
147+ pre = [ ...new Set ( [ ...pre , ...Utils . stringToArray ( app . config . get ( `policies.${ handler } .${ routeMethod } ` ) ) ] ) ]
148+ }
149+ return pre
150+ } ,
151+
119152 /**
120153 * Get handler method from a "hapi/hapi-like" prerequisite object/string
121154 */
122- getHandlerFromPrerequisite ( app : FabrixApp , pre ) {
155+ getPolicyFromPrerequisite ( app : FabrixApp , pre ) {
123156 let handler
124157 if ( pre && typeof pre === 'string' ) {
125158 handler = Utils . getPolicyFromString ( app , pre )
126159 }
160+ else if ( pre && Array . isArray ( pre ) ) {
161+ handler = pre . map ( p => Utils . getPolicyFromString ( app , p ) ) . filter ( p => p )
162+ }
127163 else if ( pre && typeof pre . method === 'string' ) {
128164 handler = Utils . getPolicyFromString ( app , pre . method )
129165 }
@@ -144,6 +180,10 @@ export const Utils = {
144180 return get ( app . controllers , handler )
145181 } ,
146182
183+ getControllerFromHandler ( handler ) {
184+ return isString ( handler ) ? handler . split ( '.' ) [ 0 ] : handler
185+ } ,
186+
147187 /**
148188 * Get handler method from a controller.method string path
149189 */
@@ -158,15 +198,32 @@ export const Utils = {
158198
159199 Utils . methods . forEach ( method => {
160200 if ( route [ method ] ) {
201+ route . config = route . config || { }
202+ route . config . pre = Utils . getControllerPolicy ( app , null , method , route . config . pre )
203+
161204 if ( typeof route [ method ] === 'string' ) {
162- return route [ method ] = { handler : Utils . getControllerFromString ( app , route [ method ] ) }
205+ route . config . pre = Utils . getControllerPolicy ( app , route [ method ] , method , route . config . pre )
206+ return route [ method ] = {
207+ handler : Utils . getControllerFromString ( app , route [ method ] ) ,
208+ config : route . config
209+ }
163210 }
164211 else if ( route [ method ] instanceof Object && route [ method ] . hasOwnProperty ( 'handler' ) ) {
212+ route [ method ] . config = route [ method ] . config || route . config
213+ route [ method ] . config . pre = route [ method ] . config . pre || route . config . pre
214+
165215 if ( typeof route [ method ] . handler === 'string' ) {
166- return route [ method ] . handler = Utils . getControllerFromString ( app , route [ method ] . handler )
216+ route . config . pre = Utils . getControllerPolicy ( app , route [ method ] . handler , method , route . config . pre )
217+ return route [ method ] = {
218+ ...route [ method ] ,
219+ handler : Utils . getControllerFromString ( app , route [ method ] . handler )
220+ }
167221 }
168222 else {
169- return route [ method ] . handler
223+ return route [ method ] = {
224+ ...route [ method ] ,
225+ handler : route [ method ] . handler
226+ }
170227 }
171228 }
172229 else {
0 commit comments