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