fix: workspace health undefined relation (#4107)
This commit is contained in:
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user