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:
@ -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',
|
||||
|
||||
Reference in New Issue
Block a user