From 00fea179204b43e95491cb3cdc4dd37adcb53924 Mon Sep 17 00:00:00 2001 From: martmull Date: Mon, 29 Jul 2024 13:03:09 +0200 Subject: [PATCH] Serverless function UI (#6388) https://www.figma.com/design/xt8O9mFeLl46C5InWwoMrN/Twenty?node-id=36235-120877 Did not do the file manager part. A Function is defined using one unique file at the moment Feature protected by featureFlag `IS_FUNCTION_SETTINGS_ENABLED` ## Demo https://github.com/user-attachments/assets/0acb8291-47b4-4521-a6fa-a88b9198609b --- packages/twenty-front/codegen-metadata.cjs | 1 + packages/twenty-front/codegen.cjs | 1 + .../background/empty_functions_bg.png | Bin 0 -> 4517 bytes .../dark-background/empty_functions_bg.png | Bin 0 -> 4237 bytes .../dark-moving-image/empty_functions.png | Bin 0 -> 17099 bytes .../moving-image/empty_functions.png | Bin 0 -> 17413 bytes packages/twenty-front/src/App.tsx | 29 ++- .../src/generated-metadata/gql.ts | 35 ++++ .../src/generated-metadata/graphql.ts | 169 ++++++++++++++---- .../twenty-front/src/generated/graphql.tsx | 39 ++-- .../components/ActivityBodyEditor.tsx | 6 +- .../files/components/AttachmentRow.tsx | 4 +- .../activities/files/utils/downloadFile.ts | 4 +- .../SettingsNavigationDrawerItems.tsx | 11 ++ .../SettingsServerlessFunctionNewForm.tsx | 41 +++++ ...gsServerlessFunctionsFieldItemTableRow.tsx | 46 +++++ .../SettingsServerlessFunctionsTable.tsx | 51 ++++++ .../SettingsServerlessFunctionsTableEmpty.tsx | 43 +++++ ...ettingsServerlessFunctionCodeEditorTab.tsx | 60 +++++++ .../SettingsServerlessFunctionSettingsTab.tsx | 62 +++++++ .../SettingsServerlessFunctionTestTab.tsx | 81 +++++++++ ...ettingsServerlessFunctionTestTabEffect.tsx | 23 +++ .../fragments/serverlessFunctionFragment.ts | 15 ++ .../mutations/createOneServerlessFunction.ts | 13 ++ .../mutations/deleteOneServerlessFunction.ts | 11 ++ .../mutations/executeOneServerlessFunction.ts | 9 + .../mutations/updateOneServerlessFunction.ts | 11 ++ .../queries/findManyServerlessFunctions.ts | 15 ++ .../queries/findOneServerlessFunction.ts | 11 ++ ...eServerlessFunctionUpdateFormState.test.ts | 34 ++++ .../hooks/useCreateOneServerlessFunction.ts | 35 ++++ .../hooks/useDeleteOneServerlessFunction.ts | 34 ++++ .../hooks/useExecuteOneServerlessFunction.ts | 30 ++++ .../hooks/useGetManyServerlessFunctions.ts | 21 +++ .../hooks/useGetOneServerlessFunction.ts | 23 +++ .../useServerlessFunctionUpdateFormState.ts | 57 ++++++ .../hooks/useUpdateOneServerlessFunction.ts | 34 ++++ ...lessFunctionCodeEditorOutputParamsState.ts | 7 + .../settingsServerlessFunctionInputState.ts | 6 + .../settingsServerlessFunctionOutputState.ts | 6 + .../__tests__/getSettingsPagePath.test.ts | 15 ++ .../settings/utils/getSettingsPagePath.ts | 5 + .../src/modules/types/SettingsPath.ts | 3 + .../code-editor/components/CodeEditor.tsx | 80 +++++++++ .../components/CodeEditorHeader.tsx | 51 ++++++ .../code-editor/theme/CodeEditorTheme.ts | 33 ++++ .../modules/ui/input/components/TextArea.tsx | 1 - .../constants/Background.ts | 1 + .../constants/DarkBackground.ts | 1 + .../constants/DarkMovingImage.ts | 1 + .../constants/MovingImage.ts | 1 + .../ui/layout/tab/components/TabList.tsx | 10 +- .../modules/workspace/types/FeatureFlagKey.ts | 1 + .../api-keys/SettingsDevelopersApiKeysNew.tsx | 3 +- .../ResetServerlessFunctionStatesEffect.tsx | 20 +++ .../SettingsServerlessFunctionDetail.tsx | 156 ++++++++++++++++ ...ettingsServerlessFunctionDetailWrapper.tsx | 11 ++ .../SettingsServerlessFunctions.tsx | 36 ++++ .../SettingsServerlessFunctionsNew.tsx | 81 +++++++++ ...ttingsServerlessFunctionDetail.stories.tsx | 69 +++++++ .../SettingsServerlessFunctions.stories.tsx | 32 ++++ ...SettingsServerlessFunctionsNew.stories.tsx | 37 ++++ .../array/__tests__/sortByAscString.test.ts | 9 + .../file/__tests__/getFileAbsoluteURI.test.ts | 10 ++ .../src/utils/file/getFileAbsoluteURI.ts | 5 + .../twenty-front/src/utils/title-utils.ts | 4 + packages/twenty-server/package.json | 2 + .../typeorm-seeds/core/feature-flags.ts | 5 + ...08-addRuntimeColumnToServerlessFunction.ts | 25 +++ .../feature-flag/feature-flag.entity.ts | 1 + .../engine/core-modules/file/file.utils.ts | 6 +- .../interfaces/storage-driver.interface.ts | 1 + .../file-storage/drivers/local.driver.ts | 13 ++ .../file-storage/drivers/s3.driver.ts | 54 ++++++ .../file-storage/file-storage.service.ts | 4 + .../interfaces/serverless-driver.interface.ts | 1 + .../serverless/drivers/lambda.driver.ts | 63 +++++-- .../serverless/drivers/local.driver.ts | 46 ++++- .../serverless/serverless.service.ts | 4 + ...ate-serverless-function-from-file.input.ts | 16 ++ .../dtos/create-serverless-function.input.ts | 13 ++ .../dtos/delete-serverless-function.input.ts | 9 + .../dtos/execute-serverless-function.input.ts | 12 +- ...rverless-function-execution-result.dto.ts} | 2 +- .../dtos/serverless-function.dto.ts | 16 +- .../dtos/update-serverless-function.input.ts | 29 +++ .../serverless-function.entity.ts | 13 ++ .../serverless-function.exception.ts | 1 + .../serverless-function.module.ts | 3 + .../serverless-function.resolver.ts | 115 ++++++++++-- .../serverless-function.service.ts | 124 ++++++++++--- ...ion-graphql-api-exception-handler.utils.ts | 1 + .../commands/add-standard-id.command.ts | 2 + .../display/icon/components/TablerIcons.ts | 3 + .../twenty-ui/src/theme/constants/CodeDark.ts | 10 ++ .../src/theme/constants/CodeLight.ts | 10 ++ .../src/theme/constants/ThemeDark.ts | 2 + .../src/theme/constants/ThemeLight.ts | 2 + packages/twenty-ui/src/theme/index.ts | 2 + yarn.lock | 40 +++++ 100 files changed, 2283 insertions(+), 121 deletions(-) create mode 100644 packages/twenty-front/public/images/placeholders/background/empty_functions_bg.png create mode 100644 packages/twenty-front/public/images/placeholders/dark-background/empty_functions_bg.png create mode 100644 packages/twenty-front/public/images/placeholders/dark-moving-image/empty_functions.png create mode 100644 packages/twenty-front/public/images/placeholders/moving-image/empty_functions.png create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionNewForm.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionsFieldItemTableRow.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionsTable.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/SettingsServerlessFunctionsTableEmpty.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/tabs/SettingsServerlessFunctionCodeEditorTab.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/tabs/SettingsServerlessFunctionSettingsTab.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/tabs/SettingsServerlessFunctionTestTab.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/components/tabs/SettingsServerlessFunctionTestTabEffect.tsx create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/graphql/fragments/serverlessFunctionFragment.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/graphql/mutations/createOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/graphql/mutations/deleteOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/graphql/mutations/executeOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/graphql/mutations/updateOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/graphql/queries/findManyServerlessFunctions.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/graphql/queries/findOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/__tests__/useServerlessFunctionUpdateFormState.test.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/useCreateOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/useDeleteOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/useExecuteOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/useGetManyServerlessFunctions.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/useGetOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/useServerlessFunctionUpdateFormState.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/hooks/useUpdateOneServerlessFunction.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/states/settingsServerlessFunctionCodeEditorOutputParamsState.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/states/settingsServerlessFunctionInputState.ts create mode 100644 packages/twenty-front/src/modules/settings/serverless-functions/states/settingsServerlessFunctionOutputState.ts create mode 100644 packages/twenty-front/src/modules/settings/utils/__tests__/getSettingsPagePath.test.ts create mode 100644 packages/twenty-front/src/modules/ui/input/code-editor/components/CodeEditor.tsx create mode 100644 packages/twenty-front/src/modules/ui/input/code-editor/components/CodeEditorHeader.tsx create mode 100644 packages/twenty-front/src/modules/ui/input/code-editor/theme/CodeEditorTheme.ts create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/ResetServerlessFunctionStatesEffect.tsx create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctionDetail.tsx create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctionDetailWrapper.tsx create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctions.tsx create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/SettingsServerlessFunctionsNew.tsx create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/__stories__/SettingsServerlessFunctionDetail.stories.tsx create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/__stories__/SettingsServerlessFunctions.stories.tsx create mode 100644 packages/twenty-front/src/pages/settings/serverless-functions/__stories__/SettingsServerlessFunctionsNew.stories.tsx create mode 100644 packages/twenty-front/src/utils/array/__tests__/sortByAscString.test.ts create mode 100644 packages/twenty-front/src/utils/file/__tests__/getFileAbsoluteURI.test.ts create mode 100644 packages/twenty-front/src/utils/file/getFileAbsoluteURI.ts create mode 100644 packages/twenty-server/src/database/typeorm/metadata/migrations/1721309629608-addRuntimeColumnToServerlessFunction.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/serverless-function/dtos/create-serverless-function-from-file.input.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/serverless-function/dtos/create-serverless-function.input.ts create mode 100644 packages/twenty-server/src/engine/metadata-modules/serverless-function/dtos/delete-serverless-function.input.ts rename packages/twenty-server/src/engine/metadata-modules/serverless-function/dtos/{serverless-function-execution-result-d-t.o.ts => serverless-function-execution-result.dto.ts} (86%) create mode 100644 packages/twenty-server/src/engine/metadata-modules/serverless-function/dtos/update-serverless-function.input.ts create mode 100644 packages/twenty-ui/src/theme/constants/CodeDark.ts create mode 100644 packages/twenty-ui/src/theme/constants/CodeLight.ts diff --git a/packages/twenty-front/codegen-metadata.cjs b/packages/twenty-front/codegen-metadata.cjs index d7ee2eb00..e0ed6e079 100644 --- a/packages/twenty-front/codegen-metadata.cjs +++ b/packages/twenty-front/codegen-metadata.cjs @@ -3,6 +3,7 @@ module.exports = { documents: [ './src/modules/databases/graphql/**/*.ts', './src/modules/object-metadata/graphql/*.ts', + './src/modules/settings/serverless-functions/graphql/**/*.ts', './src/modules/object-record/graphql/*.tsx', './src/modules/metadata/graphql/*.ts', ], diff --git a/packages/twenty-front/codegen.cjs b/packages/twenty-front/codegen.cjs index fcc0ef27a..ceb453fb9 100644 --- a/packages/twenty-front/codegen.cjs +++ b/packages/twenty-front/codegen.cjs @@ -4,6 +4,7 @@ module.exports = { '!./src/modules/databases/**', '!./src/modules/object-metadata/**', '!./src/modules/object-record/**', + '!./src/modules/settings/serverless-functions/**', './src/modules/**/*.tsx', './src/modules/**/*.ts', '!./src/**/*.test.tsx', diff --git a/packages/twenty-front/public/images/placeholders/background/empty_functions_bg.png b/packages/twenty-front/public/images/placeholders/background/empty_functions_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c65890384cbd5d0f86b69ba319358e43099479b0 GIT binary patch literal 4517 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 IM6N<$f+wiziU0rr literal 0 HcmV?d00001 diff --git a/packages/twenty-front/src/App.tsx b/packages/twenty-front/src/App.tsx index c9740c087..a6bf9f218 100644 --- a/packages/twenty-front/src/App.tsx +++ b/packages/twenty-front/src/App.tsx @@ -82,7 +82,10 @@ import { SettingsWorkspace } from '~/pages/settings/SettingsWorkspace'; import { SettingsWorkspaceMembers } from '~/pages/settings/SettingsWorkspaceMembers'; import { Tasks } from '~/pages/tasks/Tasks'; import { getPageTitleFromPath } from '~/utils/title-utils'; +import { SettingsServerlessFunctions } from '~/pages/settings/serverless-functions/SettingsServerlessFunctions'; +import { SettingsServerlessFunctionsNew } from '~/pages/settings/serverless-functions/SettingsServerlessFunctionsNew'; import { useIsFeatureEnabled } from '@/workspace/hooks/useIsFeatureEnabled'; +import { SettingsServerlessFunctionDetailWrapper } from '~/pages/settings/serverless-functions/SettingsServerlessFunctionDetailWrapper'; const ProvidersThatNeedRouterContext = () => { const { pathname } = useLocation(); @@ -130,6 +133,7 @@ const ProvidersThatNeedRouterContext = () => { const createRouter = ( isBillingEnabled?: boolean, isCRMMigrationEnabled?: boolean, + isServerlessFunctionSettingsEnabled?: boolean, ) => createBrowserRouter( createRoutesFromElements( @@ -256,6 +260,22 @@ const createRouter = ( } /> + {isServerlessFunctionSettingsEnabled && ( + <> + } + /> + } + /> + } + /> + + )} } @@ -304,10 +324,17 @@ const createRouter = ( export const App = () => { const billing = useRecoilValue(billingState); const isCRMMigrationEnabled = useIsFeatureEnabled('IS_CRM_MIGRATION_ENABLED'); + const isServerlessFunctionSettingsEnabled = useIsFeatureEnabled( + 'IS_FUNCTION_SETTINGS_ENABLED', + ); return ( ); }; diff --git a/packages/twenty-front/src/generated-metadata/gql.ts b/packages/twenty-front/src/generated-metadata/gql.ts index ef3aa9642..d0d3459d9 100644 --- a/packages/twenty-front/src/generated-metadata/gql.ts +++ b/packages/twenty-front/src/generated-metadata/gql.ts @@ -33,6 +33,13 @@ const documents = { "\n mutation DeleteOneFieldMetadataItem($idToDelete: UUID!) {\n deleteOneField(input: { id: $idToDelete }) {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isNullable\n createdAt\n updatedAt\n }\n }\n": types.DeleteOneFieldMetadataItemDocument, "\n mutation DeleteOneRelationMetadataItem($idToDelete: UUID!) {\n deleteOneRelation(input: { id: $idToDelete }) {\n id\n }\n }\n": types.DeleteOneRelationMetadataItemDocument, "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n": types.ObjectMetadataItemsDocument, + "\n fragment ServerlessFunctionFields on ServerlessFunction {\n id\n name\n description\n sourceCodeHash\n sourceCodeFullPath\n runtime\n syncStatus\n createdAt\n updatedAt\n }\n": types.ServerlessFunctionFieldsFragmentDoc, + "\n \n mutation CreateOneServerlessFunctionItem(\n $input: CreateServerlessFunctionInput!\n ) {\n createOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n": types.CreateOneServerlessFunctionItemDocument, + "\n \n mutation DeleteOneServerlessFunction($input: DeleteServerlessFunctionInput!) {\n deleteOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n": types.DeleteOneServerlessFunctionDocument, + "\n mutation ExecuteOneServerlessFunction($id: UUID!, $payload: JSON!) {\n executeOneServerlessFunction(id: $id, payload: $payload) {\n result\n }\n }\n": types.ExecuteOneServerlessFunctionDocument, + "\n \n mutation UpdateOneServerlessFunction($input: UpdateServerlessFunctionInput!) {\n updateOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n": types.UpdateOneServerlessFunctionDocument, + "\n \n query GetManyServerlessFunctions {\n serverlessFunctions(paging: { first: 100 }) {\n edges {\n node {\n ...ServerlessFunctionFields\n }\n }\n }\n }\n": types.GetManyServerlessFunctionsDocument, + "\n \n query GetOneServerlessFunction($id: UUID!) {\n serverlessFunction(id: $id) {\n ...ServerlessFunctionFields\n }\n }\n": types.GetOneServerlessFunctionDocument, }; /** @@ -129,6 +136,34 @@ export function graphql(source: "\n mutation DeleteOneRelationMetadataItem($idT * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ export function graphql(source: "\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"): (typeof documents)["\n query ObjectMetadataItems(\n $objectFilter: objectFilter\n $fieldFilter: fieldFilter\n ) {\n objects(paging: { first: 1000 }, filter: $objectFilter) {\n edges {\n node {\n id\n dataSourceId\n nameSingular\n namePlural\n labelSingular\n labelPlural\n description\n icon\n isCustom\n isRemote\n isActive\n isSystem\n createdAt\n updatedAt\n labelIdentifierFieldMetadataId\n imageIdentifierFieldMetadataId\n fields(paging: { first: 1000 }, filter: $fieldFilter) {\n edges {\n node {\n id\n type\n name\n label\n description\n icon\n isCustom\n isActive\n isSystem\n isNullable\n createdAt\n updatedAt\n fromRelationMetadata {\n id\n relationType\n toObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n toFieldMetadataId\n }\n toRelationMetadata {\n id\n relationType\n fromObjectMetadata {\n id\n dataSourceId\n nameSingular\n namePlural\n isSystem\n isRemote\n }\n fromFieldMetadataId\n }\n defaultValue\n options\n relationDefinition {\n relationId\n direction\n sourceObjectMetadata {\n id\n nameSingular\n namePlural\n }\n sourceFieldMetadata {\n id\n name\n }\n targetObjectMetadata {\n id\n nameSingular\n namePlural\n }\n targetFieldMetadata {\n id\n name\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n }\n pageInfo {\n hasNextPage\n hasPreviousPage\n startCursor\n endCursor\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n fragment ServerlessFunctionFields on ServerlessFunction {\n id\n name\n description\n sourceCodeHash\n sourceCodeFullPath\n runtime\n syncStatus\n createdAt\n updatedAt\n }\n"): (typeof documents)["\n fragment ServerlessFunctionFields on ServerlessFunction {\n id\n name\n description\n sourceCodeHash\n sourceCodeFullPath\n runtime\n syncStatus\n createdAt\n updatedAt\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n \n mutation CreateOneServerlessFunctionItem(\n $input: CreateServerlessFunctionInput!\n ) {\n createOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"): (typeof documents)["\n \n mutation CreateOneServerlessFunctionItem(\n $input: CreateServerlessFunctionInput!\n ) {\n createOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n \n mutation DeleteOneServerlessFunction($input: DeleteServerlessFunctionInput!) {\n deleteOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"): (typeof documents)["\n \n mutation DeleteOneServerlessFunction($input: DeleteServerlessFunctionInput!) {\n deleteOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n mutation ExecuteOneServerlessFunction($id: UUID!, $payload: JSON!) {\n executeOneServerlessFunction(id: $id, payload: $payload) {\n result\n }\n }\n"): (typeof documents)["\n mutation ExecuteOneServerlessFunction($id: UUID!, $payload: JSON!) {\n executeOneServerlessFunction(id: $id, payload: $payload) {\n result\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n \n mutation UpdateOneServerlessFunction($input: UpdateServerlessFunctionInput!) {\n updateOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"): (typeof documents)["\n \n mutation UpdateOneServerlessFunction($input: UpdateServerlessFunctionInput!) {\n updateOneServerlessFunction(input: $input) {\n ...ServerlessFunctionFields\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n \n query GetManyServerlessFunctions {\n serverlessFunctions(paging: { first: 100 }) {\n edges {\n node {\n ...ServerlessFunctionFields\n }\n }\n }\n }\n"): (typeof documents)["\n \n query GetManyServerlessFunctions {\n serverlessFunctions(paging: { first: 100 }) {\n edges {\n node {\n ...ServerlessFunctionFields\n }\n }\n }\n }\n"]; +/** + * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. + */ +export function graphql(source: "\n \n query GetOneServerlessFunction($id: UUID!) {\n serverlessFunction(id: $id) {\n ...ServerlessFunctionFields\n }\n }\n"): (typeof documents)["\n \n query GetOneServerlessFunction($id: UUID!) {\n serverlessFunction(id: $id) {\n ...ServerlessFunctionFields\n }\n }\n"]; export function graphql(source: string) { return (documents as any)[source] ?? {}; diff --git a/packages/twenty-front/src/generated-metadata/graphql.ts b/packages/twenty-front/src/generated-metadata/graphql.ts index c33006259..0acd5cac7 100644 --- a/packages/twenty-front/src/generated-metadata/graphql.ts +++ b/packages/twenty-front/src/generated-metadata/graphql.ts @@ -247,6 +247,17 @@ export type CreateRemoteServerInput = { userMappingOptions?: InputMaybe; }; +export type CreateServerlessFunctionFromFileInput = { + description?: InputMaybe; + name: Scalars['String']['input']; +}; + +export type CreateServerlessFunctionInput = { + code: Scalars['String']['input']; + description?: InputMaybe; + name: Scalars['String']['input']; +}; + export type CursorPaging = { /** Paginate after opaque cursor */ after?: InputMaybe; @@ -273,6 +284,11 @@ export type DeleteOneRelationInput = { id: Scalars['UUID']['input']; }; +export type DeleteServerlessFunctionInput = { + /** The id of the function. */ + id: Scalars['ID']['input']; +}; + /** Schema update on a table */ export enum DistantTableUpdate { ColumnsAdded = 'COLUMNS_ADDED', @@ -415,11 +431,13 @@ export type Mutation = { createOneRelation: Relation; createOneRemoteServer: RemoteServer; createOneServerlessFunction: ServerlessFunction; + createOneServerlessFunctionFromFile: ServerlessFunction; deleteCurrentWorkspace: Workspace; deleteOneField: Field; deleteOneObject: Object; deleteOneRelation: Relation; deleteOneRemoteServer: RemoteServer; + deleteOneServerlessFunction: ServerlessFunction; deleteUser: User; disablePostgresProxy: PostgresCredentials; emailPasswordResetLink: EmailPasswordResetLink; @@ -442,6 +460,7 @@ export type Mutation = { updateOneField: Field; updateOneObject: Object; updateOneRemoteServer: RemoteServer; + updateOneServerlessFunction: ServerlessFunction; updatePasswordViaResetToken: InvalidatePassword; updateWorkspace: Workspace; uploadFile: Scalars['String']['output']; @@ -508,8 +527,13 @@ export type MutationCreateOneRemoteServerArgs = { export type MutationCreateOneServerlessFunctionArgs = { + input: CreateServerlessFunctionInput; +}; + + +export type MutationCreateOneServerlessFunctionFromFileArgs = { file: Scalars['Upload']['input']; - name: Scalars['String']['input']; + input: CreateServerlessFunctionFromFileInput; }; @@ -533,6 +557,11 @@ export type MutationDeleteOneRemoteServerArgs = { }; +export type MutationDeleteOneServerlessFunctionArgs = { + input: DeleteServerlessFunctionInput; +}; + + export type MutationEmailPasswordResetLinkArgs = { email: Scalars['String']['input']; }; @@ -546,7 +575,7 @@ export type MutationExchangeAuthorizationCodeArgs = { export type MutationExecuteOneServerlessFunctionArgs = { - name: Scalars['String']['input']; + id: Scalars['UUID']['input']; payload?: InputMaybe; }; @@ -621,6 +650,11 @@ export type MutationUpdateOneRemoteServerArgs = { }; +export type MutationUpdateOneServerlessFunctionArgs = { + input: UpdateServerlessFunctionInput; +}; + + export type MutationUpdatePasswordViaResetTokenArgs = { newPassword: Scalars['String']['input']; passwordResetToken: Scalars['String']['input']; @@ -966,6 +1000,19 @@ export type Sentry = { release?: Maybe; }; +export type ServerlessFunction = { + __typename?: 'ServerlessFunction'; + createdAt: Scalars['DateTime']['output']; + description: Scalars['String']['output']; + id: Scalars['UUID']['output']; + name: Scalars['String']['output']; + runtime: Scalars['String']['output']; + sourceCodeFullPath: Scalars['String']['output']; + sourceCodeHash: Scalars['String']['output']; + syncStatus: ServerlessFunctionSyncStatus; + updatedAt: Scalars['DateTime']['output']; +}; + export type ServerlessFunctionConnection = { __typename?: 'ServerlessFunctionConnection'; /** Array of edges. */ @@ -974,12 +1021,36 @@ export type ServerlessFunctionConnection = { pageInfo: PageInfo; }; +export type ServerlessFunctionEdge = { + __typename?: 'ServerlessFunctionEdge'; + /** Cursor for this node. */ + cursor: Scalars['ConnectionCursor']['output']; + /** The node containing the ServerlessFunction */ + node: ServerlessFunction; +}; + export type ServerlessFunctionExecutionResult = { __typename?: 'ServerlessFunctionExecutionResult'; /** Execution result in JSON format */ result: Scalars['JSON']['output']; }; +export type ServerlessFunctionFilter = { + and?: InputMaybe>; + id?: InputMaybe; + or?: InputMaybe>; +}; + +export type ServerlessFunctionSort = { + direction: SortDirection; + field: ServerlessFunctionSortFields; + nulls?: InputMaybe; +}; + +export enum ServerlessFunctionSortFields { + Id = 'id' +} + /** SyncStatus of the serverlessFunction */ export enum ServerlessFunctionSyncStatus { NotReady = 'NOT_READY', @@ -1171,6 +1242,14 @@ export type UpdateRemoteServerInput = { userMappingOptions?: InputMaybe; }; +export type UpdateServerlessFunctionInput = { + code: Scalars['String']['input']; + description?: InputMaybe; + /** Id of the serverless function to execute */ + id: Scalars['UUID']['input']; + name: Scalars['String']['input']; +}; + export type UpdateWorkspaceInput = { allowImpersonation?: InputMaybe; displayName?: InputMaybe; @@ -1413,40 +1492,6 @@ export type RelationEdge = { node: Relation; }; -export type ServerlessFunction = { - __typename?: 'serverlessFunction'; - createdAt: Scalars['DateTime']['output']; - id: Scalars['UUID']['output']; - name: Scalars['String']['output']; - sourceCodeHash: Scalars['String']['output']; - syncStatus: ServerlessFunctionSyncStatus; - updatedAt: Scalars['DateTime']['output']; -}; - -export type ServerlessFunctionEdge = { - __typename?: 'serverlessFunctionEdge'; - /** Cursor for this node. */ - cursor: Scalars['ConnectionCursor']['output']; - /** The node containing the serverlessFunction */ - node: ServerlessFunction; -}; - -export type ServerlessFunctionFilter = { - and?: InputMaybe>; - id?: InputMaybe; - or?: InputMaybe>; -}; - -export type ServerlessFunctionSort = { - direction: SortDirection; - field: ServerlessFunctionSortFields; - nulls?: InputMaybe; -}; - -export enum ServerlessFunctionSortFields { - Id = 'id' -} - export type RemoteServerFieldsFragment = { __typename?: 'RemoteServer', id: string, createdAt: any, foreignDataWrapperId: string, foreignDataWrapperOptions?: any | null, foreignDataWrapperType: string, updatedAt: any, schema?: string | null, label: string, userMappingOptions?: { __typename?: 'UserMappingOptionsUser', user?: string | null } | null }; export type RemoteTableFieldsFragment = { __typename?: 'RemoteTable', id?: any | null, name: string, schema?: string | null, status: RemoteTableStatus, schemaPendingUpdates?: Array | null }; @@ -1580,8 +1625,52 @@ export type ObjectMetadataItemsQueryVariables = Exact<{ export type ObjectMetadataItemsQuery = { __typename?: 'Query', objects: { __typename?: 'ObjectConnection', edges: Array<{ __typename?: 'objectEdge', node: { __typename?: 'object', id: any, dataSourceId: string, nameSingular: string, namePlural: string, labelSingular: string, labelPlural: string, description?: string | null, icon?: string | null, isCustom: boolean, isRemote: boolean, isActive: boolean, isSystem: boolean, createdAt: any, updatedAt: any, labelIdentifierFieldMetadataId?: string | null, imageIdentifierFieldMetadataId?: string | null, fields: { __typename?: 'ObjectFieldsConnection', edges: Array<{ __typename?: 'fieldEdge', node: { __typename?: 'field', id: any, type: FieldMetadataType, name: string, label: string, description?: string | null, icon?: string | null, isCustom?: boolean | null, isActive?: boolean | null, isSystem?: boolean | null, isNullable?: boolean | null, createdAt: any, updatedAt: any, defaultValue?: any | null, options?: any | null, fromRelationMetadata?: { __typename?: 'relation', id: any, relationType: RelationMetadataType, toFieldMetadataId: string, toObjectMetadata: { __typename?: 'object', id: any, dataSourceId: string, nameSingular: string, namePlural: string, isSystem: boolean, isRemote: boolean } } | null, toRelationMetadata?: { __typename?: 'relation', id: any, relationType: RelationMetadataType, fromFieldMetadataId: string, fromObjectMetadata: { __typename?: 'object', id: any, dataSourceId: string, nameSingular: string, namePlural: string, isSystem: boolean, isRemote: boolean } } | null, relationDefinition?: { __typename?: 'RelationDefinition', relationId: any, direction: RelationDefinitionType, sourceObjectMetadata: { __typename?: 'object', id: any, nameSingular: string, namePlural: string }, sourceFieldMetadata: { __typename?: 'field', id: any, name: string }, targetObjectMetadata: { __typename?: 'object', id: any, nameSingular: string, namePlural: string }, targetFieldMetadata: { __typename?: 'field', id: any, name: string } } | null } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } } }>, pageInfo: { __typename?: 'PageInfo', hasNextPage?: boolean | null, hasPreviousPage?: boolean | null, startCursor?: any | null, endCursor?: any | null } } }; +export type ServerlessFunctionFieldsFragment = { __typename?: 'ServerlessFunction', id: any, name: string, description: string, sourceCodeHash: string, sourceCodeFullPath: string, runtime: string, syncStatus: ServerlessFunctionSyncStatus, createdAt: any, updatedAt: any }; + +export type CreateOneServerlessFunctionItemMutationVariables = Exact<{ + input: CreateServerlessFunctionInput; +}>; + + +export type CreateOneServerlessFunctionItemMutation = { __typename?: 'Mutation', createOneServerlessFunction: { __typename?: 'ServerlessFunction', id: any, name: string, description: string, sourceCodeHash: string, sourceCodeFullPath: string, runtime: string, syncStatus: ServerlessFunctionSyncStatus, createdAt: any, updatedAt: any } }; + +export type DeleteOneServerlessFunctionMutationVariables = Exact<{ + input: DeleteServerlessFunctionInput; +}>; + + +export type DeleteOneServerlessFunctionMutation = { __typename?: 'Mutation', deleteOneServerlessFunction: { __typename?: 'ServerlessFunction', id: any, name: string, description: string, sourceCodeHash: string, sourceCodeFullPath: string, runtime: string, syncStatus: ServerlessFunctionSyncStatus, createdAt: any, updatedAt: any } }; + +export type ExecuteOneServerlessFunctionMutationVariables = Exact<{ + id: Scalars['UUID']['input']; + payload: Scalars['JSON']['input']; +}>; + + +export type ExecuteOneServerlessFunctionMutation = { __typename?: 'Mutation', executeOneServerlessFunction: { __typename?: 'ServerlessFunctionExecutionResult', result: any } }; + +export type UpdateOneServerlessFunctionMutationVariables = Exact<{ + input: UpdateServerlessFunctionInput; +}>; + + +export type UpdateOneServerlessFunctionMutation = { __typename?: 'Mutation', updateOneServerlessFunction: { __typename?: 'ServerlessFunction', id: any, name: string, description: string, sourceCodeHash: string, sourceCodeFullPath: string, runtime: string, syncStatus: ServerlessFunctionSyncStatus, createdAt: any, updatedAt: any } }; + +export type GetManyServerlessFunctionsQueryVariables = Exact<{ [key: string]: never; }>; + + +export type GetManyServerlessFunctionsQuery = { __typename?: 'Query', serverlessFunctions: { __typename?: 'ServerlessFunctionConnection', edges: Array<{ __typename?: 'ServerlessFunctionEdge', node: { __typename?: 'ServerlessFunction', id: any, name: string, description: string, sourceCodeHash: string, sourceCodeFullPath: string, runtime: string, syncStatus: ServerlessFunctionSyncStatus, createdAt: any, updatedAt: any } }> } }; + +export type GetOneServerlessFunctionQueryVariables = Exact<{ + id: Scalars['UUID']['input']; +}>; + + +export type GetOneServerlessFunctionQuery = { __typename?: 'Query', serverlessFunction: { __typename?: 'ServerlessFunction', id: any, name: string, description: string, sourceCodeHash: string, sourceCodeFullPath: string, runtime: string, syncStatus: ServerlessFunctionSyncStatus, createdAt: any, updatedAt: any } }; + export const RemoteServerFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteServerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperId"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperOptions"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperType"}},{"kind":"Field","name":{"kind":"Name","value":"userMappingOptions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"}}]}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}}]} as unknown as DocumentNode; export const RemoteTableFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteTableFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTable"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"schemaPendingUpdates"}}]}}]} as unknown as DocumentNode; +export const ServerlessFunctionFieldsFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ServerlessFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ServerlessFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeHash"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeFullPath"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"syncStatus"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; export const CreateServerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"createServer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateRemoteServerInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createOneRemoteServer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteServerFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteServerFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperId"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperOptions"}},{"kind":"Field","name":{"kind":"Name","value":"foreignDataWrapperType"}},{"kind":"Field","name":{"kind":"Name","value":"userMappingOptions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"user"}}]}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}},{"kind":"Field","name":{"kind":"Name","value":"label"}}]}}]} as unknown as DocumentNode; export const DeleteServerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"deleteServer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteServerIdInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneRemoteServer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; export const SyncRemoteTableDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"syncRemoteTable"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTableInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"syncRemoteTable"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"RemoteTableFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"RemoteTableFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"RemoteTable"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"schema"}},{"kind":"Field","name":{"kind":"Name","value":"status"}},{"kind":"Field","name":{"kind":"Name","value":"schemaPendingUpdates"}}]}}]} as unknown as DocumentNode; @@ -1599,4 +1688,10 @@ export const UpdateOneObjectMetadataItemDocument = {"kind":"Document","definitio export const DeleteOneObjectMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneObjectMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneObject"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}}]}}]}}]} as unknown as DocumentNode; export const DeleteOneFieldMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneFieldMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneField"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]}}]} as unknown as DocumentNode; export const DeleteOneRelationMetadataItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneRelationMetadataItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneRelation"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"idToDelete"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}}]}}]}}]} as unknown as DocumentNode; -export const ObjectMetadataItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ObjectMetadataItems"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"objectFilter"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"fromRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"toObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"fromObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fromFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"relationDefinition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"relationId"}},{"kind":"Field","name":{"kind":"Name","value":"direction"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file +export const ObjectMetadataItemsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"ObjectMetadataItems"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"objectFilter"}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}},"type":{"kind":"NamedType","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"objects"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"objectFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"labelSingular"}},{"kind":"Field","name":{"kind":"Name","value":"labelPlural"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"labelIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"imageIdentifierFieldMetadataId"}},{"kind":"Field","name":{"kind":"Name","value":"fields"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"1000"}}]}},{"kind":"Argument","name":{"kind":"Name","value":"filter"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fieldFilter"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"type"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"label"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"icon"}},{"kind":"Field","name":{"kind":"Name","value":"isCustom"}},{"kind":"Field","name":{"kind":"Name","value":"isActive"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isNullable"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"fromRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"toObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"toRelationMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"relationType"}},{"kind":"Field","name":{"kind":"Name","value":"fromObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"dataSourceId"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}},{"kind":"Field","name":{"kind":"Name","value":"isSystem"}},{"kind":"Field","name":{"kind":"Name","value":"isRemote"}}]}},{"kind":"Field","name":{"kind":"Name","value":"fromFieldMetadataId"}}]}},{"kind":"Field","name":{"kind":"Name","value":"defaultValue"}},{"kind":"Field","name":{"kind":"Name","value":"options"}},{"kind":"Field","name":{"kind":"Name","value":"relationDefinition"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"relationId"}},{"kind":"Field","name":{"kind":"Name","value":"direction"}},{"kind":"Field","name":{"kind":"Name","value":"sourceObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"sourceFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetObjectMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"nameSingular"}},{"kind":"Field","name":{"kind":"Name","value":"namePlural"}}]}},{"kind":"Field","name":{"kind":"Name","value":"targetFieldMetadata"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]}},{"kind":"Field","name":{"kind":"Name","value":"pageInfo"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"hasNextPage"}},{"kind":"Field","name":{"kind":"Name","value":"hasPreviousPage"}},{"kind":"Field","name":{"kind":"Name","value":"startCursor"}},{"kind":"Field","name":{"kind":"Name","value":"endCursor"}}]}}]}}]}}]} as unknown as DocumentNode; +export const CreateOneServerlessFunctionItemDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateOneServerlessFunctionItem"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CreateServerlessFunctionInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createOneServerlessFunction"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ServerlessFunctionFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ServerlessFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ServerlessFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeHash"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeFullPath"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"syncStatus"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; +export const DeleteOneServerlessFunctionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"DeleteOneServerlessFunction"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"DeleteServerlessFunctionInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"deleteOneServerlessFunction"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ServerlessFunctionFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ServerlessFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ServerlessFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeHash"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeFullPath"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"syncStatus"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; +export const ExecuteOneServerlessFunctionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"ExecuteOneServerlessFunction"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"payload"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"JSON"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"executeOneServerlessFunction"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}},{"kind":"Argument","name":{"kind":"Name","value":"payload"},"value":{"kind":"Variable","name":{"kind":"Name","value":"payload"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"result"}}]}}]}}]} as unknown as DocumentNode; +export const UpdateOneServerlessFunctionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateOneServerlessFunction"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"input"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UpdateServerlessFunctionInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateOneServerlessFunction"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"Variable","name":{"kind":"Name","value":"input"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ServerlessFunctionFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ServerlessFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ServerlessFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeHash"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeFullPath"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"syncStatus"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; +export const GetManyServerlessFunctionsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetManyServerlessFunctions"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"serverlessFunctions"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"paging"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"first"},"value":{"kind":"IntValue","value":"100"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"edges"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"node"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ServerlessFunctionFields"}}]}}]}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ServerlessFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ServerlessFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeHash"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeFullPath"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"syncStatus"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; +export const GetOneServerlessFunctionDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetOneServerlessFunction"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"UUID"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"serverlessFunction"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"ServerlessFunctionFields"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"ServerlessFunctionFields"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"ServerlessFunction"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"id"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"description"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeHash"}},{"kind":"Field","name":{"kind":"Name","value":"sourceCodeFullPath"}},{"kind":"Field","name":{"kind":"Name","value":"runtime"}},{"kind":"Field","name":{"kind":"Name","value":"syncStatus"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}}]}}]} as unknown as DocumentNode; diff --git a/packages/twenty-front/src/generated/graphql.tsx b/packages/twenty-front/src/generated/graphql.tsx index 4bf49074e..20e35079e 100644 --- a/packages/twenty-front/src/generated/graphql.tsx +++ b/packages/twenty-front/src/generated/graphql.tsx @@ -692,6 +692,19 @@ export type Sentry = { release?: Maybe; }; +export type ServerlessFunction = { + __typename?: 'ServerlessFunction'; + createdAt: Scalars['DateTime']; + description: Scalars['String']; + id: Scalars['UUID']; + name: Scalars['String']; + runtime: Scalars['String']; + sourceCodeFullPath: Scalars['String']; + sourceCodeHash: Scalars['String']; + syncStatus: ServerlessFunctionSyncStatus; + updatedAt: Scalars['DateTime']; +}; + export type ServerlessFunctionConnection = { __typename?: 'ServerlessFunctionConnection'; /** Array of edges. */ @@ -700,6 +713,14 @@ export type ServerlessFunctionConnection = { pageInfo: PageInfo; }; +export type ServerlessFunctionEdge = { + __typename?: 'ServerlessFunctionEdge'; + /** Cursor for this node. */ + cursor: Scalars['ConnectionCursor']; + /** The node containing the ServerlessFunction */ + node: ServerlessFunction; +}; + export type ServerlessFunctionExecutionResult = { __typename?: 'ServerlessFunctionExecutionResult'; /** Execution result in JSON format */ @@ -1090,24 +1111,6 @@ export type RelationEdge = { node: Relation; }; -export type ServerlessFunction = { - __typename?: 'serverlessFunction'; - createdAt: Scalars['DateTime']; - id: Scalars['UUID']; - name: Scalars['String']; - sourceCodeHash: Scalars['String']; - syncStatus: ServerlessFunctionSyncStatus; - updatedAt: Scalars['DateTime']; -}; - -export type ServerlessFunctionEdge = { - __typename?: 'serverlessFunctionEdge'; - /** Cursor for this node. */ - cursor: Scalars['ConnectionCursor']; - /** The node containing the serverlessFunction */ - node: ServerlessFunction; -}; - export type TimelineCalendarEventFragmentFragment = { __typename?: 'TimelineCalendarEvent', id: any, title: string, description: string, location: string, startsAt: string, endsAt: string, isFullDay: boolean, visibility: CalendarChannelVisibility, participants: Array<{ __typename?: 'TimelineCalendarEventParticipant', personId?: any | null, workspaceMemberId?: any | null, firstName: string, lastName: string, displayName: string, avatarUrl: string, handle: string }> }; export type TimelineCalendarEventParticipantFragmentFragment = { __typename?: 'TimelineCalendarEventParticipant', personId?: any | null, workspaceMemberId?: any | null, firstName: string, lastName: string, displayName: string, avatarUrl: string, handle: string }; diff --git a/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx b/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx index 57f020ced..f28727eb5 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx @@ -23,13 +23,13 @@ import { RightDrawerHotkeyScope } from '@/ui/layout/right-drawer/types/RightDraw import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { isNonTextWritingKey } from '@/ui/utilities/hotkey/utils/isNonTextWritingKey'; -import { REACT_APP_SERVER_BASE_URL } from '~/config'; import { FileFolder, useUploadFileMutation } from '~/generated/graphql'; import { isDefined } from '~/utils/isDefined'; import { isUndefinedOrNull } from '~/utils/isUndefinedOrNull'; import { getFileType } from '../files/utils/getFileType'; +import { getFileAbsoluteURI } from '~/utils/file/getFileAbsoluteURI'; import '@blocknote/core/fonts/inter.css'; import '@blocknote/mantine/style.css'; @@ -127,9 +127,7 @@ export const ActivityBodyEditor = ({ if (!result?.data?.uploadFile) { throw new Error("Couldn't upload Image"); } - const imageUrl = - REACT_APP_SERVER_BASE_URL + '/files/' + result?.data?.uploadFile; - return imageUrl; + return getFileAbsoluteURI(result.data.uploadFile); }; const handlePersistBody = useCallback( diff --git a/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx b/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx index 68cd89335..691ebb746 100644 --- a/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx +++ b/packages/twenty-front/src/modules/activities/files/components/AttachmentRow.tsx @@ -13,8 +13,8 @@ import { FieldContext, GenericFieldContextType, } from '@/object-record/record-field/contexts/FieldContext'; -import { REACT_APP_SERVER_BASE_URL } from '~/config'; import { formatToHumanReadableDate } from '~/utils/date-utils'; +import { getFileAbsoluteURI } from '~/utils/file/getFileAbsoluteURI'; const StyledRow = styled.div` align-items: center; @@ -76,7 +76,7 @@ export const AttachmentRow = ({ attachment }: { attachment: Attachment }) => { {attachment.name} diff --git a/packages/twenty-front/src/modules/activities/files/utils/downloadFile.ts b/packages/twenty-front/src/modules/activities/files/utils/downloadFile.ts index dc354264e..5dd7e6c00 100644 --- a/packages/twenty-front/src/modules/activities/files/utils/downloadFile.ts +++ b/packages/twenty-front/src/modules/activities/files/utils/downloadFile.ts @@ -1,7 +1,7 @@ -import { REACT_APP_SERVER_BASE_URL } from '~/config'; +import { getFileAbsoluteURI } from '~/utils/file/getFileAbsoluteURI'; export const downloadFile = (fullPath: string, fileName: string) => { - fetch(REACT_APP_SERVER_BASE_URL + '/files/' + fullPath) + fetch(getFileAbsoluteURI(fullPath)) .then((resp) => resp.status === 200 ? resp.blob() diff --git a/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx b/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx index 426eabe21..c87f636a6 100644 --- a/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx +++ b/packages/twenty-front/src/modules/settings/components/SettingsNavigationDrawerItems.tsx @@ -13,6 +13,7 @@ import { IconSettings, IconUserCircle, IconUsers, + IconFunction, } from 'twenty-ui'; import { useAuth } from '@/auth/hooks/useAuth'; @@ -29,6 +30,9 @@ export const SettingsNavigationDrawerItems = () => { const { signOut } = useAuth(); const billing = useRecoilValue(billingState); + const isFunctionSettingsEnabled = useIsFeatureEnabled( + 'IS_FUNCTION_SETTINGS_ENABLED', + ); const isCRMMigrationEnabled = useIsFeatureEnabled('IS_CRM_MIGRATION_ENABLED'); return ( @@ -99,6 +103,13 @@ export const SettingsNavigationDrawerItems = () => { path={SettingsPath.Developers} Icon={IconCode} /> + {isFunctionSettingsEnabled && ( + + )} theme.spacing(4)}; +`; + +export const SettingsServerlessFunctionNewForm = ({ + formValues, + onChange, +}: { + formValues: ServerlessFunctionNewFormValues; + onChange: (key: string) => (value: string) => void; +}) => { + return ( +

+ + + +