Skip to content

Commit 3316bfa

Browse files
authored
fix: link fix logic error (#1445)
1 parent 83ce209 commit 3316bfa

4 files changed

Lines changed: 18 additions & 5 deletions

File tree

apps/nestjs-backend/src/features/integrity/foreign-key.service.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ export class ForeignKeyIntegrityService {
9393
const message = isSelfReference
9494
? `Found ${refCount} invalid self references in table ${referencedTableName}`
9595
: `Found ${refCount} invalid foreign references to table ${referencedTableName}`;
96-
9796
issues.push({
9897
type: IntegrityIssueType.MissingRecordReference,
98+
fieldId: field.id,
9999
message: `${message} (Field Name: ${field.name}, Field ID: ${field.id})`,
100100
});
101101
}
@@ -165,6 +165,10 @@ export class ForeignKeyIntegrityService {
165165
targetTableName: string;
166166
keyName: string;
167167
}) {
168+
if (!fkHostTableName.split('.')[1].startsWith('junction_')) {
169+
throw new Error(`fkHostTableName: ${fkHostTableName} is not a junction table`);
170+
}
171+
168172
const deleteQuery = this.knex(fkHostTableName)
169173
.whereNotExists(
170174
this.knex

apps/nestjs-backend/src/features/integrity/link-field.service.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export class LinkFieldIntegrityService {
3535
return [
3636
{
3737
type: IntegrityIssueType.InvalidLinkReference,
38+
fieldId: field.id,
3839
message: `Found ${inconsistentRecords.length} inconsistent links in fkHostTableName ${fkHostTableName} (TableName: ${table.name}, Field Name: ${field.name}, Field ID: ${field.id})`,
3940
},
4041
];

apps/nestjs-backend/src/features/integrity/link-integrity.service.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export class LinkIntegrityService {
118118

119119
if (!foreignTable) {
120120
issues.push({
121+
fieldId: field.id,
121122
type: IntegrityIssueType.ForeignTableNotFound,
122123
message: `Foreign table with ID ${options.foreignTableId} not found for link field (Field Name: ${field.name}, Field ID: ${field.id}) in table ${table.name}`,
123124
});
@@ -129,6 +130,7 @@ export class LinkIntegrityService {
129130

130131
if (!tableExists[0].exists) {
131132
issues.push({
133+
fieldId: field.id,
132134
type: IntegrityIssueType.ForeignKeyHostTableNotFound,
133135
message: `Foreign key host table ${options.fkHostTableName} not found for link field (Field Name: ${field.name}, Field ID: ${field.id}) in table ${table.name}`,
134136
});
@@ -147,13 +149,15 @@ export class LinkIntegrityService {
147149

148150
if (!selfKeyExists) {
149151
issues.push({
152+
fieldId: field.id,
150153
type: IntegrityIssueType.ForeignKeyNotFound,
151154
message: `Self key name "${options.selfKeyName}" is missing for link field (Field Name: ${field.name}, Field ID: ${field.id}) in table ${table.name}`,
152155
});
153156
}
154157

155158
if (!foreignKeyExists) {
156159
issues.push({
160+
fieldId: field.id,
157161
type: IntegrityIssueType.ForeignKeyNotFound,
158162
message: `Foreign key name "${options.foreignKeyName}" is missing for link field (Field Name: ${field.name}, Field ID: ${field.id}) in table ${table.name}`,
159163
});
@@ -167,6 +171,7 @@ export class LinkIntegrityService {
167171

168172
if (!symmetricField) {
169173
issues.push({
174+
fieldId: field.id,
170175
type: IntegrityIssueType.SymmetricFieldNotFound,
171176
message: `Symmetric field ID ${options.symmetricFieldId} not found for link field (Field Name: ${field.name}, Field ID: ${field.id}) in table ${table.name}`,
172177
});
@@ -175,6 +180,7 @@ export class LinkIntegrityService {
175180

176181
if (!options.isOneWay && !options.symmetricFieldId) {
177182
issues.push({
183+
fieldId: field.id,
178184
type: IntegrityIssueType.SymmetricFieldNotFound,
179185
message: `Symmetric is missing for link field (Field Name: ${field.name}, Field ID: ${field.id}) in table ${table.name}`,
180186
});
@@ -203,21 +209,22 @@ export class LinkIntegrityService {
203209
async linkIntegrityFix(baseId: string): Promise<IIntegrityIssue[]> {
204210
const checkResult = await this.linkIntegrityCheck(baseId);
205211
const fixResults: IIntegrityIssue[] = [];
206-
207212
for (const issues of checkResult.linkFieldIssues) {
208213
for (const issue of issues.issues) {
209-
// eslint-disable-next-line sonarjs/no-small-switch
210214
switch (issue.type) {
211215
case IntegrityIssueType.MissingRecordReference: {
212216
const result = await this.foreignKeyIntegrityService.fix(
213217
issues.tableId,
214-
issues.fieldId
218+
issue.fieldId || issues.fieldId
215219
);
216220
result && fixResults.push(result);
217221
break;
218222
}
219223
case IntegrityIssueType.InvalidLinkReference: {
220-
const result = await this.linkFieldIntegrityService.fix(issues.tableId, issues.fieldId);
224+
const result = await this.linkFieldIntegrityService.fix(
225+
issues.tableId,
226+
issue.fieldId || issues.fieldId
227+
);
221228
result && fixResults.push(result);
222229
break;
223230
}

packages/openapi/src/integrity/link-check.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export enum IntegrityIssueType {
2020
export const integrityIssueSchema = z.object({
2121
type: z.nativeEnum(IntegrityIssueType),
2222
message: z.string(),
23+
fieldId: z.string().optional(),
2324
});
2425

2526
// Define the schema for a link field check item

0 commit comments

Comments
 (0)