caddev-express-sequelize-crud
v1.0.1
Published
React Admin backend with Express and Sequelize. 1 line per resource!
Downloads
1
Maintainers
Readme
Changes from lalalilo/express-sequelize-crud
This repository is a fork of lalalilo/express-sequelize-crud. It only adds a few changes:
- Add of an
auth
method for the crud routers with signature(req, res, next) => void
- Add of the parameters
req
andres
in the actions parameters, to allow management specific permissions thanks to a token for exemple, or HTTP cache headers setting. - Standalone build (out of CircleCI)
express-sequelize-crud
import crud, { sequelizeCrud } from 'express-sequelize-crud-auth'
app.use(crud('/admin/users', sequelizeCrud(User)))
Expose resource CRUD (Create Read Update Delete) routes for Express & Sequelize (and other ORMs in v6+). Compatible with React Admin Simple Rest Data Provider
Note: Content-Range
header
For getList
methods, the response includes the total number of items in the collection in X-Total-Count
header. You should use this response header for pagination and avoid using Content-Range
header if your request does not include a Range
header. Checkout this stackoverflow thread for more info.
If you are using ra-data-simple-rest
, please refer to the documentation to use X-Total-Count
for pagination.
Install
yarn add express-sequelize-crud-auth
Usage
Simple use case
import express from 'express'
import crud, { sequelizeCrud } from 'express-sequelize-crud-auth'
import { User } from './models'
const app = new express()
const auth = (req, res, next) => {
next()
} // Define your authentification checks here
app.use(crud('/admin/users', auth, sequelizeCrud(User)))
Limit actions
import express from 'express'
import crud, { sequelizeCrud } from 'express-sequelize-crud-auth'
import { User } from './models'
const app = new express()
const auth = (req, res, next) => {
next()
} // Define your authentification checks here
app.use(
crud('/admin/users', auth, {
...sequelizeCrud(User),
destroy: null,
})
)
Custom filters
Custom filters such as case insensitive filter can be perform like this:
import express from 'express'
import { Op } from 'sequelize'
import crud, { sequelizeCrud } from 'express-sequelize-crud-auth'
import { User } from './models'
const app = new express()
const auth = (req, res, next) => {
next()
} // Define your authentification checks here
app.use(
crud('/admin/users', auth, sequelizeCrud(User), {
filters: {
email: value => ({
[Op.iLike]: value,
}),
},
})
)
Custom behavior & other ORMs
import express from 'express'
import crud from 'express-sequelize-crud-auth'
import { User } from './models'
const app = new express()
const auth = (req, res, next) => {
next()
} // Define your authentification checks here
app.use(
crud('/admin/users', auth, {
getList: (req, res, { filter, limit, offset, order }) =>
User.findAndCountAll({ limit, offset, order, where: filter }),
getOne: (req, res, id) => User.findByPk(id),
create: (req, res, body) => User.create(body),
update: (req, res, id, body) => User.update(body, { where: { id } }),
destroy: (req, res, id) => User.destroy({ where: { id } }),
})
)
Search
Autocomplete
When using react-admin autocomplete reference field, a request is done to the API with a q
filter. Thus, when using the autocomplete field in react-admin, you must specify the behavior to search the records. This could looks like:
app.use(
crud('/admin/users', {
search: async (req, conf: { q, filter, limit, offset, order }) => {
const { rows, count } = await User.findAndCountAll({
conf.limit,
where: {
[Op.or]: [
{ address: { [Op.iLike]: `${conf.q}%` } },
{ zipCode: { [Op.iLike]: `${conf.q}%` } },
{ city: { [Op.iLike]: `${conf.q}%` } },
],
},
})
return { rows, count }
},
})
)
express-sequelize-crud, exposes a default search helper that you can use like this:
import crud, {
sequelizeCrud,
sequelizeSearchFields,
} from 'express-sequelize-crud'
crud('/admin/users', {
...sequelizeCrud(User),
search: sequelizeSearchFields(User, ['address', 'zipCode', 'city']),
})
When searching some stuff
, the following records will be returned in this order:
- records with a searchable field that contains
some stuff
- records that have searchable fields that contain both
some
andstuff
- records that have searchable fields that contain one of
some
orstuff
The search is case insensitive by default. You can customize the search to make it case sensitive or use a scope:
import { Op } from 'sequelize'
const search = sequelizeSearchFields(
User,
['address', 'zipCode', 'city'],
Op.like
)
Contribute
This lib uses semantic-release. You need to write your commits following this nomenclature:
- feat: A new feature
- fix: A bug fix
- docs: Documentation only changes
- style: Changes that do not affect the meaning of the code (white-space, - formatting, missing semi-colons, etc)
- refactor: A code change that neither fixes a bug nor adds a feature
- perf: A code change that improves performance
- test: Adding missing or correcting existing tests
- chore: Changes to the build process or auxiliary tools and libraries such as documentation generation
To trigger a major version release write in the core of the commit message:
feat: my commit
BREAKING CHANGE: detail here