Split record crud actions (#8930)

Having a global record crud action adds complex logic.
We decided to split those actions. I only kept a common folder / module
in backend.

⚠️ this may break existing workflows if these were using previous
actions!
This commit is contained in:
Thomas Trompette
2024-12-06 16:58:57 +01:00
committed by GitHub
parent 229a93e41a
commit e1a0259154
26 changed files with 341 additions and 590 deletions

View File

@ -5,7 +5,7 @@ import { FormFieldInput } from '@/object-record/record-field/components/FormFiel
import { Select, SelectOption } from '@/ui/input/components/Select';
import { WorkflowEditGenericFormBase } from '@/workflow/components/WorkflowEditGenericFormBase';
import { WorkflowVariablePicker } from '@/workflow/components/WorkflowVariablePicker';
import { WorkflowRecordCreateAction } from '@/workflow/types/Workflow';
import { WorkflowCreateRecordAction } from '@/workflow/types/Workflow';
import { useTheme } from '@emotion/react';
import { useEffect, useState } from 'react';
import {
@ -18,15 +18,15 @@ import { JsonValue } from 'type-fest';
import { useDebouncedCallback } from 'use-debounce';
import { FieldMetadataType } from '~/generated/graphql';
type WorkflowEditActionFormRecordCreateProps = {
action: WorkflowRecordCreateAction;
type WorkflowEditActionFormCreateRecordProps = {
action: WorkflowCreateRecordAction;
actionOptions:
| {
readonly: true;
}
| {
readonly?: false;
onActionUpdate: (action: WorkflowRecordCreateAction) => void;
onActionUpdate: (action: WorkflowCreateRecordAction) => void;
};
};
@ -35,10 +35,10 @@ type CreateRecordFormData = {
[field: string]: unknown;
};
export const WorkflowEditActionFormRecordCreate = ({
export const WorkflowEditActionFormCreateRecord = ({
action,
actionOptions,
}: WorkflowEditActionFormRecordCreateProps) => {
}: WorkflowEditActionFormCreateRecordProps) => {
const theme = useTheme();
const { getIcon } = useIcons();
@ -118,7 +118,6 @@ export const WorkflowEditActionFormRecordCreate = ({
settings: {
...action.settings,
input: {
type: 'CREATE',
objectName: updatedObjectName,
objectRecord: updatedOtherFields,
},

View File

@ -2,7 +2,7 @@ import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilte
import { Select, SelectOption } from '@/ui/input/components/Select';
import { WorkflowEditGenericFormBase } from '@/workflow/components/WorkflowEditGenericFormBase';
import { WorkflowSingleRecordPicker } from '@/workflow/components/WorkflowSingleRecordPicker';
import { WorkflowRecordDeleteAction } from '@/workflow/types/Workflow';
import { WorkflowDeleteRecordAction } from '@/workflow/types/Workflow';
import { useTheme } from '@emotion/react';
import { useEffect, useState } from 'react';
import {
@ -15,15 +15,15 @@ import {
import { JsonValue } from 'type-fest';
import { useDebouncedCallback } from 'use-debounce';
type WorkflowEditActionFormRecordDeleteProps = {
action: WorkflowRecordDeleteAction;
type WorkflowEditActionFormDeleteRecordProps = {
action: WorkflowDeleteRecordAction;
actionOptions:
| {
readonly: true;
}
| {
readonly?: false;
onActionUpdate: (action: WorkflowRecordDeleteAction) => void;
onActionUpdate: (action: WorkflowDeleteRecordAction) => void;
};
};
@ -32,10 +32,10 @@ type DeleteRecordFormData = {
objectRecordId: string;
};
export const WorkflowEditActionFormRecordDelete = ({
export const WorkflowEditActionFormDeleteRecord = ({
action,
actionOptions,
}: WorkflowEditActionFormRecordDeleteProps) => {
}: WorkflowEditActionFormDeleteRecordProps) => {
const theme = useTheme();
const { getIcon } = useIcons();
@ -100,7 +100,6 @@ export const WorkflowEditActionFormRecordDelete = ({
settings: {
...action.settings,
input: {
type: 'DELETE',
objectName: updatedObjectName,
objectRecordId: updatedObjectRecordId ?? '',
},

View File

@ -2,7 +2,7 @@ import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilte
import { Select, SelectOption } from '@/ui/input/components/Select';
import { WorkflowEditGenericFormBase } from '@/workflow/components/WorkflowEditGenericFormBase';
import { WorkflowSingleRecordPicker } from '@/workflow/components/WorkflowSingleRecordPicker';
import { WorkflowRecordUpdateAction } from '@/workflow/types/Workflow';
import { WorkflowUpdateRecordAction } from '@/workflow/types/Workflow';
import { useTheme } from '@emotion/react';
import { useEffect, useState } from 'react';
import {
@ -15,15 +15,15 @@ import {
import { JsonValue } from 'type-fest';
import { useDebouncedCallback } from 'use-debounce';
type WorkflowEditActionFormRecordUpdateProps = {
action: WorkflowRecordUpdateAction;
type WorkflowEditActionFormUpdateRecordProps = {
action: WorkflowUpdateRecordAction;
actionOptions:
| {
readonly: true;
}
| {
readonly?: false;
onActionUpdate: (action: WorkflowRecordUpdateAction) => void;
onActionUpdate: (action: WorkflowUpdateRecordAction) => void;
};
};
@ -33,10 +33,10 @@ type UpdateRecordFormData = {
[field: string]: unknown;
};
export const WorkflowEditActionFormRecordUpdate = ({
export const WorkflowEditActionFormUpdateRecord = ({
action,
actionOptions,
}: WorkflowEditActionFormRecordUpdateProps) => {
}: WorkflowEditActionFormUpdateRecordProps) => {
const theme = useTheme();
const { getIcon } = useIcons();
@ -104,7 +104,6 @@ export const WorkflowEditActionFormRecordUpdate = ({
settings: {
...action.settings,
input: {
type: 'UPDATE',
objectName: updatedObjectName,
objectRecordId: updatedObjectRecordId ?? '',
objectRecord: updatedOtherFields,

View File

@ -1,81 +0,0 @@
import {
WorkflowCodeAction,
WorkflowRecordCRUDAction,
} from '@/workflow/types/Workflow';
import { isWorkflowRecordCreateAction } from '../isWorkflowRecordCreateAction';
describe('isWorkflowRecordCreateAction', () => {
it('returns false when providing an action that is not Record Create', () => {
const action: WorkflowCodeAction = {
type: 'CODE',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: {
value: false,
},
retryOnFailure: {
value: false,
},
},
input: {
serverlessFunctionId: '',
serverlessFunctionVersion: '',
serverlessFunctionInput: {},
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordCreateAction(action)).toBe(false);
});
it('returns false for Record Update', () => {
const action: WorkflowRecordCRUDAction = {
type: 'RECORD_CRUD',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: { value: false },
retryOnFailure: { value: false },
},
input: {
type: 'UPDATE',
objectName: '',
objectRecord: {},
objectRecordId: '',
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordCreateAction(action)).toBe(false);
});
it('returns true for Record Create', () => {
const action: WorkflowRecordCRUDAction = {
type: 'RECORD_CRUD',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: { value: false },
retryOnFailure: { value: false },
},
input: {
type: 'CREATE',
objectName: '',
objectRecord: {},
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordCreateAction(action)).toBe(true);
});
});

View File

@ -1,81 +0,0 @@
import {
WorkflowCodeAction,
WorkflowRecordCRUDAction,
} from '@/workflow/types/Workflow';
import { isWorkflowRecordDeleteAction } from '../isWorkflowRecordDeleteAction';
describe('isWorkflowRecordDeleteAction', () => {
it('returns false when providing an action that is not Record Delete', () => {
const action: WorkflowCodeAction = {
type: 'CODE',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: {
value: false,
},
retryOnFailure: {
value: false,
},
},
input: {
serverlessFunctionId: '',
serverlessFunctionVersion: '',
serverlessFunctionInput: {},
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordDeleteAction(action)).toBe(false);
});
it('returns false for Record Update', () => {
const action: WorkflowRecordCRUDAction = {
type: 'RECORD_CRUD',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: { value: false },
retryOnFailure: { value: false },
},
input: {
type: 'UPDATE',
objectName: '',
objectRecord: {},
objectRecordId: '',
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordDeleteAction(action)).toBe(false);
});
it('returns true for Record Delete', () => {
const action: WorkflowRecordCRUDAction = {
type: 'RECORD_CRUD',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: { value: false },
retryOnFailure: { value: false },
},
input: {
type: 'DELETE',
objectName: '',
objectRecordId: '',
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordDeleteAction(action)).toBe(true);
});
});

View File

@ -1,81 +0,0 @@
import {
WorkflowCodeAction,
WorkflowRecordCRUDAction,
} from '@/workflow/types/Workflow';
import { isWorkflowRecordUpdateAction } from '../isWorkflowRecordUpdateAction';
describe('isWorkflowRecordUpdateAction', () => {
it('returns false when providing an action that is not Record Create', () => {
const action: WorkflowCodeAction = {
type: 'CODE',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: {
value: false,
},
retryOnFailure: {
value: false,
},
},
input: {
serverlessFunctionId: '',
serverlessFunctionVersion: '',
serverlessFunctionInput: {},
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordUpdateAction(action)).toBe(false);
});
it('returns true for Record Update', () => {
const action: WorkflowRecordCRUDAction = {
type: 'RECORD_CRUD',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: { value: false },
retryOnFailure: { value: false },
},
input: {
type: 'UPDATE',
objectName: '',
objectRecord: {},
objectRecordId: '',
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordUpdateAction(action)).toBe(true);
});
it('returns false for Record Create', () => {
const action: WorkflowRecordCRUDAction = {
type: 'RECORD_CRUD',
id: '',
name: '',
settings: {
errorHandlingOptions: {
continueOnFailure: { value: false },
retryOnFailure: { value: false },
},
input: {
type: 'CREATE',
objectName: '',
objectRecord: {},
},
outputSchema: {},
},
valid: true,
};
expect(isWorkflowRecordUpdateAction(action)).toBe(false);
});
});

View File

@ -1,12 +0,0 @@
import {
WorkflowAction,
WorkflowRecordCreateAction,
} from '@/workflow/types/Workflow';
export const isWorkflowRecordCreateAction = (
action: WorkflowAction,
): action is WorkflowRecordCreateAction => {
return (
action.type === 'RECORD_CRUD' && action.settings.input.type === 'CREATE'
);
};

View File

@ -1,12 +0,0 @@
import {
WorkflowAction,
WorkflowRecordDeleteAction,
} from '@/workflow/types/Workflow';
export const isWorkflowRecordDeleteAction = (
action: WorkflowAction,
): action is WorkflowRecordDeleteAction => {
return (
action.type === 'RECORD_CRUD' && action.settings.input.type === 'DELETE'
);
};

View File

@ -1,12 +0,0 @@
import {
WorkflowAction,
WorkflowRecordUpdateAction,
} from '@/workflow/types/Workflow';
export const isWorkflowRecordUpdateAction = (
action: WorkflowAction,
): action is WorkflowRecordUpdateAction => {
return (
action.type === 'RECORD_CRUD' && action.settings.input.type === 'UPDATE'
);
};