Override a route
Please be sure of your agent type and version and pick the right documentation accordingly.
This is the documentation of the forest-express-sequelize
and forest-express-mongoose
Node.js agents that will soon reach end-of-support.
forest-express-sequelize
v9 and forest-express-mongoose
v9 are replaced by @forestadmin/agent
v1.
Please check your agent type and version and read on or switch to the right documentation.
Override a route
Overriding a route allows you to change or completely replace a Forest Admin's route behavior.
Changing Forest Admin's behavior
To achieve this, use existing snippets of default routes and modify them according to your needs.
Here are a few examples:
Use extended search by default
const express = require('express');
const {
PermissionMiddlewareCreator,
RecordsGetter,
RecordsCounter,
} = require('forest-express-sequelize');
const { companies } = require('../models');
const router = express.Router();
const permissionMiddlewareCreator = new PermissionMiddlewareCreator(
'companies'
);
//...
// Get a list of Companies - Check out our documentation for more details: https://docs.forestadmin.com/documentation/reference-guide/routes/default-routes#get-a-list-of-records
router.get(
'/companies',
permissionMiddlewareCreator.list(),
(request, response, next) => {
const { query, user } = request;
query.searchExtended = '1';
const recordsGetter = new RecordsGetter(companies, user, query);
recordsGetter
.getAll()
.then((records) => recordsGetter.serialize(records))
.then((recordsSerialized) => response.send(recordsSerialized))
.catch(next);
}
);
// Get a number of Companies - Check out our documentation for more details: https://docs.forestadmin.com/documentation/reference-guide/routes/default-routes#get-a-list-of-records
router.get(
'/companies/count',
permissionMiddlewareCreator.list(),
(request, response, next) => {
const { query, user } = request;
query.searchExtended = '1';
const recordsCounter = new RecordsCounter(companies, user, query);
recordsCounter
.count()
.then((count) => response.send({ count }))
.catch(next);
}
);
//...
With this snippet, only the companies
collection would use extended search by default.
Using extended search is less performant than default search. Use this wisely.
Protect a specific record
router.delete(
'/companies/:recordId',
permissionMiddlewareCreator.delete(),
(request, response, next) => {
const { params, query, user } = request;
if (Number(params.recordId) === 82) {
response
.status(403)
.send('This record is protected, you cannot remove it.');
return;
}
const recordRemover = new RecordRemover(companies, user, query);
recordRemover
.remove(params.recordId)
.then(() => response.status(204).send())
.catch(next);
}
);
Replacing Forest Admin's behavior
To achieve this, simply remove the next()
statement of any route:
...
// Create a Company - Check out our documentation for more details: https://docs.forestadmin.com/documentation/reference-guide/routes/default-routes#create-a-record
router.post('/companies', permissionMiddlewareCreator.create(), (req, res, next) => {
// >> Add your own logic here <<
});
...
For instance, if you have a Users
collection, you might want to create your users via your own api:
...
const axios = require('axios');
const { RecordSerializer } = require('forest-express-sequelize');
const { users } = require('../models');
...
router.post('/users', permissionMiddlewareCreator.create(), (request, response, next) => {
const recordSerializer = new RecordSerializer(users);
const axiosRequest = {
url: 'https://<your-api>/users',
method: 'post',
data: request.body.data.attributes,
};
axios(axiosRequest)
.then(result => recordSerializer.serialize(result.data))
.then(resultSerialized => response.send(resultSerialized))
.catch(error => {
console.log('error:', error);
next(error);
});
});
Last updated
Was this helpful?