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>
This commit is contained in:
gitstart-app[bot]
2024-08-01 10:08:22 +02:00
committed by GitHub
parent c3417ddba1
commit d9dcd63a1c
13 changed files with 329 additions and 49 deletions

View File

@ -72,4 +72,94 @@ describe('cleanGraphQLResponse', () => {
expect(cleanGraphQLResponse(data)).toEqual(expectedResult);
});
it('should remove nested edges/node from results if data key is an array', () => {
const data = {
companyDuplicates: [
{
totalCount: 14,
pageInfo: {
hasNextPage: true,
startCursor:
'WyIwMDliYjNkYy1hNGEyLTRiNWUtYTZmYi1iMTFiMmFlMGI1MmIiXQ==',
endCursor:
'WyIyMDIwMjAyMC0wNzEzLTQwYTUtODIxNi04MjgwMjQwMWQzM2UiXQ==',
},
edges: [
{
node: {
id: 'id',
createdAt: '2023-01-01',
people: {
edges: [{ node: { id: 'id1' } }, { node: { id: 'id2' } }],
},
},
},
],
},
{
totalCount: 14,
pageInfo: {
hasNextPage: true,
startCursor:
'WyIwMDliYjNkYy1hNGEyLTRiNWUtYTZmYi1iMTFiMmFlMGI1MmIiXQ==',
endCursor:
'WyIyMDIwMjAyMC0wNzEzLTQwYTUtODIxNi04MjgwMjQwMWQzM2UiXQ==',
},
edges: [
{
node: {
id: 'id',
createdAt: '2023-01-01',
people: {
edges: [{ node: { id: 'id1' } }, { node: { id: 'id2' } }],
},
},
},
],
},
],
};
const expectedResult = {
data: [
{
totalCount: 14,
pageInfo: {
hasNextPage: true,
startCursor:
'WyIwMDliYjNkYy1hNGEyLTRiNWUtYTZmYi1iMTFiMmFlMGI1MmIiXQ==',
endCursor:
'WyIyMDIwMjAyMC0wNzEzLTQwYTUtODIxNi04MjgwMjQwMWQzM2UiXQ==',
},
companyDuplicates: [
{
id: 'id',
createdAt: '2023-01-01',
people: [{ id: 'id1' }, { id: 'id2' }],
},
],
},
{
totalCount: 14,
pageInfo: {
hasNextPage: true,
startCursor:
'WyIwMDliYjNkYy1hNGEyLTRiNWUtYTZmYi1iMTFiMmFlMGI1MmIiXQ==',
endCursor:
'WyIyMDIwMjAyMC0wNzEzLTQwYTUtODIxNi04MjgwMjQwMWQzM2UiXQ==',
},
companyDuplicates: [
{
id: 'id',
createdAt: '2023-01-01',
people: [{ id: 'id1' }, { id: 'id2' }],
},
],
},
],
};
expect(cleanGraphQLResponse(data)).toEqual(expectedResult);
});
});

View File

@ -43,6 +43,16 @@ export const cleanGraphQLResponse = (input: any) => {
} 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];