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 83e5f246f2..c9fdf49c0d 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', }, @@ -136,7 +137,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 ae698d8a7a..235924f123 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', + }, ], }, { @@ -172,7 +180,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