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