Files
twenty/packages/twenty-server/src/engine/api/rest/utils/clean-graphql-response.utils.ts
T
gitstart-app[bot] d9dcd63a1c Expose duplicate check on REST API and enable batch duplicate checks (#6328)
This PR was created by [GitStart](https://gitstart.com/) to address the
requirements from this ticket:
[TWNTY-5472](https://clients.gitstart.com/twenty/5449/tickets/TWNTY-5472).
This ticket was imported from:
[TWNTY-5472](https://github.com/twentyhq/twenty/issues/5472)

 --- 

### Description:
- Following what is already done in the code, we create a REST endpoint
that generates the Graphql query and returns its result.

### Refs: #5472


### Demo:

<https://www.loom.com/share/e0b1030f056945a0bf93bdd88ea01d8f?sid=6f128e8c-370b-4079-958e-0ea2d073a241>

FIxes #5472

---------

Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com>
Co-authored-by: gitstart-twenty <140154534+gitstart-twenty@users.noreply.github.com>
Co-authored-by: martmull <martmull@hotmail.fr>
2024-08-01 10:08:22 +02:00

64 lines
2.0 KiB
TypeScript

export const cleanGraphQLResponse = (input: any) => {
if (!input) return null;
const output = { data: {} }; // Initialize the output with a data key at the top level
const isObject = (obj: any) => {
return obj !== null && typeof obj === 'object' && !Array.isArray(obj);
};
const cleanObject = (obj: any) => {
const cleanedObj = {};
Object.keys(obj).forEach((key) => {
if (isObject(obj[key])) {
if (obj[key].edges) {
// Handle edges by mapping over them and applying cleanObject to each node
cleanedObj[key] = obj[key].edges.map((edge) =>
cleanObject(edge.node),
);
} else {
// Recursively clean nested objects
cleanedObj[key] = cleanObject(obj[key]);
}
} else {
// Directly assign non-object properties
cleanedObj[key] = obj[key];
}
});
return cleanedObj;
};
Object.keys(input).forEach((key) => {
if (isObject(input[key]) && input[key].edges) {
// Handle collections with edges, ensuring data is placed under the data key
output.data[key] = input[key].edges.map((edge) => cleanObject(edge.node));
// Move pageInfo and totalCount to the top level
if (input[key].pageInfo) {
output['pageInfo'] = input[key].pageInfo;
}
if (input[key].totalCount) {
output['totalCount'] = input[key].totalCount;
}
} else if (isObject(input[key])) {
// Recursively clean and assign nested objects under the data key
output.data[key] = cleanObject(input[key]);
} else if (Array.isArray(input[key])) {
const itemsWithEdges = input[key].filter((item) => item.edges);
const cleanedObjArray = itemsWithEdges.map(({ edges, ...item }) => {
return {
...item,
[key]: edges.map((edge) => cleanObject(edge.node)),
};
});
output.data = cleanedObjArray;
} else {
// Assign all other properties directly under the data key
output.data[key] = input[key];
}
});
return output;
};