59d90bedaa
# Introduction Migrating and improving performances of field enum integrations tests success and failing tests cases to be using the new v2 api ## Discovered issue When deleting an object in v1 it will leave related enums until the object is re-created Something not done anymore within the create in v2 but in the delete operation We should implem an upgrade command to remove such relicas ## Bugs - Update/create default value multi select runner wrong sql query -> FIX - Update default value multi select regression, we should allow option without an id to be inserted -> FIX - default value compare dynamic json stringify convertion or not in compare tools for object and fields
66 lines
2.3 KiB
TypeScript
66 lines
2.3 KiB
TypeScript
import { type FieldMetadataType } from 'twenty-shared/types';
|
|
|
|
import { type CompositeProperty } from 'src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface';
|
|
|
|
import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
|
import {
|
|
FieldMetadataException,
|
|
FieldMetadataExceptionCode,
|
|
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
|
|
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util';
|
|
import { pascalCase } from 'src/utils/pascal-case';
|
|
|
|
type ComputeColumnNameOptions = { isForeignKey?: boolean };
|
|
|
|
export type FieldTypeAndNameMetadata = {
|
|
name: string;
|
|
type: FieldMetadataType;
|
|
};
|
|
|
|
// TODO: If we need to implement custom name logic for columns, we can do it here
|
|
export function computeColumnName<T extends FieldMetadataType>(
|
|
fieldMetadataOrFieldName: FieldMetadataEntity<T> | string,
|
|
options?: ComputeColumnNameOptions,
|
|
): string {
|
|
const generateName = (name: string) => {
|
|
return options?.isForeignKey ? `${name}Id` : name;
|
|
};
|
|
|
|
if (typeof fieldMetadataOrFieldName === 'string') {
|
|
return generateName(fieldMetadataOrFieldName);
|
|
}
|
|
|
|
if (isCompositeFieldMetadataType(fieldMetadataOrFieldName.type)) {
|
|
throw new FieldMetadataException(
|
|
`Cannot compute composite column name for field: ${fieldMetadataOrFieldName.type}`,
|
|
FieldMetadataExceptionCode.INVALID_FIELD_INPUT,
|
|
);
|
|
}
|
|
|
|
return generateName(fieldMetadataOrFieldName.name);
|
|
}
|
|
export function computeCompositeColumnName<T extends FieldMetadataType>(
|
|
fieldMetadataOrFieldName:
|
|
| FieldTypeAndNameMetadata
|
|
| FieldMetadataEntity<T>
|
|
| string,
|
|
compositeProperty: CompositeProperty,
|
|
): string {
|
|
const generateName = (name: string) => {
|
|
return `${name}${pascalCase(compositeProperty.name)}`;
|
|
};
|
|
|
|
if (typeof fieldMetadataOrFieldName === 'string') {
|
|
return generateName(fieldMetadataOrFieldName);
|
|
}
|
|
|
|
if (!isCompositeFieldMetadataType(fieldMetadataOrFieldName.type)) {
|
|
throw new FieldMetadataException(
|
|
`Cannot compute composite column name for non-composite field metadata type: ${fieldMetadataOrFieldName.type}`,
|
|
FieldMetadataExceptionCode.INVALID_FIELD_INPUT,
|
|
);
|
|
}
|
|
|
|
return generateName(fieldMetadataOrFieldName.name);
|
|
}
|