Add onDeleteAction to RelationMetadata (#4100)

* Add onDeleteAction to relationMetadata

* rename to SET NULL

* fix migration

* fix migration

* fix after review
This commit is contained in:
Weiko
2024-02-22 10:27:15 +01:00
committed by GitHub
parent e69c462b70
commit 8425ce4987
21 changed files with 357 additions and 31 deletions
@@ -29,6 +29,7 @@ export enum WorkspaceHealthIssueType {
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_CONFLICT = 'RELATION_FOREIGN_KEY_CONFLICT',
RELATION_FOREIGN_KEY_ON_DELETE_ACTION_CONFLICT = 'RELATION_FOREIGN_KEY_ON_DELETE_ACTION_CONFLICT',
RELATION_TYPE_NOT_VALID = 'RELATION_TYPE_NOT_VALID',
}
@@ -85,6 +86,7 @@ export type WorkspaceRelationIssueTypes =
| WorkspaceHealthIssueType.RELATION_FROM_OR_TO_FIELD_METADATA_NOT_VALID
| WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_NOT_VALID
| WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_CONFLICT
| WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_ON_DELETE_ACTION_CONFLICT
| WorkspaceHealthIssueType.RELATION_TYPE_NOT_VALID;
export interface WorkspaceHealthRelationIssue<
@@ -8,6 +8,8 @@ export interface WorkspaceTableStructure {
isPrimaryKey: boolean;
isForeignKey: boolean;
isUnique: boolean;
onUpdateAction: string;
onDeleteAction: string;
}
export type WorkspaceTableStructureResult = {
@@ -85,7 +85,9 @@ export class DatabaseStructureService {
CASE
WHEN uc.column_name IS NOT NULL THEN 'TRUE'
ELSE 'FALSE'
END AS "isUnique"
END AS "isUnique",
rc.update_rule AS "onUpdateAction",
rc.delete_rule AS "onDeleteAction"
FROM
information_schema.columns AS c
LEFT JOIN
@@ -109,6 +111,9 @@ export class DatabaseStructureService {
ON c.table_schema = uc.schema_name
AND c.table_name = uc.table_name
AND c.column_name = uc.column_name
LEFT JOIN
information_schema.referential_constraints AS rc
ON rc.constraint_name = fk.constraint_name
WHERE
c.table_schema = '${schemaName}'
AND c.table_name = '${tableName}';
@@ -209,6 +209,16 @@ export class RelationMetadataHealthService {
});
}
if (relationMetadata.onDeleteAction !== relationColumn.onDeleteAction) {
issues.push({
type: WorkspaceHealthIssueType.RELATION_FOREIGN_KEY_ON_DELETE_ACTION_CONFLICT,
fromFieldMetadata,
toFieldMetadata,
relationMetadata,
message: `Relation ${relationMetadata.id} foreign key onDeleteAction is not properly set`,
});
}
return issues;
}