Refactor builder to embed Object validation create/delete/update (#13934)

# Introduction
Moving validation directly in the builder that has the perfect
granularity to do it.
When importing we won't have to infer and dispatch on the operation
nature ( update delete create ) and validate accordingly

## Objects
Only migrated object validation for the moment even though create object
involves a validate flat field metadata creation call too

## TODO
- improve `otherFlatObjectMetadataMapsToValidate` naming too vague

## Next
- handle fields validation within fields actions build
- Unit test coverage validation issue on builder and validate
- integration test plugging with new feature flag

## Manual tested
- Update
- Delete
- Create TODO
This commit is contained in:
Paul Rastoin
2025-08-18 11:16:16 +02:00
committed by GitHub
parent 18b2a68b69
commit 6629092645
51 changed files with 3800 additions and 617 deletions
@@ -1,25 +1,29 @@
import { ATTACHMENT_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/attachment-flat-object.mock';
import { COMPANY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/company-flat-object.mock';
import { FAVORITE_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/favorite-flat-object.mock';
import { FAVORITE_FOLDER_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/favorite-folder-flat-object.mock';
import { NOTE_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/note-flat-object.mock';
import { NOTETARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/notetarget-flat-object.mock';
import { NOTE_TARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/note-target-flat-object.mock';
import { OPPORTUNITY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/opportunity-flat-object.mock';
import { PERSON_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/person-flat-object.mock';
import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock';
import { ROCKET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/rocket-flat-object.mock';
import { TASK_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/task-flat-object.mock';
import { TASKTARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/tasktarget-flat-object.mock';
import { TIMELINEACTIVITY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/timelineactivity-flat-object.mock';
import { TASK_TARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/task-target-flat-object.mock';
import { TIMELINE_ACTIVITY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/timeline-activity-flat-object.mock';
export const ALL_FLAT_OBJECT_METADATA_MOCKS = [
TIMELINEACTIVITY_FLAT_OBJECT_MOCK,
NOTETARGET_FLAT_OBJECT_MOCK,
TIMELINE_ACTIVITY_FLAT_OBJECT_MOCK,
NOTE_TARGET_FLAT_OBJECT_MOCK,
OPPORTUNITY_FLAT_OBJECT_MOCK,
PERSON_FLAT_OBJECT_MOCK,
TASK_FLAT_OBJECT_MOCK,
TASKTARGET_FLAT_OBJECT_MOCK,
TASK_TARGET_FLAT_OBJECT_MOCK,
PET_FLAT_OBJECT_MOCK,
ROCKET_FLAT_OBJECT_MOCK,
NOTE_FLAT_OBJECT_MOCK,
COMPANY_FLAT_OBJECT_MOCK,
ATTACHMENT_FLAT_OBJECT_MOCK,
FAVORITE_FLAT_OBJECT_MOCK,
FAVORITE_FOLDER_FLAT_OBJECT_MOCK,
] as const;
@@ -1,25 +0,0 @@
import { ATTACHMENT_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/attachment-flat-object.mock';
import { COMPANY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/company-flat-object.mock';
import { NOTE_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/note-flat-object.mock';
import { NOTETARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/notetarget-flat-object.mock';
import { OPPORTUNITY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/opportunity-flat-object.mock';
import { PERSON_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/person-flat-object.mock';
import { PET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/pet-flat-object.mock';
import { ROCKET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/rocket-flat-object.mock';
import { TASK_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/task-flat-object.mock';
import { TASKTARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/tasktarget-flat-object.mock';
import { TIMELINEACTIVITY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/timelineactivity-flat-object.mock';
export const ALL_FLAT_OBJECT_METADATA_MOCKS = [
TIMELINEACTIVITY_FLAT_OBJECT_MOCK,
NOTETARGET_FLAT_OBJECT_MOCK,
OPPORTUNITY_FLAT_OBJECT_MOCK,
PERSON_FLAT_OBJECT_MOCK,
TASK_FLAT_OBJECT_MOCK,
TASKTARGET_FLAT_OBJECT_MOCK,
PET_FLAT_OBJECT_MOCK,
ROCKET_FLAT_OBJECT_MOCK,
NOTE_FLAT_OBJECT_MOCK,
COMPANY_FLAT_OBJECT_MOCK,
ATTACHMENT_FLAT_OBJECT_MOCK,
] as const;
@@ -0,0 +1,29 @@
import { FAVORITE_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-flat-fields.mock';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
export const FAVORITE_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
id: 'f4749ffb-dde8-44ff-8b01-d3fc82df0ba2',
standardId: '20202020-ab56-4e05-92a3-e2414a499860',
nameSingular: 'favorite',
namePlural: 'favorites',
labelSingular: 'Favorite',
labelPlural: 'Favorites',
description: 'A favorite that can be accessed from the left menu',
icon: 'IconHeart',
standardOverrides: null,
targetTableName: 'DEPRECATED',
isCustom: false,
isRemote: false,
isActive: true,
isSystem: true,
isAuditLogged: true,
isSearchable: false,
shortcut: null,
labelIdentifierFieldMetadataId: '49f58497-4e7c-49e6-b3bc-c91d4b8a8ddc',
imageIdentifierFieldMetadataId: null,
isLabelSyncedWithName: false,
workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419',
uniqueIdentifier: '20202020-ab56-4e05-92a3-e2414a499860',
flatIndexMetadatas: [],
flatFieldMetadatas: Object.values(FAVORITE_FLAT_FIELDS_MOCK),
});
@@ -0,0 +1,29 @@
import { FAVORITE_FOLDER_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/favorite-folder-flat-fields.mock';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
export const FAVORITE_FOLDER_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
id: '35763b74-1abe-4c4b-9eab-27693f0ee06d',
standardId: '20202020-7cf8-401f-8211-a9587d27fd2d',
nameSingular: 'favoriteFolder',
namePlural: 'favoriteFolders',
labelSingular: 'Favorite Folder',
labelPlural: 'Favorite Folders',
description: 'A Folder of favorites',
icon: 'IconFolder',
standardOverrides: null,
targetTableName: 'DEPRECATED',
isCustom: false,
isRemote: false,
isActive: true,
isSystem: true,
isAuditLogged: true,
isSearchable: false,
shortcut: null,
labelIdentifierFieldMetadataId: '85ab1864-0a92-4682-8583-82e8b696410b',
imageIdentifierFieldMetadataId: null,
isLabelSyncedWithName: false,
workspaceId: '20202020-1c25-4d02-bf25-6aeccf7ea419',
uniqueIdentifier: '20202020-7cf8-401f-8211-a9587d27fd2d',
flatIndexMetadatas: [],
flatFieldMetadatas: Object.values(FAVORITE_FOLDER_FLAT_FIELDS_MOCK),
});
@@ -9,7 +9,7 @@ type FlatObjectMetadataOverrides = Required<
export const getFlatObjectMetadataMock = (
overrides: FlatObjectMetadataOverrides,
): FlatObjectMetadata => {
const createdAt = new Date();
const createdAt = '2024-01-01T00:00:00.000Z' as unknown as Date;
return {
flatFieldMetadatas: [],
@@ -1,7 +1,7 @@
import { NOTETARGET_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/notetarget-flat-fields.mock';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
export const NOTETARGET_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
export const NOTE_TARGET_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
id: '12e3cb51-c3de-4192-b0d5-965d48d001c0',
standardId: '20202020-fff0-4b44-be82-bda313884400',
nameSingular: 'noteTarget',
@@ -0,0 +1,17 @@
import { ATTACHMENT_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/attachment-flat-object.mock';
import { FAVORITE_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/favorite-flat-object.mock';
import { FAVORITE_FOLDER_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/favorite-folder-flat-object.mock';
import { NOTE_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/note-flat-object.mock';
import { NOTE_TARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/note-target-flat-object.mock';
import { TASK_TARGET_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/task-target-flat-object.mock';
import { TIMELINE_ACTIVITY_FLAT_OBJECT_MOCK } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/timeline-activity-flat-object.mock';
export const STANDARD_RELATION_TARGET_FLAT_OBJECT_METADATA_MOCKS = [
NOTE_FLAT_OBJECT_MOCK,
TIMELINE_ACTIVITY_FLAT_OBJECT_MOCK,
NOTE_TARGET_FLAT_OBJECT_MOCK,
FAVORITE_FLAT_OBJECT_MOCK,
ATTACHMENT_FLAT_OBJECT_MOCK,
TASK_TARGET_FLAT_OBJECT_MOCK,
FAVORITE_FOLDER_FLAT_OBJECT_MOCK,
] as const;
@@ -1,7 +1,7 @@
import { TASKTARGET_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/tasktarget-flat-fields.mock';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
export const TASKTARGET_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
export const TASK_TARGET_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
id: 'bb2b29b8-7f46-4106-a8ae-3a32df9c9166',
standardId: '20202020-5a9a-44e8-95df-771cd06d0fb1',
nameSingular: 'taskTarget',
@@ -1,7 +1,7 @@
import { TIMELINEACTIVITY_FLAT_FIELDS_MOCK } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/timelineactivity-flat-fields.mock';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
export const TIMELINEACTIVITY_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
export const TIMELINE_ACTIVITY_FLAT_OBJECT_MOCK = getFlatObjectMetadataMock({
id: '3090f830-c4b1-41a1-8e18-815760830bec',
standardId: '20202020-6736-4337-b5c4-8b39fae325a5',
nameSingular: 'timelineActivity',