95 lines
3.0 KiB
TypeScript
95 lines
3.0 KiB
TypeScript
import {
|
|
isDefined,
|
|
isLabelIdentifierFieldMetadataTypes,
|
|
} from 'twenty-shared/utils';
|
|
|
|
import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface';
|
|
|
|
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
|
import {
|
|
ObjectMetadataException,
|
|
ObjectMetadataExceptionCode,
|
|
} from 'src/engine/metadata-modules/object-metadata/object-metadata.exception';
|
|
|
|
type Validator = {
|
|
validator: (args: {
|
|
fieldMetadataId: string;
|
|
matchingFieldMetadata?: FieldMetadataEntity | FieldMetadataInterface;
|
|
}) => boolean;
|
|
label: string;
|
|
};
|
|
|
|
type ValidateMetadataIdentifierFieldMetadataIdOrThrowArgs = {
|
|
fieldMetadataId: string;
|
|
fieldMetadataItems: FieldMetadataEntity[] | FieldMetadataInterface[];
|
|
validators: Validator[];
|
|
};
|
|
const validatorRunner = ({
|
|
fieldMetadataId,
|
|
fieldMetadataItems,
|
|
validators,
|
|
}: ValidateMetadataIdentifierFieldMetadataIdOrThrowArgs): void => {
|
|
const matchingFieldMetadata = fieldMetadataItems.find(
|
|
(fieldMetadata) => fieldMetadata.id === fieldMetadataId,
|
|
);
|
|
|
|
validators.forEach(({ label, validator }) => {
|
|
if (validator({ fieldMetadataId, matchingFieldMetadata })) {
|
|
throw new ObjectMetadataException(
|
|
label,
|
|
ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT,
|
|
);
|
|
}
|
|
});
|
|
};
|
|
|
|
type ValidateMetadataIdentifierFieldMetadataIdsArgs = {
|
|
labelIdentifierFieldMetadataId: string | undefined;
|
|
imageIdentifierFieldMetadataId: string | undefined;
|
|
fieldMetadataItems: FieldMetadataEntity[] | FieldMetadataInterface[];
|
|
};
|
|
export const validateMetadataIdentifierFieldMetadataIds = ({
|
|
imageIdentifierFieldMetadataId,
|
|
labelIdentifierFieldMetadataId,
|
|
fieldMetadataItems,
|
|
}: ValidateMetadataIdentifierFieldMetadataIdsArgs) => {
|
|
const isMatchingFieldMetadataDefined: Validator['validator'] = ({
|
|
matchingFieldMetadata,
|
|
}) => !isDefined(matchingFieldMetadata);
|
|
|
|
if (isDefined(labelIdentifierFieldMetadataId)) {
|
|
validatorRunner({
|
|
fieldMetadataId: labelIdentifierFieldMetadataId,
|
|
fieldMetadataItems,
|
|
validators: [
|
|
{
|
|
validator: isMatchingFieldMetadataDefined,
|
|
label:
|
|
'labelIdentifierFieldMetadataId validation failed: related field metadata not found',
|
|
},
|
|
{
|
|
validator: ({ matchingFieldMetadata }) =>
|
|
isDefined(matchingFieldMetadata) &&
|
|
!isLabelIdentifierFieldMetadataTypes(matchingFieldMetadata.type),
|
|
label:
|
|
'labelIdentifierFieldMetadataId validation failed: it must be a TEXT or FULL_NAME field metadata type id',
|
|
},
|
|
],
|
|
});
|
|
}
|
|
|
|
if (isDefined(imageIdentifierFieldMetadataId)) {
|
|
validatorRunner({
|
|
fieldMetadataId: imageIdentifierFieldMetadataId,
|
|
fieldMetadataItems,
|
|
validators: [
|
|
{
|
|
validator: isMatchingFieldMetadataDefined,
|
|
label:
|
|
'imageIdentifierFieldMetadataId validation failed: related field metadata not found',
|
|
},
|
|
],
|
|
});
|
|
}
|
|
};
|