diff --git a/packages/builder/src/components/backend/DataTable/formula.js b/packages/builder/src/components/backend/DataTable/formula.js index 42f203ca1c..ea024cdf81 100644 --- a/packages/builder/src/components/backend/DataTable/formula.js +++ b/packages/builder/src/components/backend/DataTable/formula.js @@ -60,6 +60,7 @@ export function getBindings({ ) const label = path == null ? column : `${path}.0.${column}` + const binding = path == null ? `[${column}]` : `${path}.0.[${column}]` // only supply a description for relationship paths const description = path == null @@ -73,8 +74,8 @@ export function getBindings({ description, // don't include path, it messes things up, relationship path // will be replaced by the main array binding - readableBinding: column, - runtimeBinding: `[${column}]`, + readableBinding: label, + runtimeBinding: binding, }) } return bindings diff --git a/packages/server/src/api/controllers/row/ExternalRequest.ts b/packages/server/src/api/controllers/row/ExternalRequest.ts index c109a43afa..1465f20ac8 100644 --- a/packages/server/src/api/controllers/row/ExternalRequest.ts +++ b/packages/server/src/api/controllers/row/ExternalRequest.ts @@ -323,6 +323,28 @@ module External { return { row: newRow, manyRelationships } } + squashRelationshipColumns( + table: Table, + row: Row, + relationships: RelationshipsJson[] + ): Row { + for (let relationship of relationships) { + const linkedTable = this.tables[relationship.tableName] + if (!linkedTable) { + continue + } + const display = linkedTable.primaryDisplay + for (let key of Object.keys(row[relationship.column])) { + const related: Row = row[relationship.column][key] + row[relationship.column][key] = { + primaryDisplay: display ? related[display] : undefined, + _id: related._id, + } + } + } + return row + } + /** * This iterates through the returned rows and works out what elements of the rows * actually match up to another row (based on primary keys) - this is pretty specific @@ -354,12 +376,6 @@ module External { if (!linked._id) { continue } - // if not returning full docs then get the minimal links out - const display = linkedTable.primaryDisplay - linked = { - primaryDisplay: display ? linked[display] : undefined, - _id: linked._id, - } columns[relationship.column] = linked } for (let [column, related] of Object.entries(columns)) { @@ -417,7 +433,9 @@ module External { relationships ) } - return processFormulas(table, Object.values(finalRows)) + return processFormulas(table, Object.values(finalRows)).map((row: Row) => + this.squashRelationshipColumns(table, row, relationships) + ) } /** diff --git a/packages/server/src/integrations/mysql.ts b/packages/server/src/integrations/mysql.ts index 6efcdf53de..065a1b2333 100644 --- a/packages/server/src/integrations/mysql.ts +++ b/packages/server/src/integrations/mysql.ts @@ -27,7 +27,8 @@ module MySQLModule { user: string password: string database: string - ssl?: object + ssl?: { [key: string]: any } + rejectUnauthorized: boolean } const SCHEMA: Integration = { @@ -65,6 +66,11 @@ module MySQLModule { type: DatasourceFieldTypes.OBJECT, required: false, }, + rejectUnauthorized: { + type: DatasourceFieldTypes.BOOLEAN, + default: true, + required: false, + }, }, query: { create: { @@ -114,6 +120,16 @@ module MySQLModule { if (config.ssl && Object.keys(config.ssl).length === 0) { delete config.ssl } + // make sure this defaults to true + if ( + config.rejectUnauthorized != null && + !config.rejectUnauthorized && + config.ssl + ) { + config.ssl.rejectUnauthorized = config.rejectUnauthorized + } + // @ts-ignore + delete config.rejectUnauthorized this.config = config }