Fix user friendly message for non available object name (#14210)
Fixes https://github.com/twentyhq/twenty/issues/13577. When naming or renaming an object, we are already checking that the name was available compared to other existing objects. But we also need to check that the relation fields that will be created or updated are available as well: we create relation fields on Attachment, Note, Favorite, Task and TimelineActivites, that bear the name of the object. Thus, it is not possible to create an object that has the same name as one of the fields on Attachment, Note etc: name, createdAt, ... are not valid names.
This commit is contained in:
+2
-2
@@ -64,14 +64,14 @@ describe('validateFieldNameAvailabilityOrThrow', () => {
|
||||
expect(() =>
|
||||
validateFieldNameAvailabilityOrThrow({
|
||||
name: input,
|
||||
objectMetadata: objectMetadataMapItemMock,
|
||||
fieldMetadataMapById: objectMetadataMapItemMock.fieldsById,
|
||||
}),
|
||||
).not.toThrow();
|
||||
} else {
|
||||
expect(() =>
|
||||
validateFieldNameAvailabilityOrThrow({
|
||||
name: input,
|
||||
objectMetadata: objectMetadataMapItemMock,
|
||||
fieldMetadataMapById: objectMetadataMapItemMock.fieldsById,
|
||||
}),
|
||||
).toThrowErrorMatchingSnapshot();
|
||||
}
|
||||
|
||||
+8
-8
@@ -4,18 +4,18 @@ import { FieldMetadataType } from 'twenty-shared/types';
|
||||
import { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types';
|
||||
import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util';
|
||||
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
||||
import { type ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps';
|
||||
import { type FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
import {
|
||||
InvalidMetadataException,
|
||||
InvalidMetadataExceptionCode,
|
||||
} from 'src/engine/metadata-modules/utils/exceptions/invalid-metadata.exception';
|
||||
|
||||
const getReservedCompositeFieldNames = (
|
||||
objectMetadata: ObjectMetadataItemWithFieldMaps,
|
||||
fieldMetadataMapById: FieldMetadataMap,
|
||||
) => {
|
||||
const reservedCompositeFieldsNames: string[] = [];
|
||||
|
||||
for (const field of Object.values(objectMetadata.fieldsById)) {
|
||||
for (const field of Object.values(fieldMetadataMapById)) {
|
||||
if (isCompositeFieldMetadataType(field.type)) {
|
||||
const base = field.name;
|
||||
const compositeType = compositeTypeDefinitions.get(field.type);
|
||||
@@ -33,17 +33,17 @@ const getReservedCompositeFieldNames = (
|
||||
|
||||
type ValidateFieldNameAvailabilityOrThrowArgs = {
|
||||
name: string;
|
||||
objectMetadata: ObjectMetadataItemWithFieldMaps;
|
||||
fieldMetadataMapById: FieldMetadataMap;
|
||||
};
|
||||
export const validateFieldNameAvailabilityOrThrow = ({
|
||||
name,
|
||||
objectMetadata,
|
||||
fieldMetadataMapById,
|
||||
}: ValidateFieldNameAvailabilityOrThrowArgs) => {
|
||||
const reservedCompositeFieldsNames =
|
||||
getReservedCompositeFieldNames(objectMetadata);
|
||||
getReservedCompositeFieldNames(fieldMetadataMapById);
|
||||
|
||||
if (
|
||||
Object.values(objectMetadata.fieldsById).some(
|
||||
Object.values(fieldMetadataMapById).some(
|
||||
(field) =>
|
||||
field.name === name ||
|
||||
(field.type === FieldMetadataType.RELATION &&
|
||||
@@ -54,7 +54,7 @@ export const validateFieldNameAvailabilityOrThrow = ({
|
||||
`Name "${name}" is not available as it is already used by another field`,
|
||||
InvalidMetadataExceptionCode.NOT_AVAILABLE,
|
||||
{
|
||||
userFriendlyMessage: t`This name is not available as it is already used by another field`,
|
||||
userFriendlyMessage: t`This name is not available as it is already used by another field.`,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user