Add custom routes to migration v2 (#14846)

## Context
Add routes to migration V2
- Resolvers
- Service v2
- Builder
- Validator
- Action runner

Next PR: Add to twenty-cli to sync routes with serverless
This commit is contained in:
Weiko
2025-10-03 00:20:21 +02:00
committed by GitHub
parent dcfae3821c
commit 0b60aa4249
80 changed files with 2242 additions and 151 deletions
@@ -836,6 +836,13 @@ export type CreateRoleInput = {
label: Scalars['String'];
};
export type CreateRouteTriggerInput = {
httpMethod?: HttpMethod;
isAuthRequired?: Scalars['Boolean'];
path: Scalars['String'];
serverlessFunctionId: Scalars['String'];
};
export type CreateServerlessFunctionInput = {
code?: InputMaybe<Scalars['JSON']>;
description?: InputMaybe<Scalars['String']>;
@@ -1406,6 +1413,14 @@ export type GridPositionInput = {
rowSpan: Scalars['Float'];
};
export enum HttpMethod {
DELETE = 'DELETE',
GET = 'GET',
PATCH = 'PATCH',
POST = 'POST',
PUT = 'PUT'
}
export enum HealthIndicatorId {
app = 'app',
connectedAccount = 'connectedAccount',
@@ -1644,6 +1659,7 @@ export type Mutation = {
createOneObject: Object;
createOneRemoteServer: RemoteServer;
createOneRole: Role;
createOneRouteTrigger: RouteTrigger;
createOneServerlessFunction: ServerlessFunction;
createOneServerlessFunctionLayer: ServerlessFunctionLayer;
createPageLayout: PageLayout;
@@ -1673,6 +1689,7 @@ export type Mutation = {
deleteOneObject: Object;
deleteOneRemoteServer: RemoteServer;
deleteOneRole: Scalars['String'];
deleteOneRouteTrigger: RouteTrigger;
deleteOneServerlessFunction: ServerlessFunction;
deletePageLayout: PageLayout;
deletePageLayoutTab: Scalars['Boolean'];
@@ -1756,6 +1773,7 @@ export type Mutation = {
updateOneObject: Object;
updateOneRemoteServer: RemoteServer;
updateOneRole: Role;
updateOneRouteTrigger: RouteTrigger;
updateOneServerlessFunction: ServerlessFunction;
updatePageLayout: PageLayout;
updatePageLayoutTab: PageLayoutTab;
@@ -1955,6 +1973,11 @@ export type MutationCreateOneRoleArgs = {
};
export type MutationCreateOneRouteTriggerArgs = {
input: CreateRouteTriggerInput;
};
export type MutationCreateOneServerlessFunctionArgs = {
input: CreateServerlessFunctionInput;
};
@@ -2096,6 +2119,11 @@ export type MutationDeleteOneRoleArgs = {
};
export type MutationDeleteOneRouteTriggerArgs = {
input: RouteTriggerIdInput;
};
export type MutationDeleteOneServerlessFunctionArgs = {
input: ServerlessFunctionIdInput;
};
@@ -2504,6 +2532,11 @@ export type MutationUpdateOneRoleArgs = {
};
export type MutationUpdateOneRouteTriggerArgs = {
input: UpdateRouteTriggerInput;
};
export type MutationUpdateOneServerlessFunctionArgs = {
input: UpdateServerlessFunctionInput;
};
@@ -2969,11 +3002,13 @@ export type Query = {
findManyDatabaseEventTriggers: Array<DatabaseEventTrigger>;
findManyPublicDomains: Array<PublicDomain>;
findManyRemoteServersByType: Array<RemoteServer>;
findManyRouteTriggers: Array<RouteTrigger>;
findManyServerlessFunctions: Array<ServerlessFunction>;
findOneAgent: Agent;
findOneCronTrigger: CronTrigger;
findOneDatabaseEventTrigger: DatabaseEventTrigger;
findOneRemoteServerById: RemoteServer;
findOneRouteTrigger: RouteTrigger;
findOneServerlessFunction: ServerlessFunction;
findWorkspaceFromInviteHash: Workspace;
findWorkspaceInvitations: Array<WorkspaceInvitation>;
@@ -3118,6 +3153,11 @@ export type QueryFindOneRemoteServerByIdArgs = {
};
export type QueryFindOneRouteTriggerArgs = {
input: RouteTriggerIdInput;
};
export type QueryFindOneServerlessFunctionArgs = {
input: ServerlessFunctionIdInput;
};
@@ -3476,6 +3516,22 @@ export type Role = {
workspaceMembers: Array<WorkspaceMember>;
};
export type RouteTrigger = {
__typename?: 'RouteTrigger';
createdAt: Scalars['DateTime'];
httpMethod: HttpMethod;
id: Scalars['ID'];
isAuthRequired: Scalars['Boolean'];
path: Scalars['String'];
serverlessFunctionId: Scalars['String'];
updatedAt: Scalars['DateTime'];
workspaceId: Scalars['String'];
};
export type RouteTriggerIdInput = {
id: Scalars['String'];
};
export type RunWorkflowVersionInput = {
/** Execution result in JSON format */
payload?: InputMaybe<Scalars['JSON']>;
@@ -3828,12 +3884,24 @@ export type UpdateApiKeyDto = {
};
export type UpdateCronTriggerInput = {
/** The id of the cron trigger to update */
id: Scalars['String'];
/** The cron trigger updates */
update: UpdateCronTriggerInputUpdates;
};
export type UpdateCronTriggerInputUpdates = {
settings: Scalars['JSON'];
};
export type UpdateDatabaseEventTriggerInput = {
/** The id of the database event trigger to update */
id: Scalars['String'];
/** The database event trigger updates */
update: UpdateDatabaseEventTriggerInputUpdates;
};
export type UpdateDatabaseEventTriggerInputUpdates = {
settings: Scalars['JSON'];
};
@@ -3957,11 +4025,29 @@ export type UpdateRolePayload = {
label?: InputMaybe<Scalars['String']>;
};
export type UpdateRouteTriggerInput = {
/** The id of the route to update */
id: Scalars['String'];
/** The route updates */
update: UpdateRouteTriggerInputUpdates;
};
export type UpdateRouteTriggerInputUpdates = {
httpMethod: HttpMethod;
isAuthRequired: Scalars['Boolean'];
path: Scalars['String'];
};
export type UpdateServerlessFunctionInput = {
/** Id of the serverless function to update */
id: Scalars['UUID'];
/** The serverless function updates */
update: UpdateServerlessFunctionInputUpdates;
};
export type UpdateServerlessFunctionInputUpdates = {
code: Scalars['JSON'];
description?: InputMaybe<Scalars['String']>;
/** Id of the serverless function to execute */
id: Scalars['UUID'];
name: Scalars['String'];
timeoutSeconds?: InputMaybe<Scalars['Float']>;
};
+39 -2
View File
@@ -1363,6 +1363,14 @@ export type GridPositionInput = {
rowSpan: Scalars['Float'];
};
export enum HttpMethod {
DELETE = 'DELETE',
GET = 'GET',
PATCH = 'PATCH',
POST = 'POST',
PUT = 'PUT'
}
export enum HealthIndicatorId {
app = 'app',
connectedAccount = 'connectedAccount',
@@ -3322,6 +3330,18 @@ export type Role = {
workspaceMembers: Array<WorkspaceMember>;
};
export type RouteTrigger = {
__typename?: 'RouteTrigger';
createdAt: Scalars['DateTime'];
httpMethod: HttpMethod;
id: Scalars['ID'];
isAuthRequired: Scalars['Boolean'];
path: Scalars['String'];
serverlessFunctionId: Scalars['String'];
updatedAt: Scalars['DateTime'];
workspaceId: Scalars['String'];
};
export type RunWorkflowVersionInput = {
/** Execution result in JSON format */
payload?: InputMaybe<Scalars['JSON']>;
@@ -3674,12 +3694,24 @@ export type UpdateApiKeyDto = {
};
export type UpdateCronTriggerInput = {
/** The id of the cron trigger to update */
id: Scalars['String'];
/** The cron trigger updates */
update: UpdateCronTriggerInputUpdates;
};
export type UpdateCronTriggerInputUpdates = {
settings: Scalars['JSON'];
};
export type UpdateDatabaseEventTriggerInput = {
/** The id of the database event trigger to update */
id: Scalars['String'];
/** The database event trigger updates */
update: UpdateDatabaseEventTriggerInputUpdates;
};
export type UpdateDatabaseEventTriggerInputUpdates = {
settings: Scalars['JSON'];
};
@@ -3796,10 +3828,15 @@ export type UpdateRolePayload = {
};
export type UpdateServerlessFunctionInput = {
/** Id of the serverless function to update */
id: Scalars['UUID'];
/** The serverless function updates */
update: UpdateServerlessFunctionInputUpdates;
};
export type UpdateServerlessFunctionInputUpdates = {
code: Scalars['JSON'];
description?: InputMaybe<Scalars['String']>;
/** Id of the serverless function to execute */
id: Scalars['UUID'];
name: Scalars['String'];
timeoutSeconds?: InputMaybe<Scalars['Float']>;
};
@@ -1,13 +1,13 @@
import { useApolloCoreClient } from '@/object-metadata/hooks/useApolloCoreClient';
import { UPDATE_ONE_SERVERLESS_FUNCTION } from '@/settings/serverless-functions/graphql/mutations/updateOneServerlessFunction';
import { FIND_ONE_SERVERLESS_FUNCTION_SOURCE_CODE } from '@/settings/serverless-functions/graphql/queries/findOneServerlessFunctionSourceCode';
import { useMutation } from '@apollo/client';
import { getOperationName } from '@apollo/client/utilities';
import {
type UpdateOneServerlessFunctionMutation,
type UpdateOneServerlessFunctionMutationVariables,
type UpdateServerlessFunctionInput,
type UpdateServerlessFunctionInputUpdates,
} from '~/generated-metadata/graphql';
import { getOperationName } from '@apollo/client/utilities';
import { FIND_ONE_SERVERLESS_FUNCTION_SOURCE_CODE } from '@/settings/serverless-functions/graphql/queries/findOneServerlessFunctionSourceCode';
export const useUpdateOneServerlessFunction = (
serverlessFunctionId: string,
@@ -21,11 +21,11 @@ export const useUpdateOneServerlessFunction = (
});
const updateOneServerlessFunction = async (
input: Omit<UpdateServerlessFunctionInput, 'id'>,
update: UpdateServerlessFunctionInputUpdates,
) => {
return await mutate({
variables: {
input: { ...input, id: serverlessFunctionId },
input: { update, id: serverlessFunctionId },
},
refetchQueries: [
getOperationName(FIND_ONE_SERVERLESS_FUNCTION_SOURCE_CODE) ?? '',
@@ -38,6 +38,7 @@ import { WorkflowVariablePicker } from '@/workflow/workflow-variables/components
import styled from '@emotion/styled';
import { useLingui } from '@lingui/react/macro';
import { SOURCE_FOLDER_NAME } from '@/serverless-functions/constants/SourceFolderName';
import { WorkflowActionFooter } from '@/workflow/workflow-steps/components/WorkflowActionFooter';
import { type Monaco } from '@monaco-editor/react';
import { type editor } from 'monaco-editor';
@@ -50,7 +51,6 @@ import { IconCode, IconPlayerPlay, useIcons } from 'twenty-ui/display';
import { CodeEditor } from 'twenty-ui/input';
import { useIsMobile } from 'twenty-ui/utilities';
import { useDebouncedCallback } from 'use-debounce';
import { SOURCE_FOLDER_NAME } from '@/serverless-functions/constants/SourceFolderName';
const CODE_EDITOR_MIN_HEIGHT = 343;