table management functions
This commit is contained in:
parent
d977ec3b7b
commit
5538f5ff6f
|
@ -10,6 +10,7 @@ import { Row, Table, TableSchema } from "../definitions/common"
|
||||||
import { buildExternalTableId } from "./utils"
|
import { buildExternalTableId } from "./utils"
|
||||||
import { DataSourceOperation, FieldTypes } from "../constants"
|
import { DataSourceOperation, FieldTypes } from "../constants"
|
||||||
import { GoogleSpreadsheet } from "google-spreadsheet"
|
import { GoogleSpreadsheet } from "google-spreadsheet"
|
||||||
|
import { table } from "console"
|
||||||
|
|
||||||
module GoogleSheetsModule {
|
module GoogleSheetsModule {
|
||||||
const { getGlobalDB } = require("@budibase/backend-core/tenancy")
|
const { getGlobalDB } = require("@budibase/backend-core/tenancy")
|
||||||
|
@ -116,6 +117,9 @@ module GoogleSheetsModule {
|
||||||
* @returns spreadsheet Id of the google sheet
|
* @returns spreadsheet Id of the google sheet
|
||||||
*/
|
*/
|
||||||
cleanSpreadsheetUrl(spreadsheetId: string) {
|
cleanSpreadsheetUrl(spreadsheetId: string) {
|
||||||
|
if (!spreadsheetId) {
|
||||||
|
throw new Error("You must set a spreadsheet ID in your configuration to fetch tables.")
|
||||||
|
}
|
||||||
const parts = spreadsheetId.split("/")
|
const parts = spreadsheetId.split("/")
|
||||||
return parts.length > 5 ? parts[5] : spreadsheetId
|
return parts.length > 5 ? parts[5] : spreadsheetId
|
||||||
}
|
}
|
||||||
|
@ -174,33 +178,28 @@ module GoogleSheetsModule {
|
||||||
async query(json: QueryJson) {
|
async query(json: QueryJson) {
|
||||||
const sheet = json.endpoint.entityId
|
const sheet = json.endpoint.entityId
|
||||||
|
|
||||||
if (json.endpoint.operation === DataSourceOperation.CREATE) {
|
const handlers = {
|
||||||
return await this.create({
|
[DataSourceOperation.CREATE]: () => this.create({ sheet, row: json.body }),
|
||||||
sheet,
|
[DataSourceOperation.READ]: () => this.read({ sheet }),
|
||||||
row: json.body,
|
[DataSourceOperation.UPDATE]: () => this.update({
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (json.endpoint.operation === DataSourceOperation.READ) {
|
|
||||||
return await this.read({ sheet })
|
|
||||||
}
|
|
||||||
|
|
||||||
if (json.endpoint.operation === DataSourceOperation.UPDATE) {
|
|
||||||
return await this.update({
|
|
||||||
// exclude the header row and zero index
|
// exclude the header row and zero index
|
||||||
rowIndex: json.extra?.idFilter?.equal?.rowNumber - 2,
|
rowIndex: json.extra?.idFilter?.equal?.rowNumber - 2,
|
||||||
sheet,
|
sheet,
|
||||||
row: json.body,
|
row: json.body,
|
||||||
})
|
}),
|
||||||
}
|
[DataSourceOperation.DELETE]: () => this.delete({
|
||||||
|
|
||||||
if (json.endpoint.operation === DataSourceOperation.DELETE) {
|
|
||||||
return await this.delete({
|
|
||||||
// exclude the header row and zero index
|
// exclude the header row and zero index
|
||||||
rowIndex: json.extra?.idFilter?.equal?.rowNumber - 2,
|
rowIndex: json.extra?.idFilter?.equal?.rowNumber - 2,
|
||||||
sheet,
|
sheet,
|
||||||
})
|
}),
|
||||||
|
[DataSourceOperation.CREATE_TABLE]: () => this.createTable(json?.table?.name),
|
||||||
|
[DataSourceOperation.UPDATE_TABLE]: () => this.updateTable(json.table),
|
||||||
|
[DataSourceOperation.DELETE_TABLE]: () => this.deleteTable(json?.table?.name),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const internalQueryMethod = handlers[json.endpoint.operation]
|
||||||
|
|
||||||
|
return await internalQueryMethod()
|
||||||
}
|
}
|
||||||
|
|
||||||
buildRowObject(headers: string[], values: string[], rowNumber: number) {
|
buildRowObject(headers: string[], values: string[], rowNumber: number) {
|
||||||
|
@ -212,6 +211,54 @@ module GoogleSheetsModule {
|
||||||
return rowObject
|
return rowObject
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async createTable(name?: string) {
|
||||||
|
try {
|
||||||
|
await this.connect()
|
||||||
|
const sheet = await this.client.addSheet({ title: name });
|
||||||
|
return sheet
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error creating new table in google sheets", err)
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async updateTable(table?: any) {
|
||||||
|
try {
|
||||||
|
await this.connect()
|
||||||
|
const sheet = await this.client.sheetsByTitle[table.name]
|
||||||
|
await sheet.loadHeaderRow()
|
||||||
|
|
||||||
|
if (table._rename) {
|
||||||
|
const headers = []
|
||||||
|
for (let header of sheet.headerValues) {
|
||||||
|
if (header === table._rename.old) {
|
||||||
|
headers.push(table._rename.updated)
|
||||||
|
} else {
|
||||||
|
headers.push(header)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await sheet.setHeaderRow(headers)
|
||||||
|
} else {
|
||||||
|
let newField = Object.keys(table.schema).find(key => !sheet.headerValues.includes(key))
|
||||||
|
await sheet.setHeaderRow([...sheet.headerValues, newField])
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error updating table in google sheets", err)
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async deleteTable(query: any) {
|
||||||
|
try {
|
||||||
|
await this.connect()
|
||||||
|
const sheet = await this.client.sheetsByTitle[query.sheet]
|
||||||
|
return await sheet.delete()
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Error deleting table in google sheets", err)
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async create(query: { sheet: string; row: any }) {
|
async create(query: { sheet: string; row: any }) {
|
||||||
try {
|
try {
|
||||||
await this.connect()
|
await this.connect()
|
||||||
|
|
Loading…
Reference in New Issue