From 2ae8ecf2da8503ad27725181b9b151953fd2e55c Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:47:58 +0000 Subject: [PATCH 1/2] Allow errors and special values on field set --- integrations/airtable/src/base.ts | 10 +++++ integrations/airtable/src/types.ts | 13 ++++++- references/job-catalog/src/airtable.ts | 51 +++++++++++++++++++++++++- 3 files changed, 72 insertions(+), 2 deletions(-) diff --git a/integrations/airtable/src/base.ts b/integrations/airtable/src/base.ts index b354bc136c2..858bbf84ee9 100644 --- a/integrations/airtable/src/base.ts +++ b/integrations/airtable/src/base.ts @@ -38,6 +38,8 @@ export class Table { async (client) => { const result = await client .base(this.baseId) + // official types are wrong - we need to use our extended AirtableFieldSet here + // @ts-ignore .table(this.tableName) .select(params) .all(); @@ -55,6 +57,8 @@ export class Table { return this.runTask( key, async (client) => { + // official types are wrong - we need to use our extended AirtableFieldSet here + // @ts-ignore const result = await client.base(this.baseId).table(this.tableName).find(recordId); return toSerializableRecord(result); }, @@ -75,6 +79,8 @@ export class Table { async (client) => { const result = await client .base(this.baseId) + // official types are wrong - we need to use our extended AirtableFieldSet here + // @ts-ignore .table(this.tableName) .create(records); return result.map((record) => toSerializableRecord(record)); @@ -96,6 +102,8 @@ export class Table { async (client) => { const result = await client .base(this.baseId) + // official types are wrong - we need to use our extended AirtableFieldSet here + // @ts-ignore .table(this.tableName) .update(records); return result.map((record) => toSerializableRecord(record)); @@ -117,6 +125,8 @@ export class Table { async (client) => { const result = await client .base(this.baseId) + // official types are wrong - we need to use our extended AirtableFieldSet here + // @ts-ignore .table(this.tableName) .destroy(recordIds); return result.map((record) => toSerializableRecord(record)); diff --git a/integrations/airtable/src/types.ts b/integrations/airtable/src/types.ts index 8e917b72c56..b108326c1e7 100644 --- a/integrations/airtable/src/types.ts +++ b/integrations/airtable/src/types.ts @@ -9,7 +9,8 @@ export type AirtableFieldSet = { | Collaborator | Collaborator[] | string[] - | Attachment[]; + | Attachment[] + | Formula; }; export type Collaborator = { @@ -31,6 +32,16 @@ export type Attachment = { }; }; +export type FormulaError = { + error: string; +}; + +export type FormulaSpecialValue = { + specialValue: "Infinity" | "NaN"; +}; + +export type Formula = string | number | FormulaError | FormulaSpecialValue; + export type Thumbnail = { url: string; width: number; diff --git a/references/job-catalog/src/airtable.ts b/references/job-catalog/src/airtable.ts index 703046bf3ee..6016a77c317 100644 --- a/references/job-catalog/src/airtable.ts +++ b/references/job-catalog/src/airtable.ts @@ -1,7 +1,7 @@ import { TriggerClient, eventTrigger } from "@trigger.dev/sdk"; import { createExpressServer } from "@trigger.dev/express"; import { z } from "zod"; -import { Airtable, Collaborator } from "@trigger.dev/airtable"; +import { Airtable, Collaborator, Formula } from "@trigger.dev/airtable"; export const client = new TriggerClient({ id: "job-catalog", @@ -77,6 +77,55 @@ client.defineJob({ }, }); +type Formulas = { + ValueOne?: number; + ValueTwo?: number; + Division: Formula; // ValueOne / ValueTwo +}; + +client.defineJob({ + id: "airtable-formulas", + name: "Airtable Formulas", + version: "0.1.0", + trigger: eventTrigger({ + name: "airtable.formulas", + schema: z.object({ + baseId: z.string(), + tableName: z.string(), + }), + }), + integrations: { + airtable, + }, + run: async (payload, io, ctx) => { + const table = io.airtable.base(payload.baseId).table(payload.tableName); + + const records = await table.getRecords("muliple records", { + fields: ["ValueOne", "ValueTwo", "Division"], + }); + + const divisionField = records[0].fields.Division; + + if (typeof divisionField !== "object") { + return records; + } + + if ("specialValue" in divisionField) { + await io.logger.log( + `Special value: ${divisionField.specialValue}${ + divisionField.specialValue === "Infinity" ? " - did you divide by zero?" : "" + }` + ); + } else if ("error" in divisionField) { + await io.logger.error(`Error: ${divisionField.error}`); + } else { + await io.logger.warn("Unknown formula value!"); + } + + return divisionField; + }, +}); + //todo webhooks require batch support // client.defineJob({ // id: "airtable-delete-webhooks", From 5d31c277609e4cf3d32f5f681e84c7d876c15927 Mon Sep 17 00:00:00 2001 From: nicktrn <55853254+nicktrn@users.noreply.github.com> Date: Sat, 28 Oct 2023 12:51:59 +0000 Subject: [PATCH 2/2] Add changeset --- .changeset/silent-snails-float.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silent-snails-float.md diff --git a/.changeset/silent-snails-float.md b/.changeset/silent-snails-float.md new file mode 100644 index 00000000000..003bac8699e --- /dev/null +++ b/.changeset/silent-snails-float.md @@ -0,0 +1,5 @@ +--- +"@trigger.dev/airtable": patch +--- + +Extend the Airtable field set to accept formula errors and special values