Adding error to catch scenario that caused tests to fail - fixing cases of table metadata not aligning with entityId
This commit is contained in:
parent
828d78f2af
commit
a33c2599b5
|
@ -374,38 +374,44 @@ export class ExternalRequest<T extends Operation> {
|
|||
) {
|
||||
continue
|
||||
}
|
||||
let tableId: string | undefined,
|
||||
let relatedTableId: string | undefined,
|
||||
lookupField: string | undefined,
|
||||
fieldName: string | undefined
|
||||
if (isManyToMany(field)) {
|
||||
tableId = field.through
|
||||
relatedTableId = field.through
|
||||
lookupField = primaryKey
|
||||
fieldName = field.throughTo || primaryKey
|
||||
} else if (isManyToOne(field)) {
|
||||
tableId = field.tableId
|
||||
relatedTableId = field.tableId
|
||||
lookupField = field.foreignKey
|
||||
fieldName = field.fieldName
|
||||
}
|
||||
if (!tableId || !lookupField || !fieldName) {
|
||||
if (!relatedTableId || !lookupField || !fieldName) {
|
||||
throw new Error(
|
||||
"Unable to lookup relationships - undefined column properties."
|
||||
)
|
||||
}
|
||||
const { tableName: relatedTableName } = breakExternalTableId(tableId)
|
||||
const { tableName: relatedTableName } =
|
||||
breakExternalTableId(relatedTableId)
|
||||
// @ts-ignore
|
||||
const linkPrimaryKey = this.tables[relatedTableName].primary[0]
|
||||
if (!lookupField || !row[lookupField]) {
|
||||
continue
|
||||
}
|
||||
const endpoint = getEndpoint(relatedTableId, Operation.READ)
|
||||
const relatedTable = this.tables[endpoint.entityId]
|
||||
if (!relatedTable) {
|
||||
throw new Error("unable to find related table")
|
||||
}
|
||||
const response = await getDatasourceAndQuery({
|
||||
endpoint: getEndpoint(tableId, Operation.READ),
|
||||
endpoint: endpoint,
|
||||
filters: {
|
||||
equal: {
|
||||
[fieldName]: row[lookupField],
|
||||
},
|
||||
},
|
||||
meta: {
|
||||
table,
|
||||
table: relatedTable,
|
||||
},
|
||||
})
|
||||
// this is the response from knex if no rows found
|
||||
|
@ -414,7 +420,11 @@ export class ExternalRequest<T extends Operation> {
|
|||
const storeTo = isManyToMany(field)
|
||||
? field.throughFrom || linkPrimaryKey
|
||||
: fieldName
|
||||
related[storeTo] = { rows, isMany: isManyToMany(field), tableId }
|
||||
related[storeTo] = {
|
||||
rows,
|
||||
isMany: isManyToMany(field),
|
||||
tableId: relatedTableId,
|
||||
}
|
||||
}
|
||||
return related
|
||||
}
|
||||
|
@ -484,7 +494,7 @@ export class ExternalRequest<T extends Operation> {
|
|||
body,
|
||||
filters: buildFilters(id, {}, linkTable),
|
||||
meta: {
|
||||
table,
|
||||
table: linkTable,
|
||||
},
|
||||
})
|
||||
)
|
||||
|
|
|
@ -2,6 +2,7 @@ import {
|
|||
QueryJson,
|
||||
Datasource,
|
||||
DatasourcePlusQueryResponse,
|
||||
RowOperations,
|
||||
} from "@budibase/types"
|
||||
import { getIntegration } from "../index"
|
||||
import sdk from "../../sdk"
|
||||
|
@ -10,6 +11,17 @@ export async function makeExternalQuery(
|
|||
datasource: Datasource,
|
||||
json: QueryJson
|
||||
): Promise<DatasourcePlusQueryResponse> {
|
||||
const entityId = json.endpoint.entityId,
|
||||
tableName = json.meta.table.name,
|
||||
tableId = json.meta.table._id
|
||||
// case found during testing - make sure this doesn't happen again
|
||||
if (
|
||||
RowOperations.includes(json.endpoint.operation) &&
|
||||
entityId !== tableId &&
|
||||
entityId !== tableName
|
||||
) {
|
||||
throw new Error("Entity ID and table metadata do not align")
|
||||
}
|
||||
datasource = await sdk.datasources.enrich(datasource)
|
||||
const Integration = await getIntegration(datasource.source)
|
||||
// query is the opinionated function
|
||||
|
|
|
@ -14,6 +14,14 @@ export enum Operation {
|
|||
DELETE_TABLE = "DELETE_TABLE",
|
||||
}
|
||||
|
||||
export const RowOperations = [
|
||||
Operation.CREATE,
|
||||
Operation.READ,
|
||||
Operation.UPDATE,
|
||||
Operation.DELETE,
|
||||
Operation.BULK_CREATE,
|
||||
]
|
||||
|
||||
export enum SortDirection {
|
||||
ASCENDING = "ASCENDING",
|
||||
DESCENDING = "DESCENDING",
|
||||
|
|
Loading…
Reference in New Issue