-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
32 lines (27 loc) · 973 Bytes
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
const omit = require('lodash.omit');
const pick = require('lodash.pick');
const toJSON = obj => (obj.toJSON ? obj.toJSON() : obj);
const pickFields = (obj, fields) => {
const cleanObj = toJSON(obj);
return pick(cleanObj, fields);
};
module.exports = async (ctx, next) => {
await next();
if (ctx.state.ignoreQueryFields) return;
const hasFields =
ctx.query && ctx.query.fields && Array.isArray(ctx.query.fields) && ctx.query.fields.length > 0;
const hasBody = ctx.body;
if (hasFields && hasBody) {
const { fields } = ctx.query;
if (Array.isArray(ctx.body)) {
ctx.body = ctx.body.map(obj => pickFields(obj, fields));
} else if (typeof ctx.body.total === 'number' && Array.isArray(ctx.body.data)) {
ctx.body = {
...omit(ctx.body, ['data']),
data: ctx.body.data.map(obj => pickFields(obj, fields))
};
} else if (typeof ctx.body === 'object') {
ctx.body = pickFields(ctx.body, fields);
}
}
};