Plumb Google Sheets table fetching error through to buildSchemaFromDb endpoint.

This commit is contained in:
Sam Rose 2023-10-12 12:07:13 +01:00
parent bda67b1aca
commit 6e1962e6ea
3 changed files with 33 additions and 4 deletions

View File

@ -79,7 +79,6 @@ async function buildSchemaHelper(datasource: Datasource) {
let error = null let error = null
if (errors && Object.keys(errors).length > 0) { if (errors && Object.keys(errors).length > 0) {
const noKey = getErrorTables(errors, BuildSchemaErrors.NO_KEY) const noKey = getErrorTables(errors, BuildSchemaErrors.NO_KEY)
const invalidCol = getErrorTables(errors, BuildSchemaErrors.INVALID_COLUMN)
if (noKey.length) { if (noKey.length) {
error = updateError( error = updateError(
error, error,
@ -87,6 +86,8 @@ async function buildSchemaHelper(datasource: Datasource) {
noKey noKey
) )
} }
const invalidCol = getErrorTables(errors, BuildSchemaErrors.INVALID_COLUMN)
if (invalidCol.length) { if (invalidCol.length) {
const invalidCols = Object.values(InvalidColumns).join(", ") const invalidCols = Object.values(InvalidColumns).join(", ")
error = updateError( error = updateError(
@ -95,6 +96,15 @@ async function buildSchemaHelper(datasource: Datasource) {
invalidCol invalidCol
) )
} }
const noHeader = getErrorTables(errors, BuildSchemaErrors.NO_HEADER_ROW)
if (noHeader.length) {
error = updateError(
error,
`No header row found in the following:`,
noHeader
)
}
} }
return { tables: connector.tables, error } return { tables: connector.tables, error }
} }

View File

@ -162,6 +162,7 @@ export enum InvalidColumns {
export enum BuildSchemaErrors { export enum BuildSchemaErrors {
NO_KEY = "no_key", NO_KEY = "no_key",
INVALID_COLUMN = "invalid_column", INVALID_COLUMN = "invalid_column",
NO_HEADER_ROW = "no_header_row",
} }
export enum AutomationErrors { export enum AutomationErrors {

View File

@ -21,7 +21,7 @@ import { GoogleSpreadsheet, GoogleSpreadsheetRow } from "google-spreadsheet"
import fetch from "node-fetch" import fetch from "node-fetch"
import { cache, configs, context, HTTPError } from "@budibase/backend-core" import { cache, configs, context, HTTPError } from "@budibase/backend-core"
import { dataFilters, utils } from "@budibase/shared-core" import { dataFilters, utils } from "@budibase/shared-core"
import { GOOGLE_SHEETS_PRIMARY_KEY } from "../constants" import { BuildSchemaErrors, GOOGLE_SHEETS_PRIMARY_KEY } from "../constants"
interface GoogleSheetsConfig { interface GoogleSheetsConfig {
spreadsheetId: string spreadsheetId: string
@ -289,11 +289,29 @@ class GoogleSheetsIntegration implements DatasourcePlus {
await this.connect() await this.connect()
const sheets = this.client.sheetsByIndex const sheets = this.client.sheetsByIndex
const tables: Record<string, ExternalTable> = {} const tables: Record<string, ExternalTable> = {}
const errors: Record<string, string> = {}
await utils.parallelForeach( await utils.parallelForeach(
sheets, sheets,
async sheet => { async sheet => {
// must fetch rows to determine schema // must fetch rows to determine schema
try {
await sheet.getRows() await sheet.getRows()
} catch (err) {
// We expect this to always be an Error so if it's not, rethrow it to
// make sure we don't fail quietly.
if (!(err instanceof Error)) {
throw err;
}
if (err.message.startsWith("No values in the header row")) {
errors[sheet.title] = BuildSchemaErrors.NO_HEADER_ROW
} else {
// If we get an error we don't have a BuildSchemaErrors enum variant
// for, rethrow to avoid failing quietly.
throw err;
}
return
}
const id = buildExternalTableId(datasourceId, sheet.title) const id = buildExternalTableId(datasourceId, sheet.title)
tables[sheet.title] = this.getTableSchema( tables[sheet.title] = this.getTableSchema(
@ -307,7 +325,7 @@ class GoogleSheetsIntegration implements DatasourcePlus {
) )
const final = finaliseExternalTables(tables, entities) const final = finaliseExternalTables(tables, entities)
this.tables = final.tables this.tables = final.tables
this.schemaErrors = final.errors this.schemaErrors = { ...final.errors, ...errors }
} }
async query(json: QueryJson) { async query(json: QueryJson) {