@@ -10,74 +10,108 @@ import { convertToExpressRoute } from "./convertRoutes";
1010const INVALID_ADMINJS_INSTANCE =
1111 "You have to pass an instance of AdminJS to the buildRouter() function" ;
1212
13- export const buildRouter = (
14- admin : AdminJS ,
15- predefinedRouter ?: Router | null ,
16- formidableOptions ?: FormidableOptions
17- ) : Router => {
13+ export type RouteHandlerArgs = {
14+ admin : AdminJS ;
15+ route : typeof AdminRouter [ "routes" ] [ 0 ] ;
16+ } ;
17+
18+ export type BuildRoutesArgs = {
19+ admin : AdminJS ;
20+ routes : typeof AdminRouter [ "routes" ] ;
21+ router : Router ;
22+ } ;
23+
24+ export type BuildAssetsArgs = {
25+ assets : typeof AdminRouter [ "assets" ] ;
26+ router : Router ;
27+ } ;
28+
29+ export const initializeAdmin = ( admin : AdminJS ) : void => {
1830 if ( admin ?. constructor ?. name !== "AdminJS" ) {
1931 throw new WrongArgumentError ( INVALID_ADMINJS_INSTANCE ) ;
2032 }
2133
2234 admin . initialize ( ) . then ( ( ) => {
2335 log . debug ( "AdminJS: bundle ready" ) ;
2436 } ) ;
37+ } ;
2538
26- const { routes, assets } = AdminRouter ;
27- const router = predefinedRouter ?? Router ( ) ;
28- router . use ( formidableMiddleware ( formidableOptions ) ) ;
39+ export const routeHandler = ( {
40+ admin,
41+ route,
42+ } : RouteHandlerArgs ) : RequestHandler => async ( req , res , next ) => {
43+ try {
44+ const controller = new route . Controller (
45+ { admin } ,
46+ req . session && req . session . adminUser
47+ ) ;
48+ const { params, query } = req ;
49+ const method = req . method . toLowerCase ( ) ;
50+ const payload = {
51+ ...( req . fields || { } ) ,
52+ ...( req . files || { } ) ,
53+ } ;
54+ const html = await controller [ route . action ] (
55+ {
56+ ...req ,
57+ params,
58+ query,
59+ payload,
60+ method,
61+ } ,
62+ res
63+ ) ;
64+ if ( route . contentType ) {
65+ res . set ( { "Content-Type" : route . contentType } ) ;
66+ }
67+ if ( html ) {
68+ res . send ( html ) ;
69+ }
70+ } catch ( e ) {
71+ next ( e ) ;
72+ }
73+ } ;
2974
75+ export const buildRoutes = ( {
76+ admin,
77+ routes,
78+ router,
79+ } : BuildRoutesArgs ) : void => {
3080 routes . forEach ( ( route ) => {
3181 // we have to change routes defined in AdminJS from {recordId} to :recordId
3282 const expressPath = convertToExpressRoute ( route . path ) ;
3383
34- const handler : RequestHandler = async ( req , res , next ) => {
35- try {
36- const controller = new route . Controller (
37- { admin } ,
38- req . session && req . session . adminUser
39- ) ;
40- const { params, query } = req ;
41- const method = req . method . toLowerCase ( ) ;
42- const payload = {
43- ...( req . fields || { } ) ,
44- ...( req . files || { } ) ,
45- } ;
46- const html = await controller [ route . action ] (
47- {
48- ...req ,
49- params,
50- query,
51- payload,
52- method,
53- } ,
54- res
55- ) ;
56- if ( route . contentType ) {
57- res . set ( { "Content-Type" : route . contentType } ) ;
58- }
59- if ( html ) {
60- res . send ( html ) ;
61- }
62- } catch ( e ) {
63- next ( e ) ;
64- }
65- } ;
66-
6784 if ( route . method === "GET" ) {
68- router . get ( expressPath , handler ) ;
85+ router . get ( expressPath , routeHandler ( { admin , route } ) ) ;
6986 }
7087
7188 if ( route . method === "POST" ) {
72- router . post ( expressPath , handler ) ;
89+ router . post ( expressPath , routeHandler ( { admin , route } ) ) ;
7390 }
7491 } ) ;
92+ } ;
7593
94+ export const buildAssets = ( { assets, router } : BuildAssetsArgs ) : void => {
7695 assets . forEach ( ( asset ) => {
77- router . get ( asset . path , async ( req , res ) => {
96+ router . get ( asset . path , async ( _req , res ) => {
7897 res . sendFile ( path . resolve ( asset . src ) ) ;
7998 } ) ;
8099 } ) ;
100+ } ;
101+
102+ export const buildRouter = (
103+ admin : AdminJS ,
104+ predefinedRouter ?: Router | null ,
105+ formidableOptions ?: FormidableOptions
106+ ) : Router => {
107+ initializeAdmin ( admin ) ;
108+
109+ const { routes, assets } = AdminRouter ;
110+ const router = predefinedRouter ?? Router ( ) ;
111+ router . use ( formidableMiddleware ( formidableOptions ) ) ;
112+
113+ buildRoutes ( { admin, routes, router } ) ;
114+ buildAssets ( { assets, router } ) ;
81115
82116 return router ;
83117} ;
0 commit comments