Overriding a route allows you to change or completely replace a Forest Admin's route behavior.
To achieve this, use existing snippets of default routes and modify them according to your needs.
Here are a few examples:
/routes/companies.jsconst 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-recordsrouter.get('/companies', permissionMiddlewareCreator.list(), (request, response, next) => {const recordsGetter = new RecordsGetter(companies);const params = request.query;params.searchExtended = '1';recordsGetter.getAll(params).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-recordsrouter.get('/companies/count', permissionMiddlewareCreator.list(), (request, response, next) => {const recordsCounter = new RecordsCounter(companies);const params = request.query;params.searchExtended = '1';recordsCounter.count(params).then(count => response.send({ count })).catch(next);});//...
/routes/companies.jsconst express = require('express');const { PermissionMiddlewareCreator, RecordsGetter, RecordsCounter } = require('forest-express-mongoose');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-recordsrouter.get('/companies', permissionMiddlewareCreator.list(), (request, response, next) => {const recordsGetter = new RecordsGetter(companies);const params = request.query;params.searchExtended = '1';recordsGetter.getAll(params).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-recordsrouter.get('/companies/count', permissionMiddlewareCreator.list(), (request, response, next) => {const recordsCounter = new RecordsCounter(companies);const params = request.query;params.searchExtended = '1';recordsCounter.count(params).then(count => response.send({ count })).catch(next);});//...With this snippet, only the companies collection would use extended search by default.
/lib/forest_liana/controllers/companies_controller.rbif ForestLiana::UserSpace.const_defined?('CompanyController')ForestLiana::UserSpace::CompanyController.class_eval doalias_method :default_index, :indexalias_method :default_count, :count# Get a list of Companiesdef indexparams['searchExtended'] = '1'default_indexend# Get a number of Companiesdef countparams['searchExtended'] = '1'default_countendendend
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.
/routes/companies.jsrouter.delete('/companies/:recordId', permissionMiddlewareCreator.delete(), (request, response, next) => {if (request.params.recordId === 82) {response.status(403).send('This record is protected, you cannot remove it.');return;}const recordRemover = new RecordRemover(companies);recordRemover.remove(request.params.recordId).then(() => response.status(204).send()).catch(next);});
/routes/companies.jsrouter.delete('/companies/:recordId', permissionMiddlewareCreator.delete(), (request, response, next) => {if (request.params.recordId === 82) {response.status(403).send('This record is protected, you cannot remove it.');return;}const recordRemover = new RecordRemover(companies);recordRemover.remove(request.params.recordId).then(() => response.status(204).send()).catch(next);});
/lib/forest_liana/controllers/company_controller.rbif ForestLiana::UserSpace.const_defined?('CompanyController')ForestLiana::UserSpace::CompanyController.class_eval doalias_method :default_destroy, :destroydef destroyif params["id"] == "50"render status: 403, plain: 'This record is protected, you cannot remove it.'elsedefault_destroyendendendend
To achieve this, simply remove the next()
statement of any route:
/routes/companies.js...// Create a Company - Check out our documentation for more details: https://docs.forestadmin.com/documentation/reference-guide/routes/default-routes#create-a-recordrouter.post('/companies', permissionMiddlewareCreator.create(), (req, res, next) => {// >> Add your own logic here <<});...
/routes/companies.js...// Create a Company - Check out our documentation for more details: https://docs.forestadmin.com/documentation/reference-guide/routes/default-routes#create-a-recordrouter.post('/companies', permissionMiddlewareCreator.create(), (req, res, next) => {// >> Add your own logic here <<});...
/lib/forest_liana/controllers/companies_controller.rbif ForestLiana::UserSpace.const_defined?('CompanyController')ForestLiana::UserSpace::CompanyController.class_eval do# Create a Companydef create# >> Add your own logic here <<endendend
For instance, if you have a Users
collection, you might want to create your users via your own api:
/routes/users.js...const axios = require('axios');const { users } = require('../models');...router.post('/users', permissionMiddlewareCreator.create(), (request, response, next) => {const recordCreator = new RecordCreator(users);const data = request.body.data.attributes;axios({url: 'https://<your-api>/users',method: 'post',data: data,}).then(async (result) => {response.send(await recordCreator.serialize(result.data));}).catch((error) => {console.log('error:', error);});});
/routes/users.js...const axios = require('axios');const { users } = require('../models');...router.post('/users', permissionMiddlewareCreator.create(), (request, response, next) => {const recordCreator = new RecordCreator(users);const data = request.body.data.attributes;axios({url: 'https://<your-api>/users',method: 'post',data: data,}).then(async (result) => {response.send(await recordCreator.serialize(result.data));}).catch((error) => {console.log('error:', error);});});
/lib/forest_liana/controllers/users_controller.rbrequire 'net/http'require 'uri'if ForestLiana::UserSpace.const_defined?('UserController')ForestLiana::UserSpace::UserController.class_eval do# Create a Userdef createchecker = ForestLiana::PermissionsChecker.new(@resource, 'addEnabled', @rendering_id, user_id: forest_user['id'])return head :forbidden unless checker.is_authorized?beginresponse = Net::HTTP.post URI('https://<your-api>/users'), params.to_json, "Content-Type" => "application/json"render serializer: nil, json: render_record_jsonapi(response.body)rescue => errorsrender serializer: nil, json: JSONAPI::Serializer.serialize_errors(errors), status: 400endendendend