feat: refactor schema builder and resolver builder (#2215)
* feat: wip refactor schema builder * feat: wip store types and first queries generation * feat: refactor schema-builder and resolver-builder * fix: clean & small type fix * fix: avoid breaking change * fix: remove util from pg-graphql classes * fix: required default fields * Refactor frontend accordingly --------- Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
@ -2,6 +2,7 @@ import { ApolloClient, useMutation } from '@apollo/client';
|
||||
import { getOperationName } from '@apollo/client/utilities';
|
||||
|
||||
import { FieldType } from '@/ui/object/field/types/FieldType';
|
||||
import { FieldMetadataType } from '~/generated/graphql';
|
||||
import {
|
||||
CreateOneMetadataFieldMutation,
|
||||
CreateOneMetadataFieldMutationVariables,
|
||||
@ -12,10 +13,12 @@ import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries';
|
||||
|
||||
import { useApolloMetadataClient } from './useApolloMetadataClient';
|
||||
|
||||
type CreateOneMetadataFieldArgs =
|
||||
CreateOneMetadataFieldMutationVariables['input']['field'] & {
|
||||
type: FieldType;
|
||||
};
|
||||
type CreateOneMetadataFieldArgs = Omit<
|
||||
CreateOneMetadataFieldMutationVariables['input']['field'],
|
||||
'type'
|
||||
> & {
|
||||
type: FieldType;
|
||||
};
|
||||
|
||||
export const useCreateOneMetadataField = () => {
|
||||
const apolloMetadataClient = useApolloMetadataClient();
|
||||
@ -33,6 +36,7 @@ export const useCreateOneMetadataField = () => {
|
||||
input: {
|
||||
field: {
|
||||
...input,
|
||||
type: input.type as FieldMetadataType, // Todo improve typing once we have aligned backend and frontend
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@ -1,44 +0,0 @@
|
||||
import { isNonEmptyArray } from '~/utils/isNonEmptyArray';
|
||||
|
||||
import { useCreateOneMetadataField } from './useCreateOneMetadataField';
|
||||
import { useCreateOneObjectMetadataItem } from './useCreateOneObjectMetadataItem';
|
||||
|
||||
export const useSeedCustomObjectsTemp = () => {
|
||||
const { createOneObjectMetadataItem } = useCreateOneObjectMetadataItem();
|
||||
const { createOneMetadataField } = useCreateOneMetadataField();
|
||||
|
||||
return async () => {
|
||||
const { data: createdObjectMetadataItem, errors } =
|
||||
await createOneObjectMetadataItem({
|
||||
labelPlural: 'Suppliers',
|
||||
labelSingular: 'Supplier',
|
||||
nameSingular: 'supplier',
|
||||
namePlural: 'suppliers',
|
||||
description: 'Suppliers',
|
||||
icon: 'IconBuilding',
|
||||
});
|
||||
|
||||
if (!isNonEmptyArray(errors)) {
|
||||
const supplierObjectId =
|
||||
createdObjectMetadataItem?.createOneObject?.id ?? '';
|
||||
|
||||
await createOneMetadataField({
|
||||
objectId: supplierObjectId,
|
||||
name: 'name',
|
||||
type: 'text',
|
||||
description: 'Name',
|
||||
label: 'Name',
|
||||
icon: 'IconBuilding',
|
||||
});
|
||||
|
||||
await createOneMetadataField({
|
||||
objectId: supplierObjectId,
|
||||
label: 'City',
|
||||
name: 'city',
|
||||
type: 'text',
|
||||
description: 'City',
|
||||
icon: 'IconMap',
|
||||
});
|
||||
}
|
||||
};
|
||||
};
|
||||
@ -12,5 +12,5 @@ export const formatMetadataFieldAsFilterDefinition = ({
|
||||
fieldId: field.id,
|
||||
label: field.label,
|
||||
Icon: icons[field.icon ?? 'Icon123'],
|
||||
type: 'text',
|
||||
type: 'TEXT',
|
||||
});
|
||||
|
||||
@ -13,7 +13,7 @@ export const generateCreateOneObjectMutation = ({
|
||||
|
||||
return gql`
|
||||
mutation CreateOne${capitalizedObjectName}($input: ${capitalizedObjectName}CreateInput!) {
|
||||
createOne${capitalizedObjectName}(data: $input) {
|
||||
create${capitalizedObjectName}(data: $input) {
|
||||
id
|
||||
}
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@ export const generateDeleteOneObjectMutation = ({
|
||||
|
||||
return gql`
|
||||
mutation DeleteOne${capitalizedObjectName}($idToDelete: ID!) {
|
||||
deleteOne${capitalizedObjectName}(id: $idToDelete) {
|
||||
delete${capitalizedObjectName}(id: $idToDelete) {
|
||||
id
|
||||
}
|
||||
}
|
||||
|
||||
@ -18,7 +18,7 @@ export const generateFindManyCustomObjectsQuery = ({
|
||||
objectMetadataItem.nameSingular,
|
||||
)}FilterInput, $orderBy: ${capitalize(
|
||||
objectMetadataItem.nameSingular,
|
||||
)}OrderBy) {
|
||||
)}OrderByInput) {
|
||||
${objectMetadataItem.namePlural}(filter: $filter, orderBy: $orderBy){
|
||||
edges {
|
||||
node {
|
||||
|
||||
@ -13,7 +13,7 @@ export const generateUpdateOneObjectMutation = ({
|
||||
|
||||
return gql`
|
||||
mutation UpdateOne${capitalizedObjectName}($idToUpdate: ID!, $input: ${capitalizedObjectName}UpdateInput!) {
|
||||
updateOne${capitalizedObjectName}(id: $idToUpdate, data: $input) {
|
||||
update${capitalizedObjectName}(id: $idToUpdate, data: $input) {
|
||||
id
|
||||
}
|
||||
}
|
||||
|
||||
@ -7,20 +7,20 @@ export const mapFieldMetadataToGraphQLQuery = (field: Field) => {
|
||||
|
||||
const fieldIsSimpleValue = (
|
||||
[
|
||||
'text',
|
||||
'phone',
|
||||
'date',
|
||||
'email',
|
||||
'number',
|
||||
'boolean',
|
||||
'date',
|
||||
'TEXT',
|
||||
'PHONE',
|
||||
'DATE',
|
||||
'EMAIL',
|
||||
'NUMBER',
|
||||
'BOOLEAN',
|
||||
'DATE',
|
||||
] as FieldType[]
|
||||
).includes(fieldType);
|
||||
|
||||
const fieldIsURL = fieldType === 'url' || fieldType === 'urlV2';
|
||||
const fieldIsURL = fieldType === 'URL' || fieldType === 'URL_V2';
|
||||
|
||||
const fieldIsMoneyAmount =
|
||||
fieldType === 'money' || fieldType === 'moneyAmountV2';
|
||||
fieldType === 'MONEY' || fieldType === 'MONEY_AMOUNT_V2';
|
||||
|
||||
if (fieldIsSimpleValue) {
|
||||
return field.name;
|
||||
|
||||
@ -2,11 +2,11 @@ import { FieldType } from '@/ui/object/field/types/FieldType';
|
||||
|
||||
export const parseFieldType = (fieldType: string): FieldType => {
|
||||
if (fieldType === 'url') {
|
||||
return 'urlV2';
|
||||
return 'URL_V2';
|
||||
}
|
||||
|
||||
if (fieldType === 'money') {
|
||||
return 'moneyAmountV2';
|
||||
return 'MONEY_AMOUNT_V2';
|
||||
}
|
||||
|
||||
return fieldType as FieldType;
|
||||
|
||||
Reference in New Issue
Block a user