140 lines
3.2 KiB
TypeScript
140 lines
3.2 KiB
TypeScript
|
import { Integration, DatasourceFieldTypes, QueryTypes } from "./base/definitions"
|
||
|
|
||
|
module AirtableModule {
|
||
|
const Airtable = require("airtable")
|
||
|
|
||
|
interface AirtableConfig {
|
||
|
apiKey: string
|
||
|
base: string
|
||
|
}
|
||
|
|
||
|
const SCHEMA: Integration = {
|
||
|
docs: "https://airtable.com/api",
|
||
|
description:
|
||
|
"Airtable is a spreadsheet-database hybrid, with the features of a database but applied to a spreadsheet.",
|
||
|
friendlyName: "Airtable",
|
||
|
datasource: {
|
||
|
apiKey: {
|
||
|
type: DatasourceFieldTypes.PASSWORD,
|
||
|
default: "enter api key",
|
||
|
required: true,
|
||
|
},
|
||
|
base: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
default: "mybase",
|
||
|
required: true,
|
||
|
},
|
||
|
},
|
||
|
query: {
|
||
|
create: {
|
||
|
type: QueryTypes.FIELDS,
|
||
|
customisable: true,
|
||
|
fields: {
|
||
|
table: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
required: true,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
read: {
|
||
|
type: QueryTypes.FIELDS,
|
||
|
fields: {
|
||
|
table: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
required: true,
|
||
|
},
|
||
|
view: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
required: true,
|
||
|
},
|
||
|
numRecords: {
|
||
|
type: DatasourceFieldTypes.NUMBER,
|
||
|
default: 10,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
update: {
|
||
|
type: QueryTypes.FIELDS,
|
||
|
customisable: true,
|
||
|
fields: {
|
||
|
id: {
|
||
|
type: DatasourceFieldTypes.STRING,
|
||
|
required: true,
|
||
|
},
|
||
|
},
|
||
|
},
|
||
|
delete: {
|
||
|
type: QueryTypes.JSON,
|
||
|
},
|
||
|
},
|
||
|
}
|
||
|
|
||
|
class AirtableIntegration {
|
||
|
private config: AirtableConfig
|
||
|
private client: any
|
||
|
|
||
|
constructor(config: AirtableConfig) {
|
||
|
this.config = config
|
||
|
this.client = new Airtable(config).base(config.base)
|
||
|
}
|
||
|
|
||
|
async create(query: { table: any; json: any }) {
|
||
|
const { table, json } = query
|
||
|
|
||
|
try {
|
||
|
return await this.client(table).create([
|
||
|
{
|
||
|
fields: json,
|
||
|
},
|
||
|
])
|
||
|
} catch (err) {
|
||
|
console.error("Error writing to airtable", err)
|
||
|
throw err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async read(query: { table: any; numRecords: any; view: any }) {
|
||
|
try {
|
||
|
const records = await this.client(query.table)
|
||
|
.select({ maxRecords: query.numRecords || 10, view: query.view })
|
||
|
.firstPage()
|
||
|
// @ts-ignore
|
||
|
return records.map(({ fields }) => fields)
|
||
|
} catch (err) {
|
||
|
console.error("Error writing to airtable", err)
|
||
|
return []
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async update(query: { table: any; id: any; json: any }) {
|
||
|
const { table, id, json } = query
|
||
|
|
||
|
try {
|
||
|
return await this.client(table).update([
|
||
|
{
|
||
|
id,
|
||
|
fields: json,
|
||
|
},
|
||
|
])
|
||
|
} catch (err) {
|
||
|
console.error("Error writing to airtable", err)
|
||
|
throw err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async delete(query: { table: any; ids: any }) {
|
||
|
try {
|
||
|
return await this.client(query.table).destroy(query.ids)
|
||
|
} catch (err) {
|
||
|
console.error("Error writing to airtable", err)
|
||
|
throw err
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
schema: SCHEMA,
|
||
|
integration: AirtableIntegration,
|
||
|
}
|
||
|
}
|