You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.2 KiB
94 lines
2.2 KiB
3 years ago
|
Contains a list of all the routes used in AdminJS. They are grouped within 2 arrays:
|
||
|
|
||
|
- `assets`
|
||
|
- `routes`
|
||
|
|
||
|
It is used by supported HTTP frameworks to render AdminJS pages. You can also use it to write your
|
||
|
own rendering logic.
|
||
|
|
||
|
### How it looks
|
||
|
|
||
|
This is the structure of the Router - both `assets` and `routes`.
|
||
|
|
||
|
```javascript
|
||
|
{
|
||
|
assets: [{
|
||
|
path: '/frontend/assets/app.min.js',
|
||
|
src: path.join(ASSETS_ROOT, 'scripts/app.min.js'),
|
||
|
}, ...],
|
||
|
routes: [{
|
||
|
method: 'GET',
|
||
|
path: '/resources/{resourceId}',
|
||
|
Controller: ResourcesController,
|
||
|
action: 'index',
|
||
|
}, ...]
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Create router with authentication logic
|
||
|
|
||
|
To create your router with authentication logic you have to:
|
||
|
|
||
|
* write routes responsible for user authentication
|
||
|
* iterate all `assets` and `routes` and handle them.
|
||
|
|
||
|
|
||
|
The following code is almost an identical copy from @adminjs/express plugin.js file. It shows you
|
||
|
how you can assign all the routes to express framework.
|
||
|
|
||
|
```javascript
|
||
|
const { Router } = require('adminjs')
|
||
|
|
||
|
const { routes, assets } = Router
|
||
|
const router = new express.Router()
|
||
|
|
||
|
// here you can write your authentication logic
|
||
|
|
||
|
routes.forEach((route) => {
|
||
|
// we have to change routes defined in AdminJS from {recordId} to :recordId
|
||
|
const expressPath = route.path.replace(/{/g, ':').replace(/}/g, '')
|
||
|
|
||
|
const handler = async (req, res, next) => {
|
||
|
try {
|
||
|
const currentAdmin = null // you can fetch admin from session,
|
||
|
|
||
|
const controller = new route.Controller({ admin }, currentAdmin)
|
||
|
const { params, query } = req
|
||
|
const method = req.method.toLowerCase()
|
||
|
const payload = {
|
||
|
...(req.fields || {}),
|
||
|
...(req.files || {}),
|
||
|
}
|
||
|
const html = await controller[route.action]({
|
||
|
...req,
|
||
|
params,
|
||
|
query,
|
||
|
payload,
|
||
|
method,
|
||
|
}, res)
|
||
|
if (route.contentType) {
|
||
|
res.set({ 'Content-Type': route.contentType })
|
||
|
}
|
||
|
if (html) {
|
||
|
res.send(html)
|
||
|
}
|
||
|
} catch (e) {
|
||
|
next(e)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (route.method === 'GET') {
|
||
|
router.get(expressPath, handler)
|
||
|
}
|
||
|
|
||
|
if (route.method === 'POST') {
|
||
|
router.post(expressPath, handler)
|
||
|
}
|
||
|
})
|
||
|
|
||
|
assets.forEach((asset) => {
|
||
|
router.get(asset.path, async (req, res) => {
|
||
|
res.sendFile(path.resolve(asset.src))
|
||
|
})
|
||
|
})
|
||
|
```
|