controller.js 2.0 KB

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