controller.js 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. const defaults = require('./defaults')
  2. const { Op } = require('sequelize')
  3. const crudController = (opts) => {
  4. opts = defaults(opts)
  5. const { Type } = opts
  6. const list = async (req, res) => {
  7. // TODO Pagination (http://docs.sequelizejs.com/manual/tutorial/querying.html#pagination-limiting)
  8. if (req.query && req.query.q) {
  9. const fields = [Type.tableAttributes.name, Type.tableAttributes.tag].filter(x => x)
  10. if (!fields) throw new Error('Table has no searchable fields')
  11. const or = fields.map(field => ({
  12. [field.fieldName]: { [Op.like]: `%${req.query.q}%` }
  13. }))
  14. const where = { [Op.or]: or }
  15. const data = (await Type.findAll({ where })).map(d => d.sanitize ? d.sanitize() : d)
  16. res.status(200).send(data)
  17. } else if (res.query && res.query.ids) {
  18. const ids = res.query.ids.split(',')
  19. const data = (await Type.findAll({where: { id: { [Op.in]: ids }}})).map(d => d.sanitize ? d.sanitize() : d)
  20. res.status(200).send(data)
  21. } else {
  22. const data = (await Type.findAll()).map(d => d.sanitize ? d.sanitize() : d)
  23. res.status(200).send(data)
  24. }
  25. }
  26. const create = async (req, res) => {
  27. const data = (await Type.create(req.body))
  28. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  29. }
  30. const read = async (req, res) => {
  31. const data = (await Type.findOne({where: {id: req.params[opts.routeParam]}}))
  32. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  33. }
  34. const update = async (req, res) => {
  35. const data = (await Type.update(req.body, { where: { id: req.params[opts.routeParam] } }))
  36. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  37. }
  38. const $delete = async (req, res) => {
  39. const data = (await Type.destroy({ where: { id: req.params[opts.routeParam] } }))
  40. res.status(204).end()
  41. }
  42. const trash = async (req, res) => {
  43. const data = (await Type.findAll({
  44. model: Type,
  45. paranoid: false,
  46. where: {
  47. deletedAt: { [Op.ne]: null }
  48. }
  49. }))
  50. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  51. }
  52. const undelete = async (req, res) => {
  53. const data = (await Type.update({ deletedAt: null }, {
  54. paranoid: false,
  55. where: { id: req.params[opts.routeParam] }
  56. }))
  57. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  58. }
  59. // TODO: Create, Read, Update, Delete
  60. return {
  61. list,
  62. create,
  63. read,
  64. update,
  65. delete: $delete,
  66. trash,
  67. undelete
  68. }
  69. }
  70. module.exports = crudController