Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set new Hubspot granular scopes #2531

Merged
merged 5 commits into from
Dec 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,12 @@ import {
} from 'n8n-workflow';

const scopes = [
'contacts',
'crm.objects.contacts.read',
'crm.schemas.contacts.read',
'crm.objects.companies.read',
'crm.schemas.companies.read',
'crm.objects.deals.read',
'crm.schemas.deals.read',
];

export class HubspotDeveloperApi implements ICredentialType {
Expand Down
11 changes: 10 additions & 1 deletion packages/nodes-base/credentials/HubspotOAuth2Api.credentials.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,16 @@ import {
} from 'n8n-workflow';

const scopes = [
'contacts',
'crm.schemas.deals.read',
'crm.objects.owners.read',
'crm.objects.contacts.write',
'crm.objects.companies.write',
'crm.objects.companies.read',
'crm.objects.deals.read',
'crm.schemas.contacts.read',
'crm.objects.deals.write',
'crm.objects.contacts.read',
'crm.schemas.companies.read',
'forms',
'tickets',
];
Expand Down
12 changes: 8 additions & 4 deletions packages/nodes-base/nodes/Hubspot/GenericFunctions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,16 @@ export async function hubspotApiRequest(this: IHookFunctions | IExecuteFunctions

return await this.helpers.request!(options);
} else if (authenticationMethod === 'developerApi') {
const credentials = await this.getCredentials('hubspotDeveloperApi');
if (endpoint.includes('webhooks')) {

options.qs.hapikey = credentials!.apiKey as string;
return await this.helpers.request!(options);
const credentials = await this.getCredentials('hubspotDeveloperApi');
options.qs.hapikey = credentials!.apiKey as string;
return await this.helpers.request!(options);

} else {
return await this.helpers.requestOAuth2!.call(this, 'hubspotDeveloperApi', options, { tokenType: 'Bearer', includeCredentialsOnRefreshOnBody: true });
}
} else {
// @ts-ignore
return await this.helpers.requestOAuth2!.call(this, 'hubspotOAuth2Api', options, { tokenType: 'Bearer', includeCredentialsOnRefreshOnBody: true });
}
} catch (error) {
Expand Down
54 changes: 30 additions & 24 deletions packages/nodes-base/nodes/Hubspot/HubspotTrigger.node.ts
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,9 @@ export class HubspotTrigger implements INodeType {
name: 'property',
type: 'options',
typeOptions: {
loadOptionsDependsOn: [
'contact.propertyChange',
],
loadOptionsMethod: 'getContactProperties',
},
displayOptions: {
Expand All @@ -160,6 +163,9 @@ export class HubspotTrigger implements INodeType {
name: 'property',
type: 'options',
typeOptions: {
loadOptionsDependsOn: [
'company.propertyChange',
],
loadOptionsMethod: 'getCompanyProperties',
},
displayOptions: {
Expand All @@ -177,6 +183,9 @@ export class HubspotTrigger implements INodeType {
name: 'property',
type: 'options',
typeOptions: {
loadOptionsDependsOn: [
'deal.propertyChange',
],
loadOptionsMethod: 'getDealProperties',
},
displayOptions: {
Expand Down Expand Up @@ -220,51 +229,48 @@ export class HubspotTrigger implements INodeType {
// select them easily
async getContactProperties(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
for (const field of contactFields) {
const endpoint = '/properties/v2/contacts/properties';
const properties = await hubspotApiRequest.call(this, 'GET', endpoint, {});
for (const property of properties) {
const propertyName = property.label;
const propertyId = property.name;
returnData.push({
name: capitalCase(field.label),
value: field.id,
name: propertyName,
value: propertyId,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) { return -1; }
if (a.name > b.name) { return 1; }
return 0;
});
return returnData;
},
// Get all the available companies to display them to user so that he can
// select them easily
async getCompanyProperties(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
for (const field of companyFields) {
const endpoint = '/properties/v2/companies/properties';
const properties = await hubspotApiRequest.call(this, 'GET', endpoint, {});
for (const property of properties) {
const propertyName = property.label;
const propertyId = property.name;
returnData.push({
name: capitalCase(field.label),
value: field.id,
name: propertyName,
value: propertyId,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) { return -1; }
if (a.name > b.name) { return 1; }
return 0;
});
return returnData;
},
// Get all the available deals to display them to user so that he can
// select them easily
async getDealProperties(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
for (const field of dealFields) {
const endpoint = '/properties/v2/deals/properties';
const properties = await hubspotApiRequest.call(this, 'GET', endpoint, {});
for (const property of properties) {
const propertyName = property.label;
const propertyId = property.name;
returnData.push({
name: capitalCase(field.label),
value: field.id,
name: propertyName,
value: propertyId,
});
}
returnData.sort((a, b) => {
if (a.name < b.name) { return -1; }
if (a.name > b.name) { return 1; }
return 0;
});
return returnData;
},
},
Expand Down