Implement eager load relations on graphqlQueries (#4391)

* Implement eager load relations on graphqlQueries

* Fix tests

* Fixes

* Fixes
This commit is contained in:
Charles Bochet
2024-03-10 23:42:23 +01:00
committed by GitHub
parent 86c0f311f5
commit ec384cc791
42 changed files with 1372 additions and 850 deletions

View File

@ -5,72 +5,28 @@ import { Person } from '@/people/types/Person';
export const query = gql`
mutation CreatePeople($data: [PersonCreateInput!]!) {
createPeople(data: $data) {
id
opportunities {
edges {
node {
__typename
id
}
__typename
xLink {
label
url
}
}
xLink {
label
url
}
id
pointOfContactForOpportunities {
edges {
node {
__typename
id
}
}
}
createdAt
company {
__typename
id
}
city
email
activityTargets {
edges {
node {
__typename
id
}
createdAt
city
email
jobTitle
name {
firstName
lastName
}
}
jobTitle
favorites {
edges {
node {
__typename
id
}
phone
linkedinLink {
label
url
}
}
attachments {
edges {
node {
__typename
id
}
}
}
name {
firstName
lastName
}
phone
linkedinLink {
label
url
}
updatedAt
avatarUrl
companyId
updatedAt
avatarUrl
companyId
}
}
`;
@ -86,32 +42,15 @@ const data = [
export const variables = { data };
export const responseData = {
opportunities: {
edges: [],
},
__typeName: '',
xLink: {
label: '',
url: '',
},
pointOfContactForOpportunities: {
edges: [],
},
createdAt: '',
company: {
id: '',
},
city: '',
email: '',
activityTargets: {
edges: [],
},
jobTitle: '',
favorites: {
edges: [],
},
attachments: {
edges: [],
},
name: {
firstName: '',
lastName: '',

View File

@ -3,72 +3,28 @@ import { gql } from '@apollo/client';
export const query = gql`
mutation CreateOnePerson($input: PersonCreateInput!) {
createPerson(data: $input) {
id
opportunities {
edges {
node {
__typename
id
}
__typename
xLink {
label
url
}
}
xLink {
label
url
}
id
pointOfContactForOpportunities {
edges {
node {
__typename
id
}
}
}
createdAt
company {
__typename
id
}
city
email
activityTargets {
edges {
node {
__typename
id
}
createdAt
city
email
jobTitle
name {
firstName
lastName
}
}
jobTitle
favorites {
edges {
node {
__typename
id
}
phone
linkedinLink {
label
url
}
}
attachments {
edges {
node {
__typename
id
}
}
}
name {
firstName
lastName
}
phone
linkedinLink {
label
url
}
updatedAt
avatarUrl
companyId
updatedAt
avatarUrl
companyId
}
}
`;

View File

@ -5,72 +5,28 @@ export { responseData } from './useUpdateOneRecord';
export const query = gql`
mutation ExecuteQuickActionOnOnePerson($idToExecuteQuickActionOn: ID!) {
executeQuickActionOnPerson(id: $idToExecuteQuickActionOn) {
id
opportunities {
edges {
node {
__typename
id
}
__typename
xLink {
label
url
}
}
xLink {
label
url
}
id
pointOfContactForOpportunities {
edges {
node {
__typename
id
}
}
}
createdAt
company {
__typename
id
}
city
email
activityTargets {
edges {
node {
__typename
id
}
createdAt
city
email
jobTitle
name {
firstName
lastName
}
}
jobTitle
favorites {
edges {
node {
__typename
id
}
phone
linkedinLink {
label
url
}
}
attachments {
edges {
node {
__typename
id
}
}
}
name {
firstName
lastName
}
phone
linkedinLink {
label
url
}
updatedAt
avatarUrl
companyId
updatedAt
avatarUrl
companyId
}
}
`;

View File

@ -5,72 +5,28 @@ import { responseData as person } from './useUpdateOneRecord';
export const query = gql`
query FindOnePerson($objectRecordId: UUID!) {
person(filter: { id: { eq: $objectRecordId } }) {
id
opportunities {
edges {
node {
__typename
id
__typename
xLink {
label
url
}
}
}
xLink {
label
url
}
id
pointOfContactForOpportunities {
edges {
node {
__typename
id
id
createdAt
city
email
jobTitle
name {
firstName
lastName
}
}
}
createdAt
company {
__typename
id
}
city
email
activityTargets {
edges {
node {
__typename
id
phone
linkedinLink {
label
url
}
}
}
jobTitle
favorites {
edges {
node {
__typename
id
}
}
}
attachments {
edges {
node {
__typename
id
}
}
}
name {
firstName
lastName
}
phone
linkedinLink {
label
url
}
updatedAt
avatarUrl
companyId
updatedAt
avatarUrl
companyId
}
}
`;

View File

@ -3,72 +3,28 @@ import { gql } from '@apollo/client';
export const query = gql`
mutation UpdateOnePerson($idToUpdate: ID!, $input: PersonUpdateInput!) {
updatePerson(id: $idToUpdate, data: $input) {
id
opportunities {
edges {
node {
__typename
id
}
__typename
xLink {
label
url
}
}
xLink {
label
url
}
id
pointOfContactForOpportunities {
edges {
node {
__typename
id
}
}
}
createdAt
company {
__typename
id
}
city
email
activityTargets {
edges {
node {
__typename
id
}
createdAt
city
email
jobTitle
name {
firstName
lastName
}
}
jobTitle
favorites {
edges {
node {
__typename
id
}
phone
linkedinLink {
label
url
}
}
attachments {
edges {
node {
__typename
id
}
}
}
name {
firstName
lastName
}
phone
linkedinLink {
label
url
}
updatedAt
avatarUrl
companyId
updatedAt
avatarUrl
companyId
}
}
`;
@ -127,6 +83,6 @@ export const variables = {
};
export const responseData = {
...basePerson,
...{ ...basePerson, __typename: 'Person' },
...connectedObjects,
};

View File

@ -1,8 +1,10 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { isNullable } from '~/utils/isNullable';
import { capitalize } from '~/utils/string/capitalize';
@ -15,7 +17,7 @@ export const useGenerateCreateManyRecordMutation = ({
}: {
objectMetadataItem: ObjectMetadataItem;
}) => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState());
if (isNullable(objectMetadataItem)) {
return EMPTY_MUTATION;
@ -29,15 +31,9 @@ export const useGenerateCreateManyRecordMutation = ({
mutation Create${capitalize(
objectMetadataItem.namePlural,
)}($data: [${capitalize(objectMetadataItem.nameSingular)}CreateInput!]!) {
${mutationResponseField}(data: $data) {
id
${objectMetadataItem.fields
.map((field) =>
mapFieldMetadataToGraphQLQuery({
field,
}),
)
.join('\n')}
}
${mutationResponseField}(data: $data) ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
})}
}`;
};

View File

@ -1,8 +1,10 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { isNullable } from '~/utils/isNullable';
import { capitalize } from '~/utils/string/capitalize';
@ -15,7 +17,7 @@ export const useGenerateCreateOneRecordMutation = ({
}: {
objectMetadataItem: ObjectMetadataItem;
}) => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState());
if (isNullable(objectMetadataItem)) {
return EMPTY_MUTATION;
@ -29,16 +31,10 @@ export const useGenerateCreateOneRecordMutation = ({
return gql`
mutation CreateOne${capitalizedObjectName}($input: ${capitalizedObjectName}CreateInput!) {
${mutationResponseField}(data: $input) {
id
${objectMetadataItem.fields
.map((field) =>
mapFieldMetadataToGraphQLQuery({
field,
}),
)
.join('\n')}
}
${mutationResponseField}(data: $input) ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
})}
}
`;
};

View File

@ -1,8 +1,10 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { isNullable } from '~/utils/isNullable';
import { capitalize } from '~/utils/string/capitalize';
@ -19,7 +21,7 @@ export const useGenerateExecuteQuickActionOnOneRecordMutation = ({
}: {
objectMetadataItem: ObjectMetadataItem;
}) => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState());
if (isNullable(objectMetadataItem)) {
return EMPTY_MUTATION;
@ -34,16 +36,12 @@ export const useGenerateExecuteQuickActionOnOneRecordMutation = ({
return gql`
mutation ExecuteQuickActionOnOne${capitalizedObjectName}($idToExecuteQuickActionOn: ID!) {
${graphQLFieldForExecuteQuickActionOnOneRecordMutation}(id: $idToExecuteQuickActionOn) {
id
${objectMetadataItem.fields
.map((field) =>
mapFieldMetadataToGraphQLQuery({
field,
}),
)
.join('\n')}
}
${graphQLFieldForExecuteQuickActionOnOneRecordMutation}(id: $idToExecuteQuickActionOn) ${mapObjectMetadataToGraphQLQuery(
{
objectMetadataItems,
objectMetadataItem,
},
)}
}
`;
};

View File

@ -1,7 +1,9 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { capitalize } from '~/utils/string/capitalize';
export const getFindDuplicateRecordsQueryResponseField = (
@ -9,13 +11,13 @@ export const getFindDuplicateRecordsQueryResponseField = (
) => `${objectNameSingular}Duplicates`;
export const useGenerateFindDuplicateRecordsQuery = () => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState());
return ({
objectMetadataItem,
depth,
}: {
objectMetadataItem: ObjectMetadataItem;
objectMetadataItem: Pick<ObjectMetadataItem, 'fields' | 'nameSingular'>;
depth?: number;
}) => gql`
query FindDuplicate${capitalize(objectMetadataItem.nameSingular)}($id: ID) {
@ -23,17 +25,11 @@ export const useGenerateFindDuplicateRecordsQuery = () => {
objectMetadataItem.nameSingular,
)}(id: $id) {
edges {
node {
id
${objectMetadataItem.fields
.map((field) =>
mapFieldMetadataToGraphQLQuery({
field,
depth,
}),
)
.join('\n')}
}
node ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
depth,
})}
cursor
}
pageInfo {

View File

@ -1,7 +1,7 @@
import { gql } from '@apollo/client';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { isNonEmptyArray } from '~/utils/isNonEmptyArray';
import { capitalize } from '~/utils/string/capitalize';
@ -12,8 +12,6 @@ export const useGenerateFindManyRecordsForMultipleMetadataItemsQuery = ({
objectMetadataItems: ObjectMetadataItem[];
depth?: number;
}) => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const capitalizedObjectNameSingulars = objectMetadataItems.map(
({ nameSingular }) => capitalize(nameSingular),
);
@ -59,26 +57,22 @@ export const useGenerateFindManyRecordsForMultipleMetadataItemsQuery = ({
) {
${objectMetadataItems
.map(
({ namePlural, nameSingular, fields }) =>
`${namePlural}(filter: $filter${capitalize(
nameSingular,
(objectMetadataItem) =>
`${objectMetadataItem.namePlural}(filter: $filter${capitalize(
objectMetadataItem.nameSingular,
)}, orderBy: $orderBy${capitalize(
nameSingular,
objectMetadataItem.nameSingular,
)}, first: $limit${capitalize(
nameSingular,
)}, after: $lastCursor${capitalize(nameSingular)}){
objectMetadataItem.nameSingular,
)}, after: $lastCursor${capitalize(
objectMetadataItem.nameSingular,
)}){
edges {
node {
id
${fields
.map((field) =>
mapFieldMetadataToGraphQLQuery({
field,
depth,
}),
)
.join('\n')}
}
node ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
depth,
})}
cursor
}
pageInfo {

View File

@ -1,18 +1,25 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { capitalize } from '~/utils/string/capitalize';
export const useGenerateFindManyRecordsQuery = () => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState());
return ({
objectMetadataItem,
depth,
eagerLoadedRelations,
}: {
objectMetadataItem: ObjectMetadataItem;
objectMetadataItem: Pick<
ObjectMetadataItem,
'fields' | 'nameSingular' | 'namePlural'
>;
depth?: number;
eagerLoadedRelations?: Record<string, any>;
}) => gql`
query FindMany${capitalize(
objectMetadataItem.namePlural,
@ -25,17 +32,12 @@ export const useGenerateFindManyRecordsQuery = () => {
objectMetadataItem.namePlural
}(filter: $filter, orderBy: $orderBy, first: $limit, after: $lastCursor){
edges {
node {
id
${objectMetadataItem.fields
.map((field) =>
mapFieldMetadataToGraphQLQuery({
field,
depth,
}),
)
.join('\n')}
}
node ${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
depth,
eagerLoadedRelations,
})}
cursor
}
pageInfo {

View File

@ -1,17 +1,19 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { capitalize } from '~/utils/string/capitalize';
export const useGenerateFindOneRecordQuery = () => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState());
return ({
objectMetadataItem,
depth,
}: {
objectMetadataItem: Pick<ObjectMetadataItem, 'nameSingular' | 'fields'>;
objectMetadataItem: Pick<ObjectMetadataItem, 'fields' | 'nameSingular'>;
depth?: number;
}) => {
return gql`
@ -22,17 +24,11 @@ export const useGenerateFindOneRecordQuery = () => {
id: {
eq: $objectRecordId
}
}){
id
${objectMetadataItem.fields
.map((field) =>
mapFieldMetadataToGraphQLQuery({
field,
depth,
}),
)
.join('\n')}
}
})${mapObjectMetadataToGraphQLQuery({
objectMetadataItems,
objectMetadataItem,
depth,
})}
}
`;
};

View File

@ -1,8 +1,10 @@
import { gql } from '@apollo/client';
import { useRecoilValue } from 'recoil';
import { useMapFieldMetadataToGraphQLQuery } from '@/object-metadata/hooks/useMapFieldMetadataToGraphQLQuery';
import { EMPTY_MUTATION } from '@/object-metadata/hooks/useObjectMetadataItem';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem';
import { mapObjectMetadataToGraphQLQuery } from '@/object-metadata/utils/mapObjectMetadataToGraphQLQuery';
import { isNullable } from '~/utils/isNullable';
import { capitalize } from '~/utils/string/capitalize';
@ -15,7 +17,7 @@ export const useGenerateUpdateOneRecordMutation = ({
}: {
objectMetadataItem: ObjectMetadataItem;
}) => {
const mapFieldMetadataToGraphQLQuery = useMapFieldMetadataToGraphQLQuery();
const objectMetadataItems = useRecoilValue(objectMetadataItemsState());
if (isNullable(objectMetadataItem)) {
return EMPTY_MUTATION;
@ -29,12 +31,12 @@ export const useGenerateUpdateOneRecordMutation = ({
return gql`
mutation UpdateOne${capitalizedObjectName}($idToUpdate: ID!, $input: ${capitalizedObjectName}UpdateInput!) {
${mutationResponseField}(id: $idToUpdate, data: $input) {
id
${objectMetadataItem.fields
.map((field) => mapFieldMetadataToGraphQLQuery({ field }))
.join('\n')}
}
${mutationResponseField}(id: $idToUpdate, data: $input) ${mapObjectMetadataToGraphQLQuery(
{
objectMetadataItems,
objectMetadataItem,
},
)}
}
`;
};

View File

@ -20,7 +20,7 @@ export const useUpdateOneRecord = <
const apolloClient = useApolloClient();
const { objectMetadataItem, updateOneRecordMutation, getRecordFromCache } =
useObjectMetadataItem({ objectNameSingular });
useObjectMetadataItem({ objectNameSingular }, 1);
const { generateObjectRecordOptimisticResponse } =
useGenerateObjectRecordOptimisticResponse({