Fix field creation (#7547)

In [this](https://github.com/twentyhq/twenty/pull/7522) and
[this](https://github.com/twentyhq/twenty/pull/7543) PR we introduced
the impossibility to save a field that would be non nullable but without
a default value.
The check is actually called on the input while the defaultValue is
added by the service on a "built" fieldMetadata to create or save. So
far all fields created from the app it currently fails as both
isNullable and defaultValue are undefined so falsy at that stage.
This commit is contained in:
Marie
2024-10-10 09:38:29 +02:00
committed by GitHub
parent c13b29a6ea
commit b6b7d0e665

View File

@ -159,14 +159,7 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
); );
} }
this.validateFieldMetadataInput<CreateFieldInput>( const fieldMetadataForCreate = {
fieldMetadataInput.type,
fieldMetadataInput,
objectMetadata,
);
console.time('createOne save');
const createdFieldMetadata = await fieldMetadataRepository.save({
id: v4(), id: v4(),
createdAt: new Date(), createdAt: new Date(),
updatedAt: new Date(), updatedAt: new Date(),
@ -187,7 +180,18 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
: undefined, : undefined,
isActive: true, isActive: true,
isCustom: true, isCustom: true,
}); };
this.validateFieldMetadata<CreateFieldInput>(
fieldMetadataForCreate.type,
fieldMetadataForCreate,
objectMetadata,
);
console.time('createOne save');
const createdFieldMetadata = await fieldMetadataRepository.save(
fieldMetadataForCreate,
);
console.timeEnd('createOne save'); console.timeEnd('createOne save');
@ -394,12 +398,6 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
} }
} }
this.validateFieldMetadataInput<UpdateFieldInput>(
existingFieldMetadata.type,
fieldMetadataInput,
objectMetadata,
);
const updatableFieldInput = const updatableFieldInput =
existingFieldMetadata.isCustom === false existingFieldMetadata.isCustom === false
? this.buildUpdatableStandardFieldInput( ? this.buildUpdatableStandardFieldInput(
@ -408,21 +406,21 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
) )
: fieldMetadataInput; : fieldMetadataInput;
// We're running field update under a transaction, so we can rollback if migration fails const fieldMetadataForUpdate = {
await fieldMetadataRepository.update(id, {
...updatableFieldInput, ...updatableFieldInput,
defaultValue: defaultValue: isDefined(updatableFieldInput.defaultValue)
// Todo: we handle default value for all field types. ? updatableFieldInput.defaultValue
![ : existingFieldMetadata.defaultValue,
FieldMetadataType.SELECT, };
FieldMetadataType.MULTI_SELECT,
FieldMetadataType.BOOLEAN, this.validateFieldMetadata<UpdateFieldInput>(
].includes(existingFieldMetadata.type) existingFieldMetadata.type,
? existingFieldMetadata.defaultValue fieldMetadataForUpdate,
: updatableFieldInput.defaultValue !== null objectMetadata,
? updatableFieldInput.defaultValue );
: null,
}); // We're running field update under a transaction, so we can rollback if migration fails
await fieldMetadataRepository.update(id, fieldMetadataForUpdate);
const updatedFieldMetadata = await fieldMetadataRepository.findOne({ const updatedFieldMetadata = await fieldMetadataRepository.findOne({
where: { id }, where: { id },
@ -710,9 +708,7 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
} }
} }
private validateFieldMetadataInput< private validateFieldMetadata<T extends UpdateFieldInput | CreateFieldInput>(
T extends UpdateFieldInput | CreateFieldInput,
>(
fieldMetadataType: FieldMetadataType, fieldMetadataType: FieldMetadataType,
fieldMetadataInput: T, fieldMetadataInput: T,
objectMetadata: ObjectMetadataEntity, objectMetadata: ObjectMetadataEntity,
@ -746,7 +742,7 @@ export class FieldMetadataService extends TypeOrmQueryService<FieldMetadataEntit
} }
} }
if (!fieldMetadataInput.isNullable) { if (fieldMetadataInput.isNullable === false) {
if (!isDefined(fieldMetadataInput.defaultValue)) { if (!isDefined(fieldMetadataInput.defaultValue)) {
throw new FieldMetadataException( throw new FieldMetadataException(
'Default value is required for non nullable fields', 'Default value is required for non nullable fields',