fix: workspace health undefined relation (#4107)

This commit is contained in:
Jérémy M
2024-02-21 15:36:18 +01:00
committed by GitHub
parent ee7c1fbf5c
commit e3e940327e
3 changed files with 20 additions and 12 deletions

View File

@ -25,6 +25,7 @@ export enum WorkspaceHealthIssueType {
COLUMN_DEFAULT_VALUE_CONFLICT = 'COLUMN_DEFAULT_VALUE_CONFLICT', COLUMN_DEFAULT_VALUE_CONFLICT = 'COLUMN_DEFAULT_VALUE_CONFLICT',
COLUMN_DEFAULT_VALUE_NOT_VALID = 'COLUMN_DEFAULT_VALUE_NOT_VALID', COLUMN_DEFAULT_VALUE_NOT_VALID = 'COLUMN_DEFAULT_VALUE_NOT_VALID',
COLUMN_OPTIONS_NOT_VALID = 'COLUMN_OPTIONS_NOT_VALID', COLUMN_OPTIONS_NOT_VALID = 'COLUMN_OPTIONS_NOT_VALID',
RELATION_METADATA_NOT_VALID = 'RELATION_METADATA_NOT_VALID',
RELATION_FROM_OR_TO_FIELD_METADATA_NOT_VALID = 'RELATION_FROM_OR_TO_FIELD_METADATA_NOT_VALID', RELATION_FROM_OR_TO_FIELD_METADATA_NOT_VALID = 'RELATION_FROM_OR_TO_FIELD_METADATA_NOT_VALID',
RELATION_FOREIGN_KEY_NOT_VALID = 'RELATION_FOREIGN_KEY_NOT_VALID', RELATION_FOREIGN_KEY_NOT_VALID = 'RELATION_FOREIGN_KEY_NOT_VALID',
RELATION_FOREIGN_KEY_CONFLICT = 'RELATION_FOREIGN_KEY_CONFLICT', RELATION_FOREIGN_KEY_CONFLICT = 'RELATION_FOREIGN_KEY_CONFLICT',
@ -80,6 +81,7 @@ export interface WorkspaceHealthColumnIssue<
* Relation issues * Relation issues
*/ */
export type WorkspaceRelationIssueTypes = export type WorkspaceRelationIssueTypes =
| WorkspaceHealthIssueType.RELATION_METADATA_NOT_VALID
| WorkspaceHealthIssueType.RELATION_FROM_OR_TO_FIELD_METADATA_NOT_VALID | WorkspaceHealthIssueType.RELATION_FROM_OR_TO_FIELD_METADATA_NOT_VALID
| WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_NOT_VALID | WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_NOT_VALID
| WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_CONFLICT | WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_CONFLICT
@ -89,9 +91,9 @@ export interface WorkspaceHealthRelationIssue<
T extends WorkspaceRelationIssueTypes, T extends WorkspaceRelationIssueTypes,
> { > {
type: T; type: T;
fromFieldMetadata: FieldMetadataEntity | undefined; fromFieldMetadata?: FieldMetadataEntity | undefined;
toFieldMetadata: FieldMetadataEntity | undefined; toFieldMetadata?: FieldMetadataEntity | undefined;
relationMetadata: RelationMetadataEntity; relationMetadata?: RelationMetadataEntity;
columnStructure?: WorkspaceTableStructure; columnStructure?: WorkspaceTableStructure;
message: string; message: string;
} }

View File

@ -28,6 +28,7 @@ import { serializeDefaultValue } from 'src/metadata/field-metadata/utils/seriali
import { computeCompositeFieldMetadata } from 'src/workspace/workspace-health/utils/compute-composite-field-metadata.util'; import { computeCompositeFieldMetadata } from 'src/workspace/workspace-health/utils/compute-composite-field-metadata.util';
import { generateTargetColumnMap } from 'src/metadata/field-metadata/utils/generate-target-column-map.util'; import { generateTargetColumnMap } from 'src/metadata/field-metadata/utils/generate-target-column-map.util';
import { customNamePrefix } from 'src/workspace/utils/compute-custom-name.util'; import { customNamePrefix } from 'src/workspace/utils/compute-custom-name.util';
import { isRelationFieldMetadataType } from 'src/workspace/utils/is-relation-field-metadata-type.util';
@Injectable() @Injectable()
export class FieldMetadataHealthService { export class FieldMetadataHealthService {
@ -45,10 +46,7 @@ export class FieldMetadataHealthService {
for (const fieldMetadata of fieldMetadataCollection) { for (const fieldMetadata of fieldMetadataCollection) {
// Relation metadata are checked in another service // Relation metadata are checked in another service
if ( if (isRelationFieldMetadataType(fieldMetadata.type)) {
fieldMetadata.fromRelationMetadata ||
fieldMetadata.toRelationMetadata
) {
continue; continue;
} }

View File

@ -10,10 +10,7 @@ import {
WorkspaceHealthOptions, WorkspaceHealthOptions,
} from 'src/workspace/workspace-health/interfaces/workspace-health-options.interface'; } from 'src/workspace/workspace-health/interfaces/workspace-health-options.interface';
import { import { FieldMetadataEntity } from 'src/metadata/field-metadata/field-metadata.entity';
FieldMetadataEntity,
FieldMetadataType,
} from 'src/metadata/field-metadata/field-metadata.entity';
import { import {
RelationMetadataEntity, RelationMetadataEntity,
RelationMetadataType, RelationMetadataType,
@ -25,6 +22,7 @@ import {
import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity'; import { ObjectMetadataEntity } from 'src/metadata/object-metadata/object-metadata.entity';
import { createRelationForeignKeyColumnName } from 'src/metadata/relation-metadata/utils/create-relation-foreign-key-column-name.util'; import { createRelationForeignKeyColumnName } from 'src/metadata/relation-metadata/utils/create-relation-foreign-key-column-name.util';
import { createRelationForeignKeyFieldMetadataName } from 'src/metadata/relation-metadata/utils/create-relation-foreign-key-field-metadata-name.util'; import { createRelationForeignKeyFieldMetadataName } from 'src/metadata/relation-metadata/utils/create-relation-foreign-key-field-metadata-name.util';
import { isRelationFieldMetadataType } from 'src/workspace/utils/is-relation-field-metadata-type.util';
@Injectable() @Injectable()
export class RelationMetadataHealthService { export class RelationMetadataHealthService {
@ -40,12 +38,22 @@ export class RelationMetadataHealthService {
for (const fieldMetadata of objectMetadata.fields) { for (const fieldMetadata of objectMetadata.fields) {
// We're only interested in relation fields // We're only interested in relation fields
if (fieldMetadata.type !== FieldMetadataType.RELATION) { if (!isRelationFieldMetadataType(fieldMetadata.type)) {
continue; continue;
} }
const relationMetadata = const relationMetadata =
fieldMetadata.fromRelationMetadata ?? fieldMetadata.toRelationMetadata; fieldMetadata.fromRelationMetadata ?? fieldMetadata.toRelationMetadata;
if (!relationMetadata) {
issues.push({
type: WorkspaceHealthIssueType.RELATION_METADATA_NOT_VALID,
message: `Field ${fieldMetadata.id} has invalid relation metadata`,
});
continue;
}
const relationDirection = deduceRelationDirection( const relationDirection = deduceRelationDirection(
objectMetadata.id, objectMetadata.id,
relationMetadata, relationMetadata,