feat: first working version

This commit is contained in:
Devessier
2024-10-18 18:21:03 +02:00
parent 9c8eeeea9d
commit 98d68a67f1
4 changed files with 52 additions and 13 deletions

View File

@@ -1,6 +1,7 @@
import { useQuery } from '@apollo/client';
import { FIND_MANY_SERVERLESS_FUNCTIONS } from '@/settings/serverless-functions/graphql/queries/findManyServerlessFunctions';
import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient'; import { useApolloMetadataClient } from '@/object-metadata/hooks/useApolloMetadataClient';
import { FIND_MANY_SERVERLESS_FUNCTIONS } from '@/settings/serverless-functions/graphql/queries/findManyServerlessFunctions';
import { useQuery } from '@apollo/client';
import { useMemo } from 'react';
import { import {
GetManyServerlessFunctionsQuery, GetManyServerlessFunctionsQuery,
GetManyServerlessFunctionsQueryVariables, GetManyServerlessFunctionsQueryVariables,
@@ -14,8 +15,10 @@ export const useGetManyServerlessFunctions = () => {
>(FIND_MANY_SERVERLESS_FUNCTIONS, { >(FIND_MANY_SERVERLESS_FUNCTIONS, {
client: apolloMetadataClient ?? undefined, client: apolloMetadataClient ?? undefined,
}); });
return { return useMemo(() => {
serverlessFunctions: return {
data?.serverlessFunctions?.edges.map(({ node }) => node) || [], serverlessFunctions:
}; data?.serverlessFunctions?.edges.map(({ node }) => node) || [],
};
}, [data?.serverlessFunctions?.edges]);
}; };

View File

@@ -1,3 +1,4 @@
import { useGetManyServerlessFunctions } from '@/settings/serverless-functions/hooks/useGetManyServerlessFunctions';
import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue'; import { getSnapshotValue } from '@/ui/utilities/state/utils/getSnapshotValue';
import { workflowDiagramState } from '@/workflow/states/workflowDiagramState'; import { workflowDiagramState } from '@/workflow/states/workflowDiagramState';
import { import {
@@ -19,15 +20,24 @@ export const WorkflowDiagramEffect = ({
}) => { }) => {
const setWorkflowDiagram = useSetRecoilState(workflowDiagramState); const setWorkflowDiagram = useSetRecoilState(workflowDiagramState);
const { serverlessFunctions } = useGetManyServerlessFunctions();
const computeAndMergeNewWorkflowDiagram = useRecoilCallback( const computeAndMergeNewWorkflowDiagram = useRecoilCallback(
({ snapshot, set }) => { ({ snapshot, set }) => {
return (currentVersion: WorkflowVersion) => { return (currentVersion: WorkflowVersion) => {
if (!isDefined(serverlessFunctions)) {
return;
}
const previousWorkflowDiagram = getSnapshotValue( const previousWorkflowDiagram = getSnapshotValue(
snapshot, snapshot,
workflowDiagramState, workflowDiagramState,
); );
const nextWorkflowDiagram = getWorkflowVersionDiagram(currentVersion); const nextWorkflowDiagram = getWorkflowVersionDiagram(
currentVersion,
serverlessFunctions,
);
let mergedWorkflowDiagram = nextWorkflowDiagram; let mergedWorkflowDiagram = nextWorkflowDiagram;
if (isDefined(previousWorkflowDiagram)) { if (isDefined(previousWorkflowDiagram)) {
@@ -44,7 +54,7 @@ export const WorkflowDiagramEffect = ({
set(workflowDiagramState, workflowDiagramWithCreateStepNodes); set(workflowDiagramState, workflowDiagramWithCreateStepNodes);
}; };
}, },
[], [serverlessFunctions],
); );
useEffect(() => { useEffect(() => {

View File

@@ -1,9 +1,11 @@
import { useGetManyServerlessFunctions } from '@/settings/serverless-functions/hooks/useGetManyServerlessFunctions';
import { TRIGGER_STEP_ID } from '@/workflow/constants/TriggerStepId'; import { TRIGGER_STEP_ID } from '@/workflow/constants/TriggerStepId';
import { WorkflowStep, WorkflowTrigger } from '@/workflow/types/Workflow'; import { WorkflowStep, WorkflowTrigger } from '@/workflow/types/Workflow';
import { import {
WorkflowDiagram, WorkflowDiagram,
WorkflowDiagramEdge, WorkflowDiagramEdge,
WorkflowDiagramNode, WorkflowDiagramNode,
WorkflowDiagramNodeData,
} from '@/workflow/types/WorkflowDiagram'; } from '@/workflow/types/WorkflowDiagram';
import { splitWorkflowTriggerEventName } from '@/workflow/utils/splitWorkflowTriggerEventName'; import { splitWorkflowTriggerEventName } from '@/workflow/utils/splitWorkflowTriggerEventName';
import { MarkerType } from '@xyflow/react'; import { MarkerType } from '@xyflow/react';
@@ -14,9 +16,13 @@ import { capitalize } from '~/utils/string/capitalize';
export const generateWorkflowDiagram = ({ export const generateWorkflowDiagram = ({
trigger, trigger,
steps, steps,
serverlessFunctionsData,
}: { }: {
trigger: WorkflowTrigger | undefined; trigger: WorkflowTrigger | undefined;
steps: Array<WorkflowStep>; steps: Array<WorkflowStep>;
serverlessFunctionsData: ReturnType<
typeof useGetManyServerlessFunctions
>['serverlessFunctions'];
}): WorkflowDiagram => { }): WorkflowDiagram => {
const nodes: Array<WorkflowDiagramNode> = []; const nodes: Array<WorkflowDiagramNode> = [];
const edges: Array<WorkflowDiagramEdge> = []; const edges: Array<WorkflowDiagramEdge> = [];
@@ -29,13 +35,28 @@ export const generateWorkflowDiagram = ({
yPos: number, yPos: number,
) => { ) => {
const nodeId = step.id; const nodeId = step.id;
const nodeData: WorkflowDiagramNodeData = {
nodeType: 'action',
actionType: step.type,
label: step.name,
};
if (step.type === 'CODE') {
const serverlessFunctionData = serverlessFunctionsData.find(
({ id }) => id === step.settings.input.serverlessFunctionId,
);
if (!isDefined(serverlessFunctionData)) {
throw new Error(
'Could not find the definition of the serverless function',
);
}
nodeData.label = serverlessFunctionData.name;
}
nodes.push({ nodes.push({
id: nodeId, id: nodeId,
data: { data: nodeData,
nodeType: 'action',
actionType: step.type,
label: step.name,
},
position: { position: {
x: xPos, x: xPos,
y: yPos, y: yPos,

View File

@@ -1,3 +1,4 @@
import { useGetManyServerlessFunctions } from '@/settings/serverless-functions/hooks/useGetManyServerlessFunctions';
import { WorkflowVersion } from '@/workflow/types/Workflow'; import { WorkflowVersion } from '@/workflow/types/Workflow';
import { WorkflowDiagram } from '@/workflow/types/WorkflowDiagram'; import { WorkflowDiagram } from '@/workflow/types/WorkflowDiagram';
import { generateWorkflowDiagram } from '@/workflow/utils/generateWorkflowDiagram'; import { generateWorkflowDiagram } from '@/workflow/utils/generateWorkflowDiagram';
@@ -10,6 +11,9 @@ const EMPTY_DIAGRAM: WorkflowDiagram = {
export const getWorkflowVersionDiagram = ( export const getWorkflowVersionDiagram = (
workflowVersion: WorkflowVersion | undefined, workflowVersion: WorkflowVersion | undefined,
serverlessFunctionsData: ReturnType<
typeof useGetManyServerlessFunctions
>['serverlessFunctions'],
): WorkflowDiagram => { ): WorkflowDiagram => {
if (!isDefined(workflowVersion)) { if (!isDefined(workflowVersion)) {
return EMPTY_DIAGRAM; return EMPTY_DIAGRAM;
@@ -18,5 +22,6 @@ export const getWorkflowVersionDiagram = (
return generateWorkflowDiagram({ return generateWorkflowDiagram({
trigger: workflowVersion.trigger ?? undefined, trigger: workflowVersion.trigger ?? undefined,
steps: workflowVersion.steps ?? [], steps: workflowVersion.steps ?? [],
serverlessFunctionsData,
}); });
}; };