strapi-plugin-transformer
Version:
A plugin for Strapi Headless CMS that provides the ability to transform the API request and/or response.
108 lines (92 loc) • 2.53 kB
JavaScript
const _ = require('lodash');
const { removeObjectKey } = require('./util');
/**
*
* @param {object} transforms
* @param {boolean} transforms.removeAttributesKey
* @param {boolean} transforms.removeDataKey
* @param {object} ctx
*/
function transformResponse(transforms = {}, ctx) {
// transform data
if (transforms.removeAttributesKey || transforms.removeDataKey) {
ctx.body.data = modifyResponseBodyData(transforms, ctx.body.data);
}
}
/**
* Modify the response body according to reponse transform settings
*
* @param {object} transforms
* @param {boolean} transforms.removeAttributesKey
* @param {boolean} transforms.removeDataKey
* @param {object} data
* @returns {object} transformed body data
*/
function modifyResponseBodyData(transforms = {}, data) {
// removeAttributeKey specific transformations
if (transforms.removeAttributesKey) {
// single
if (_.has(data, 'attributes')) {
return modifyResponseBodyData(transforms, removeObjectKey(data, 'attributes'));
}
// collection
if (_.isArray(data) && data.length && _.has(_.head(data), 'attributes')) {
return data.map((e) => modifyResponseBodyData(transforms, e));
}
}
// fields
_.forEach(data, (value, key) => {
if (!value) {
return;
}
// removeDataKey specific transformations
if (transforms.removeDataKey) {
// single
if (_.isObject(value)) {
data[key] = modifyResponseBodyData(transforms, value);
}
// many
if (_.isArray(value)) {
data[key] = value.map((field) => modifyResponseBodyData(transforms, field));
}
}
// relation(s)
if (_.has(value, 'data')) {
let relation = null;
// single
if (_.isObject(value.data)) {
relation = modifyResponseBodyData(transforms, value.data);
}
// many
if (_.isArray(value.data)) {
relation = value.data.map((e) => modifyResponseBodyData(transforms, e));
}
if (transforms.removeDataKey) {
data[key] = relation;
} else {
data[key]['data'] = relation;
}
}
// single component
if (_.has(value, 'id')) {
data[key] = modifyResponseBodyData(transforms, value);
}
// repeatable component & dynamic zone
if (_.isArray(value) && _.has(_.head(value), 'id')) {
data[key] = value.map((p) => modifyResponseBodyData(transforms, p));
}
// single media
if (_.has(value, 'provider')) {
return;
}
// multi media
if (_.isArray(value) && _.has(_.head(value), 'provider')) {
return;
}
});
return data;
}
module.exports = {
transformResponse,
modifyResponseBodyData,
};