File size: 1,470 Bytes
d9494a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';

import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';

type ValidateEnumValueCompatibilityArgs = {
  workspaceMemberFieldMetadata: FlatFieldMetadata;
  targetFieldMetadata: FlatFieldMetadata;
  predicateValue: unknown;
};

export const validateEnumValueCompatibility = ({
  workspaceMemberFieldMetadata,
  targetFieldMetadata,
  predicateValue,
}: ValidateEnumValueCompatibilityArgs): boolean => {
  const isWorkspaceMemberFieldEnum =
    workspaceMemberFieldMetadata.type === FieldMetadataType.SELECT ||
    workspaceMemberFieldMetadata.type === FieldMetadataType.MULTI_SELECT;

  const isTargetFieldEnum =
    targetFieldMetadata.type === FieldMetadataType.SELECT ||
    targetFieldMetadata.type === FieldMetadataType.MULTI_SELECT;

  if (!isWorkspaceMemberFieldEnum || !isTargetFieldEnum) {
    return true;
  }

  const targetFieldOptions = targetFieldMetadata.options || [];
  const validTargetValues = new Set(
    targetFieldOptions.map((option) => option.value),
  );

  if (validTargetValues.size === 0) {
    return true;
  }

  const valuesToCheck = Array.isArray(predicateValue)
    ? predicateValue
    : [predicateValue];

  const allValuesAreValid = valuesToCheck.every(
    (value) => isDefined(value) && validTargetValues.has(String(value)),
  );

  return allValuesAreValid;
};