From 142ba47ff75c745d1c223f0dbc476ca583bec0e1 Mon Sep 17 00:00:00 2001 From: HBS999 Date: Mon, 17 Feb 2025 21:18:34 +0300 Subject: [PATCH] feat(Airtable Node): Add support for returnFieldsByFieldId parameter --- .../Airtable/test/v2/node/record/create.test.ts | 4 ++++ .../Airtable/test/v2/node/record/get.test.ts | 7 ++++++- .../Airtable/test/v2/node/record/search.test.ts | 8 +++++++- .../Airtable/test/v2/node/record/update.test.ts | 4 ++-- .../Airtable/v2/actions/common.descriptions.ts | 8 ++++++++ .../v2/actions/record/create.operation.ts | 1 + .../Airtable/v2/actions/record/get.operation.ts | 15 +++++++++++++-- .../v2/actions/record/search.operation.ts | 12 +++++++++++- .../v2/actions/record/update.operation.ts | 5 ++++- .../v2/actions/record/upsert.operation.ts | 1 + .../nodes/Airtable/v2/methods/resourceMapping.ts | 2 +- 11 files changed, 58 insertions(+), 9 deletions(-) diff --git a/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts b/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts index 3ca1da0576..3f3e76e868 100644 --- a/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts +++ b/packages/nodes-base/nodes/Airtable/test/v2/node/record/create.test.ts @@ -54,6 +54,7 @@ describe('Test AirtableV2, create operation', () => { ], }, options: { + returnFieldsByFieldId: true, typecast: true, ignoreFields: 'spam', }, @@ -89,6 +90,7 @@ describe('Test AirtableV2, create operation', () => { foo: 'foo 1', bar: 'bar 1', }, + returnFieldsByFieldId: true, typecast: true, }); expect(transport.apiRequest).toHaveBeenCalledWith('POST', 'appYoLbase/tblltable', { @@ -96,6 +98,7 @@ describe('Test AirtableV2, create operation', () => { foo: 'foo 2', bar: 'bar 2', }, + returnFieldsByFieldId: true, typecast: true, }); }); @@ -151,6 +154,7 @@ describe('Test AirtableV2, create operation', () => { foo: 'foo 1', bar: 'bar 1', }, + returnFieldsByFieldId: false, typecast: false, }); }); diff --git a/packages/nodes-base/nodes/Airtable/test/v2/node/record/get.test.ts b/packages/nodes-base/nodes/Airtable/test/v2/node/record/get.test.ts index a7726c5346..fbe5c03e8c 100644 --- a/packages/nodes-base/nodes/Airtable/test/v2/node/record/get.test.ts +++ b/packages/nodes-base/nodes/Airtable/test/v2/node/record/get.test.ts @@ -42,7 +42,12 @@ describe('Test AirtableV2, create operation', () => { ); expect(transport.apiRequest).toHaveBeenCalledTimes(1); - expect(transport.apiRequest).toHaveBeenCalledWith('GET', 'appYoLbase/tblltable/recXXX'); + expect(transport.apiRequest).toHaveBeenCalledWith( + 'GET', + 'appYoLbase/tblltable/recXXX', + {}, + { returnFieldsByFieldId: false }, + ); expect(responce).toEqual([ { diff --git a/packages/nodes-base/nodes/Airtable/test/v2/node/record/search.test.ts b/packages/nodes-base/nodes/Airtable/test/v2/node/record/search.test.ts index c3099248b1..a908dd7f2d 100644 --- a/packages/nodes-base/nodes/Airtable/test/v2/node/record/search.test.ts +++ b/packages/nodes-base/nodes/Airtable/test/v2/node/record/search.test.ts @@ -90,6 +90,7 @@ describe('Test AirtableV2, search operation', () => { { fields: ['foo', 'bar'], filterByFormula: 'foo', + returnFieldsByFieldId: false, sort: [{ direction: 'desc', field: 'bar' }], view: 'viwView', }, @@ -132,7 +133,12 @@ describe('Test AirtableV2, search operation', () => { 'GET', 'appYoLbase/tblltable', {}, - { fields: ['foo', 'bar'], filterByFormula: 'foo', maxRecords: 1 }, + { + fields: ['foo', 'bar'], + filterByFormula: 'foo', + maxRecords: 1, + returnFieldsByFieldId: false, + }, ); expect(result).toHaveLength(1); diff --git a/packages/nodes-base/nodes/Airtable/test/v2/node/record/update.test.ts b/packages/nodes-base/nodes/Airtable/test/v2/node/record/update.test.ts index 7887066401..932413be47 100644 --- a/packages/nodes-base/nodes/Airtable/test/v2/node/record/update.test.ts +++ b/packages/nodes-base/nodes/Airtable/test/v2/node/record/update.test.ts @@ -67,7 +67,7 @@ describe('Test AirtableV2, update operation', () => { expect(transport.batchUpdate).toHaveBeenCalledWith( 'appYoLbase/tblltable', - { typecast: false }, + { returnFieldsByFieldId: false, typecast: false }, [{ fields: { bar: 'bar 1', foo: 'foo 1' }, id: 'recXXX' }], ); }); @@ -101,7 +101,7 @@ describe('Test AirtableV2, update operation', () => { expect(transport.batchUpdate).toHaveBeenCalledWith( 'appYoLbase/tblltable', - { typecast: false }, + { returnFieldsByFieldId: false, typecast: false }, [{ fields: { bar: 'bar 1', foo: 'foo 1', id: 'recXXX' }, id: 'recXXX' }], ); }); diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/common.descriptions.ts b/packages/nodes-base/nodes/Airtable/v2/actions/common.descriptions.ts index 43a07d6961..37f057dbe8 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/common.descriptions.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/common.descriptions.ts @@ -202,6 +202,14 @@ export const insertUpdateOptions: INodeProperties[] = [ }, }, }, + { + displayName: 'Return Fields By Field ID', + name: 'returnFieldsByFieldId', + type: 'boolean', + default: false, + description: + 'Whether to return fields keyed by field ID instead of field name in the response', + }, ], }, ]; diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts b/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts index 2ae70b5d7d..5964bbaabd 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/record/create.operation.ts @@ -65,6 +65,7 @@ export async function execute( const options = this.getNodeParameter('options', i, {}); const body: IDataObject = { + returnFieldsByFieldId: options.returnFieldsByFieldId ? true : false, typecast: options.typecast ? true : false, }; diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/record/get.operation.ts b/packages/nodes-base/nodes/Airtable/v2/actions/record/get.operation.ts index 82a6edcc95..816473bc7c 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/record/get.operation.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/record/get.operation.ts @@ -44,6 +44,14 @@ const properties: INodeProperties[] = [ // eslint-disable-next-line n8n-nodes-base/node-param-description-wrong-for-dynamic-multi-options description: "The fields of type 'attachment' that should be downloaded", }, + { + displayName: 'Return Fields By Field ID', + name: 'returnFieldsByFieldId', + type: 'boolean', + default: false, + description: + 'Whether to return fields keyed by field ID instead of field name in the response', + }, ], }, ]; @@ -69,10 +77,13 @@ export async function execute( let id; try { id = this.getNodeParameter('id', i) as string; + const options = this.getNodeParameter('options', i, {}); - const responseData = await apiRequest.call(this, 'GET', `${base}/${table}/${id}`); + const query: IDataObject = { + returnFieldsByFieldId: options.returnFieldsByFieldId ? true : false, + }; - const options = this.getNodeParameter('options', 0, {}); + const responseData = await apiRequest.call(this, 'GET', `${base}/${table}/${id}`, {}, query); if (options.downloadFields) { const itemWithAttachments = await downloadRecordAttachments.call( diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/record/search.operation.ts b/packages/nodes-base/nodes/Airtable/v2/actions/record/search.operation.ts index 324a0d611d..f81ecf281b 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/record/search.operation.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/record/search.operation.ts @@ -80,6 +80,14 @@ const properties: INodeProperties[] = [ description: 'The fields you want to include in the output', }, viewRLC, + { + displayName: 'Return Fields By Field ID', + name: 'returnFieldsByFieldId', + type: 'boolean', + default: false, + description: + 'Whether to return fields keyed by field ID instead of field name in the response', + }, ], }, { @@ -169,7 +177,9 @@ export async function execute( const filterByFormula = this.getNodeParameter('filterByFormula', i) as string; const body: IDataObject = {}; - const qs: IDataObject = {}; + const qs: IDataObject = { + returnFieldsByFieldId: options.returnFieldsByFieldId ? true : false, + }; if (filterByFormula) { qs.filterByFormula = filterByFormula; diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/record/update.operation.ts b/packages/nodes-base/nodes/Airtable/v2/actions/record/update.operation.ts index de3a56ead8..c3bf8e1497 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/record/update.operation.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/record/update.operation.ts @@ -127,7 +127,10 @@ export async function execute( } } - const body: IDataObject = { typecast: options.typecast ? true : false }; + const body: IDataObject = { + returnFieldsByFieldId: options.returnFieldsByFieldId ? true : false, + typecast: options.typecast ? true : false, + }; const responseData = await batchUpdate.call(this, endpoint, body, records); diff --git a/packages/nodes-base/nodes/Airtable/v2/actions/record/upsert.operation.ts b/packages/nodes-base/nodes/Airtable/v2/actions/record/upsert.operation.ts index 0bc0c28cac..1fa96b13fe 100644 --- a/packages/nodes-base/nodes/Airtable/v2/actions/record/upsert.operation.ts +++ b/packages/nodes-base/nodes/Airtable/v2/actions/record/upsert.operation.ts @@ -94,6 +94,7 @@ export async function execute( } const body: IDataObject = { + returnFieldsByFieldId: options.returnFieldsByFieldId ? true : false, typecast: options.typecast ? true : false, }; diff --git a/packages/nodes-base/nodes/Airtable/v2/methods/resourceMapping.ts b/packages/nodes-base/nodes/Airtable/v2/methods/resourceMapping.ts index c0d4934c3b..d1a7089b09 100644 --- a/packages/nodes-base/nodes/Airtable/v2/methods/resourceMapping.ts +++ b/packages/nodes-base/nodes/Airtable/v2/methods/resourceMapping.ts @@ -101,7 +101,7 @@ export async function getColumns(this: ILoadOptionsFunctions): Promise