controller.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 {
  18. const data = (await Type.findAll()).map(d => d.sanitize ? d.sanitize() : d)
  19. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  20. }
  21. }
  22. const create = async (req, res) => {
  23. const data = (await Type.create(req.body))
  24. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  25. }
  26. const read = async (req, res) => {
  27. const data = (await Type.findOne({where: {id: req.params[opts.routeParam]}}))
  28. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  29. }
  30. const update = async (req, res) => {
  31. const data = (await Type.update(req.body, { where: { id: req.params[opts.routeParam] } }))
  32. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  33. }
  34. const $delete = async (req, res) => {
  35. const data = (await Type.destroy({ where: { id: req.params[opts.routeParam] } }))
  36. res.status(204).end()
  37. }
  38. const trash = async (req, res) => {
  39. const data = (await Type.findAll({
  40. model: Type,
  41. paranoid: false,
  42. where: {
  43. deletedAt: { [Op.ne]: null }
  44. }
  45. }))
  46. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  47. }
  48. const undelete = async (req, res) => {
  49. const data = (await Type.update({ deletedAt: null }, {
  50. paranoid: false,
  51. where: { id: req.params[opts.routeParam] }
  52. }))
  53. res.status(200).send(data && data.sanitize ? data.sanitize() : data)
  54. }
  55. // TODO: Create, Read, Update, Delete
  56. return {
  57. list,
  58. create,
  59. read,
  60. update,
  61. delete: $delete,
  62. trash,
  63. undelete
  64. }
  65. }
  66. module.exports = crudController