Field metadata and object metadata v1 relicas (#16230)

# Introduction

Related https://github.com/twentyhq/core-team-issues/issues/1911

Nearly done with all functional v1 implemen removal
Will remain dead code methods that I will detect using knip
This commit is contained in:
Paul Rastoin
2025-12-02 12:06:28 +01:00
committed by GitHub
parent 59f0f6f9db
commit eedb163131
45 changed files with 61 additions and 2504 deletions
@@ -1,11 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`validateFieldNameAvailabilityOrThrow throws error with ACTOR suffixes 1`] = `"Name "fieldActorName" is not available"`;
exports[`validateFieldNameAvailabilityOrThrow throws error with ADDRESS suffixes 1`] = `"Name "fieldAddressAddressStreet1" is not available"`;
exports[`validateFieldNameAvailabilityOrThrow throws error with CURRENCY suffixes 1`] = `"Name "fieldCurrencyAmountMicros" is not available"`;
exports[`validateFieldNameAvailabilityOrThrow throws error with FULL_NAME suffixes 1`] = `"Name "fieldFullNameFirstName" is not available"`;
exports[`validateFieldNameAvailabilityOrThrow throws error with LINKS suffixes 1`] = `"Name "fieldLinksPrimaryLinkLabel" is not available"`;
@@ -1,17 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`validateMetadataNameOrThrow throw error when string is not in camel case 1`] = `"TestName should be in camelCase"`;
exports[`validateMetadataNameOrThrow throws error when starts with digits 1`] = `"123string should be in camelCase"`;
exports[`validateMetadataNameOrThrow throws error when string has non latin characters 1`] = `"String "בְרִבְרִ" is not valid: must start with lowercase letter and contain only alphanumeric letters"`;
exports[`validateMetadataNameOrThrow throws error when string has spaces 1`] = `"name with spaces should be in camelCase"`;
exports[`validateMetadataNameOrThrow throws error when string is a reserved word 1`] = `"The name "role" is not available"`;
exports[`validateMetadataNameOrThrow throws error when string is above 63 characters 1`] = `"Name is too long: it exceeds the 63 characters limit."`;
exports[`validateMetadataNameOrThrow throws error when string is empty 1`] = `"Input is too short: """`;
exports[`validateMetadataNameOrThrow throws error when string starts with capital letter 1`] = `"StringStartingWithCapitalLetter should be in camelCase"`;
@@ -1,6 +1,6 @@
import { type EachTestingContext } from 'twenty-shared/testing';
import { computeMetadataNameFromLabel } from 'src/engine/metadata-modules/utils/validate-name-and-label-are-sync-or-throw.util';
import { computeMetadataNameFromLabelOrThrow } from 'src/engine/metadata-modules/utils/compute-metadata-name-from-label-or-throw.util';
import {
InvalidMetadataException,
InvalidMetadataExceptionCode,
@@ -124,7 +124,7 @@ describe('computeMetadataNameFromLabel', () => {
describe('successful cases', () => {
it.each(successfulTestCases)('$title', ({ context }) => {
const result = computeMetadataNameFromLabel(context.input);
const result = computeMetadataNameFromLabelOrThrow(context.input);
expect(result).toBe(context.expected);
});
@@ -132,7 +132,7 @@ describe('computeMetadataNameFromLabel', () => {
describe('failing cases', () => {
it.each(failingTestCases)('$title', ({ context }) => {
expect(() => computeMetadataNameFromLabel(context.input)).toThrow(
expect(() => computeMetadataNameFromLabelOrThrow(context.input)).toThrow(
context.expectToThrow?.error,
);
});
@@ -1,180 +0,0 @@
import { FieldMetadataType } from 'twenty-shared/types';
import { type EachTestingContext } from 'twenty-shared/testing';
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
import { validateFieldNameAvailabilityOrThrow } from 'src/engine/metadata-modules/utils/validate-field-name-availability.utils';
const FIELD_LINKS_MOCK_NAME = 'fieldLinks';
const FIELD_CURRENCY_MOCK_NAME = 'fieldCurrency';
const FIELD_ADDRESS_MOCK_NAME = 'fieldAddress';
const FIELD_ACTOR_MOCK_NAME = 'fieldActor';
const FIELD_FULL_NAME_MOCK_NAME = 'fieldFullName';
const objectMetadataId = '20202020-0000-0000-0000-000000000001';
const workspaceId = '20202020-0000-0000-0000-000000000000';
const createFlatFieldMetadata = (
id: string,
name: string,
type: FieldMetadataType,
): FlatFieldMetadata => {
return getFlatFieldMetadataMock({
id,
name,
type,
objectMetadataId,
universalIdentifier: id,
workspaceId,
});
};
const fieldLinksMock = createFlatFieldMetadata(
'fieldLinksId',
FIELD_LINKS_MOCK_NAME,
FieldMetadataType.LINKS,
);
const fieldCurrencyMock = createFlatFieldMetadata(
'fieldCurrencyId',
FIELD_CURRENCY_MOCK_NAME,
FieldMetadataType.CURRENCY,
);
const fieldFullNameMock = createFlatFieldMetadata(
'fieldFullNameId',
FIELD_FULL_NAME_MOCK_NAME,
FieldMetadataType.FULL_NAME,
);
const fieldActorMock = createFlatFieldMetadata(
'fieldActorId',
FIELD_ACTOR_MOCK_NAME,
FieldMetadataType.ACTOR,
);
const fieldAddressMock = createFlatFieldMetadata(
'fieldAddressId',
FIELD_ADDRESS_MOCK_NAME,
FieldMetadataType.ADDRESS,
);
const FIELDS_MOCK = [
fieldLinksMock,
fieldCurrencyMock,
fieldFullNameMock,
fieldActorMock,
fieldAddressMock,
];
const flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> =
FIELDS_MOCK.reduce(
(acc, field) => ({
...acc,
byId: {
...acc.byId,
[field.id]: field,
},
}),
createEmptyFlatEntityMaps() as FlatEntityMaps<FlatFieldMetadata>,
);
const flatObjectMetadata = getFlatObjectMetadataMock({
id: objectMetadataId,
workspaceId,
nameSingular: 'objectName',
namePlural: 'objectNames',
labelSingular: 'Object Name',
labelPlural: 'Object Names',
description: 'Object description',
icon: 'Icon123',
isCustom: false,
isRemote: false,
isActive: true,
isSystem: false,
isAuditLogged: true,
isSearchable: true,
fieldMetadataIds: FIELDS_MOCK.map((f) => f.id),
indexMetadataIds: [],
viewIds: [],
universalIdentifier: objectMetadataId,
applicationId: null,
labelIdentifierFieldMetadataId: null,
imageIdentifierFieldMetadataId: null,
shortcut: null,
isLabelSyncedWithName: true,
standardId: null,
standardOverrides: null,
targetTableName: 'DEPRECATED',
duplicateCriteria: null,
});
type ValidateFieldNameAvailabilityTestContext = EachTestingContext<{
input: string;
shouldNotThrow?: true;
}>;
const validateFieldNameAvailabilityTestCases: ValidateFieldNameAvailabilityTestContext[] =
[
{
title: 'does not throw if name is not reserved',
context: {
input: 'testName',
shouldNotThrow: true,
},
},
{
title: 'throws error with LINKS suffixes',
context: {
input: `${FIELD_LINKS_MOCK_NAME}PrimaryLinkLabel`,
},
},
{
title: 'throws error with CURRENCY suffixes',
context: {
input: `${FIELD_CURRENCY_MOCK_NAME}AmountMicros`,
},
},
{
title: 'throws error with FULL_NAME suffixes',
context: {
input: `${FIELD_FULL_NAME_MOCK_NAME}FirstName`,
},
},
{
title: 'throws error with ACTOR suffixes',
context: {
input: `${FIELD_ACTOR_MOCK_NAME}Name`,
},
},
{
title: 'throws error with ADDRESS suffixes',
context: {
input: `${FIELD_ADDRESS_MOCK_NAME}AddressStreet1`,
},
},
];
describe('validateFieldNameAvailabilityOrThrow', () => {
it.each(validateFieldNameAvailabilityTestCases)(
'$title',
({ context: { input, shouldNotThrow } }) => {
if (shouldNotThrow) {
expect(() =>
validateFieldNameAvailabilityOrThrow({
name: input,
flatObjectMetadata,
flatFieldMetadataMaps,
}),
).not.toThrow();
} else {
expect(() =>
validateFieldNameAvailabilityOrThrow({
name: input,
flatObjectMetadata,
flatFieldMetadataMaps,
}),
).toThrowErrorMatchingSnapshot();
}
},
);
});
@@ -1,88 +0,0 @@
import { type EachTestingContext } from 'twenty-shared/testing';
import { validateMetadataNameOrThrow } from 'src/engine/metadata-modules/utils/validate-metadata-name-or-throw.utils';
type ValidateMetadataNameTestContext = EachTestingContext<{
input: string;
shouldNotThrow?: true;
}>;
const validateMetadataNameTestCases: ValidateMetadataNameTestContext[] = [
{
title: 'validates when string is valid',
context: {
input: 'testName',
shouldNotThrow: true,
},
},
{
title: 'throw error when string is not in camel case',
context: {
input: 'TestName',
},
},
{
title: 'throws error when string has spaces',
context: {
input: 'name with spaces',
},
},
{
title: 'throws error when string is a reserved word',
context: {
input: 'role',
},
},
{
title: 'throws error when string starts with capital letter',
context: {
input: 'StringStartingWithCapitalLetter',
},
},
{
title: 'throws error when string has non latin characters',
context: {
input: 'בְרִבְרִ',
},
},
{
title: 'throws error when starts with digits',
context: {
input: '123string',
},
},
{
title: 'validates when string is less than 63 characters',
context: {
input: 'a'.repeat(63),
shouldNotThrow: true,
},
},
{
title: 'throws error when string is above 63 characters',
context: {
input: 'a'.repeat(64),
},
},
{
title: 'throws error when string is empty',
context: {
input: '',
},
},
];
describe('validateMetadataNameOrThrow', () => {
it.each(validateMetadataNameTestCases)(
'$title',
({ context: { input, shouldNotThrow } }) => {
if (shouldNotThrow) {
expect(() => validateMetadataNameOrThrow(input)).not.toThrow();
} else {
expect(() =>
validateMetadataNameOrThrow(input),
).toThrowErrorMatchingSnapshot();
}
},
);
});