diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts index d32c7994c..fe8175773 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts @@ -19,6 +19,7 @@ import { FieldMetadataException, FieldMetadataExceptionCode, } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; +import { assertDoesNotNullifyDefaultValueForNonNullableField } from 'src/engine/metadata-modules/field-metadata/utils/assert-does-not-nullify-default-value-for-non-nullable-field.util'; import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { generateNullable } from 'src/engine/metadata-modules/field-metadata/utils/generate-nullable'; import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; @@ -310,6 +311,11 @@ export class FieldMetadataService extends TypeOrmQueryService { + it('should not throw if default value is set to null and field is nullable', () => { + expect(() => + assertDoesNotNullifyDefaultValueForNonNullableField({ + isNullable: true, + defaultValueFromUpdate: null, + }), + ).not.toThrow(); + }); + + it('should not throw if default value is undefined and field is non nullable', () => { + expect(() => + assertDoesNotNullifyDefaultValueForNonNullableField({ + isNullable: false, + }), + ).not.toThrow(); + }); + + it('should not throw if default value is not set to null and field is non nullable', () => { + expect(() => + assertDoesNotNullifyDefaultValueForNonNullableField({ + isNullable: false, + defaultValueFromUpdate: 'new default value', + }), + ).not.toThrow(); + }); + + it('should throw if default value is set to null and field is non nullable', () => { + expect(() => + assertDoesNotNullifyDefaultValueForNonNullableField({ + isNullable: false, + defaultValueFromUpdate: null, + }), + ).toThrow(); + }); +}); diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/assert-does-not-nullify-default-value-for-non-nullable-field.util.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/assert-does-not-nullify-default-value-for-non-nullable-field.util.ts new file mode 100644 index 000000000..7fcd625b8 --- /dev/null +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/assert-does-not-nullify-default-value-for-non-nullable-field.util.ts @@ -0,0 +1,19 @@ +import { + FieldMetadataException, + FieldMetadataExceptionCode, +} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; + +export const assertDoesNotNullifyDefaultValueForNonNullableField = ({ + isNullable, + defaultValueFromUpdate, +}: { + isNullable: boolean; + defaultValueFromUpdate?: any; +}) => { + if (!isNullable && defaultValueFromUpdate === null) { + throw new FieldMetadataException( + 'Default value cannot be nullified for non-nullable field', + FieldMetadataExceptionCode.INVALID_FIELD_INPUT, + ); + } +};