diff --git a/packages/nodes-base/nodes/Google/Contacts/ContactDescription.ts b/packages/nodes-base/nodes/Google/Contacts/ContactDescription.ts index f11dcbe07c15d..959a416590a0d 100644 --- a/packages/nodes-base/nodes/Google/Contacts/ContactDescription.ts +++ b/packages/nodes-base/nodes/Google/Contacts/ContactDescription.ts @@ -887,6 +887,43 @@ export const contactFields: INodeProperties[] = [ default: '', description: 'A field mask to restrict which fields on each person are returned. Multiple fields can be specified by separating them with commas.', }, + { + displayName: 'Use Query', + name: 'useQuery', + type: 'boolean', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + }, + }, + default: false, + description: `Whether or not to use a query to filter the results`, + }, + { + displayName: 'Query', + name: 'query', + type: 'string', + displayOptions: { + show: { + operation: [ + 'getAll', + ], + resource: [ + 'contact', + ], + useQuery: [ + true, + ], + }, + }, + default: '', + description: `The plain-text query for the request. The query is used to match prefix phrases of the fields on a person. For example, a person with name "foo name" matches queries such as "f", "fo", "foo", "foo n", "nam", etc., but not "oo n".`, + }, { displayName: 'RAW Data', name: 'rawData', @@ -918,6 +955,9 @@ export const contactFields: INodeProperties[] = [ resource: [ 'contact', ], + useQuery: [ + false, + ], }, }, options: [ diff --git a/packages/nodes-base/nodes/Google/Contacts/GoogleContacts.node.ts b/packages/nodes-base/nodes/Google/Contacts/GoogleContacts.node.ts index 7c794bd7af0e3..910c6baa07b42 100644 --- a/packages/nodes-base/nodes/Google/Contacts/GoogleContacts.node.ts +++ b/packages/nodes-base/nodes/Google/Contacts/GoogleContacts.node.ts @@ -24,6 +24,7 @@ import { } from './ContactDescription'; import * as moment from 'moment'; +import { IData } from '../Analytics/Interfaces'; export class GoogleContacts implements INodeType { description: INodeTypeDescription = { @@ -264,11 +265,19 @@ export class GoogleContacts implements INodeType { responseData.contactId = responseData.resourceName.split('/')[1]; } //https://developers.google.com/people/api/rest/v1/people.connections/list + //https://developers.google.com/people/api/rest/v1/people/searchContacts if (operation === 'getAll') { const returnAll = this.getNodeParameter('returnAll', i) as boolean; const fields = this.getNodeParameter('fields', i) as string[]; - const options = this.getNodeParameter('options', i) as IDataObject; + const options = this.getNodeParameter('options', i, {}) as IDataObject; const rawData = this.getNodeParameter('rawData', i) as boolean; + const useQuery = this.getNodeParameter('useQuery', i) as boolean; + + const endpoint = (useQuery) ? ':searchContacts' : '/me/connections'; + + if (useQuery) { + qs.query = this.getNodeParameter('query', i) as string; + } if (options.sortOrder) { qs.sortOrder = options.sortOrder as number; @@ -280,25 +289,35 @@ export class GoogleContacts implements INodeType { qs.personFields = (fields as string[]).join(','); } + if (useQuery) { + qs.readMask = qs.personFields; + delete qs.personFields; + } + if (returnAll) { responseData = await googleApiRequestAllItems.call( this, - 'connections', + (useQuery) ? 'results' : 'connections', 'GET', - `/people/me/connections`, + `/people${endpoint}`, {}, qs, ); + + if (useQuery) { + responseData = responseData.map((result: IDataObject) => result.person); + } + } else { qs.pageSize = this.getNodeParameter('limit', i) as number; responseData = await googleApiRequest.call( this, 'GET', - `/people/me/connections`, + `/people${endpoint}`, {}, qs, ); - responseData = responseData.connections; + responseData = responseData.connections || responseData.results.map((result: IDataObject) => result.person); } if (!rawData) {