Fixing a variety of issues with internal relationships and external SQL relationships.
This commit is contained in:
parent
05ec5dc70c
commit
7624390f0b
|
@ -199,6 +199,9 @@
|
||||||
delete datasource.entities[toTable.name].schema[originalToName]
|
delete datasource.entities[toTable.name].schema[originalToName]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// store the original names so it won't cause an error
|
||||||
|
originalToName = toRelationship.name
|
||||||
|
originalFromName = fromRelationship.name
|
||||||
await save()
|
await save()
|
||||||
await tables.fetch()
|
await tables.fetch()
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,10 +25,10 @@ interface ManyRelationship {
|
||||||
|
|
||||||
interface RunConfig {
|
interface RunConfig {
|
||||||
id: string
|
id: string
|
||||||
row: Row
|
|
||||||
filters: SearchFilters
|
filters: SearchFilters
|
||||||
sort: SortJson
|
sort: SortJson
|
||||||
paginate: PaginationJson
|
paginate: PaginationJson
|
||||||
|
row: Row
|
||||||
}
|
}
|
||||||
|
|
||||||
module External {
|
module External {
|
||||||
|
@ -89,8 +89,9 @@ module External {
|
||||||
// build id array
|
// build id array
|
||||||
let idParts = []
|
let idParts = []
|
||||||
for (let field of primary) {
|
for (let field of primary) {
|
||||||
if (row[field]) {
|
const fieldValue = row[`${table.name}.${field}`]
|
||||||
idParts.push(row[field])
|
if (fieldValue) {
|
||||||
|
idParts.push(fieldValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (idParts.length === 0) {
|
if (idParts.length === 0) {
|
||||||
|
@ -115,7 +116,11 @@ module External {
|
||||||
const thisRow: { [key: string]: any } = {}
|
const thisRow: { [key: string]: any } = {}
|
||||||
// filter the row down to what is actually the row (not joined)
|
// filter the row down to what is actually the row (not joined)
|
||||||
for (let fieldName of Object.keys(table.schema)) {
|
for (let fieldName of Object.keys(table.schema)) {
|
||||||
thisRow[fieldName] = row[fieldName]
|
const value = row[`${table.name}.${fieldName}`]
|
||||||
|
// all responses include "select col as table.col" so that overlaps are handled
|
||||||
|
if (value) {
|
||||||
|
thisRow[fieldName] = value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
thisRow._id = generateIdForRow(row, table)
|
thisRow._id = generateIdForRow(row, table)
|
||||||
thisRow.tableId = table._id
|
thisRow.tableId = table._id
|
||||||
|
@ -191,7 +196,7 @@ module External {
|
||||||
const isUpdate = !field.through
|
const isUpdate = !field.through
|
||||||
const thisKey: string = isUpdate ? "id" : linkTablePrimary
|
const thisKey: string = isUpdate ? "id" : linkTablePrimary
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const otherKey: string = isUpdate ? field.foreignKey : tablePrimary
|
const otherKey: string = isUpdate ? field.fieldName : tablePrimary
|
||||||
row[key].map((relationship: any) => {
|
row[key].map((relationship: any) => {
|
||||||
// we don't really support composite keys for relationships, this is why [0] is used
|
// we don't really support composite keys for relationships, this is why [0] is used
|
||||||
manyRelationships.push({
|
manyRelationships.push({
|
||||||
|
@ -442,7 +447,7 @@ module External {
|
||||||
.filter(
|
.filter(
|
||||||
column =>
|
column =>
|
||||||
column[1].type !== FieldTypes.LINK &&
|
column[1].type !== FieldTypes.LINK &&
|
||||||
!existing.find((field: string) => field.includes(column[0]))
|
!existing.find((field: string) => field === column[0])
|
||||||
)
|
)
|
||||||
.map(column => `${table.name}.${column[0]}`)
|
.map(column => `${table.name}.${column[0]}`)
|
||||||
}
|
}
|
||||||
|
|
|
@ -322,7 +322,7 @@ class LinkController {
|
||||||
// remove schema from other table
|
// remove schema from other table
|
||||||
let linkedTable = await this._db.get(field.tableId)
|
let linkedTable = await this._db.get(field.tableId)
|
||||||
delete linkedTable.schema[field.fieldName]
|
delete linkedTable.schema[field.fieldName]
|
||||||
this._db.put(linkedTable)
|
await this._db.put(linkedTable)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -151,7 +151,7 @@ function buildRead(knex: Knex, json: QueryJson, limit: number): KnexQuery {
|
||||||
}
|
}
|
||||||
// handle select
|
// handle select
|
||||||
if (resource.fields && resource.fields.length > 0) {
|
if (resource.fields && resource.fields.length > 0) {
|
||||||
query = query.select(resource.fields)
|
query = query.select(resource.fields.map(field => `${field} as ${field}`))
|
||||||
} else {
|
} else {
|
||||||
query = query.select("*")
|
query = query.select("*")
|
||||||
}
|
}
|
||||||
|
|
|
@ -242,7 +242,7 @@ module MySQLModule {
|
||||||
const input = this._query(json, { disableReturning: true })
|
const input = this._query(json, { disableReturning: true })
|
||||||
let row
|
let row
|
||||||
// need to manage returning, a feature mySQL can't do
|
// need to manage returning, a feature mySQL can't do
|
||||||
if (operation === "awdawd") {
|
if (operation === operation.DELETE) {
|
||||||
row = this.getReturningRow(json)
|
row = this.getReturningRow(json)
|
||||||
}
|
}
|
||||||
const results = await internalQuery(this.client, input, false)
|
const results = await internalQuery(this.client, input, false)
|
||||||
|
|
|
@ -40,8 +40,13 @@ export function breakRowIdField(_id: string): any[] {
|
||||||
// have to replace on the way back as we swapped out the double quotes
|
// have to replace on the way back as we swapped out the double quotes
|
||||||
// when encoding, but JSON can't handle the single quotes
|
// when encoding, but JSON can't handle the single quotes
|
||||||
const decoded: string = decodeURIComponent(_id).replace(/'/g, '"')
|
const decoded: string = decodeURIComponent(_id).replace(/'/g, '"')
|
||||||
|
try {
|
||||||
const parsed = JSON.parse(decoded)
|
const parsed = JSON.parse(decoded)
|
||||||
return Array.isArray(parsed) ? parsed : [parsed]
|
return Array.isArray(parsed) ? parsed : [parsed]
|
||||||
|
} catch (err) {
|
||||||
|
// wasn't json - likely was handlebars for a many to many
|
||||||
|
return [_id]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function convertType(type: string, map: { [key: string]: any }) {
|
export function convertType(type: string, map: { [key: string]: any }) {
|
||||||
|
|
Loading…
Reference in New Issue