|
|
@@ -1,9 +1,28 @@
|
|
|
+const _ = require('lodash')
|
|
|
const defaults = require('./defaults')
|
|
|
const { Op } = require('sequelize')
|
|
|
|
|
|
const crudController = (opts) => {
|
|
|
opts = defaults(opts)
|
|
|
const { Type } = opts
|
|
|
+
|
|
|
+ const subset = async (req) => {
|
|
|
+ const subset = {}
|
|
|
+ const params = _.toPairs(req.params)
|
|
|
+ .map(([key, value])=>({key, value}))
|
|
|
+ .filter(({value}) => value !== opts.paramAll)
|
|
|
+ for (let { key, value } of params) {
|
|
|
+ const assoc = Type.associations[key]
|
|
|
+ if (assoc) {
|
|
|
+ subset[assoc.foreignKey] = (await assoc.target.findOne({
|
|
|
+ parameters: ['id'],
|
|
|
+ where: { key: value }
|
|
|
+ })).id
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return subset
|
|
|
+ }
|
|
|
+
|
|
|
const list = async (req, res) => {
|
|
|
// TODO Pagination (http://docs.sequelizejs.com/manual/tutorial/querying.html#pagination-limiting)
|
|
|
if (req.query && req.query.q) {
|
|
|
@@ -12,15 +31,15 @@ const crudController = (opts) => {
|
|
|
const or = fields.map(field => ({
|
|
|
[field.fieldName]: { [Op.like]: `%${req.query.q}%` }
|
|
|
}))
|
|
|
- const where = { [Op.or]: or }
|
|
|
+ const where = { ...subset, [Op.or]: or }
|
|
|
const data = (await Type.findAll({ where })).map(d => d.sanitize ? d.sanitize() : d)
|
|
|
res.status(200).send(data)
|
|
|
} else if (res.query && res.query.ids) {
|
|
|
const ids = res.query.ids.split(',')
|
|
|
- const data = (await Type.findAll({where: { id: { [Op.in]: ids }}})).map(d => d.sanitize ? d.sanitize() : d)
|
|
|
+ const data = (await Type.findAll({where: { ...(await subset(req)), id: { [Op.in]: ids }}})).map(d => d.sanitize ? d.sanitize() : d)
|
|
|
res.status(200).send(data)
|
|
|
} else {
|
|
|
- const data = (await Type.findAll()).map(d => d.sanitize ? d.sanitize() : d)
|
|
|
+ const data = (await Type.findAll({where: { ...(await subset(req)) }})).map(d => d.sanitize ? d.sanitize() : d)
|
|
|
res.status(200).send(data)
|
|
|
}
|
|
|
}
|
|
|
@@ -45,6 +64,7 @@ const crudController = (opts) => {
|
|
|
model: Type,
|
|
|
paranoid: false,
|
|
|
where: {
|
|
|
+ ...(await subset(req)),
|
|
|
deletedAt: { [Op.ne]: null }
|
|
|
}
|
|
|
}))
|