Add salesforce custom objects and custom fields (#1061)

This commit is contained in:
Ricardo Espinoza
2020-10-16 04:27:09 -04:00
committed by GitHub
parent b40dec3e4a
commit 86d5681517
8 changed files with 1011 additions and 11 deletions

View File

@@ -52,6 +52,11 @@ import {
IContact,
} from './ContactInterface';
import {
customObjectFields,
customObjectOperations,
} from './CustomObjectDescription';
import {
flowFields,
flowOperations,
@@ -149,6 +154,11 @@ export class Salesforce implements INodeType {
value: 'contact',
description: 'Represents a contact, which is an individual associated with an account.',
},
{
name: 'Custom Object',
value: 'customObject',
description: 'Represents a custom object.',
},
{
name: 'Flow',
value: 'flow',
@@ -157,7 +167,7 @@ export class Salesforce implements INodeType {
{
name: 'Lead',
value: 'lead',
description: 'Represents a prospect or potential .',
description: 'Represents a prospect or potential.',
},
{
name: 'Opportunity',
@@ -182,6 +192,8 @@ export class Salesforce implements INodeType {
...leadFields,
...contactOperations,
...contactFields,
...customObjectOperations,
...customObjectFields,
...opportunityOperations,
...opportunityFields,
...accountOperations,
@@ -243,6 +255,13 @@ export class Salesforce implements INodeType {
const returnData: INodePropertyOptions[] = [];
// TODO: find a way to filter this object to get just the lead sources instead of the whole object
const { fields } = await salesforceApiRequest.call(this, 'GET', '/sobjects/lead/describe');
for (const aja of fields as IDataObject[]) {
if (aja.custom === true) {
console.log(aja);
}
}
for (const field of fields) {
if (field.name === 'LeadSource') {
for (const pickValue of field.picklistValues) {
@@ -257,6 +276,25 @@ export class Salesforce implements INodeType {
}
return returnData;
},
// Get all the lead custom fields to display them to user so that he can
// select them easily
async getLeadCustomFields(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
// TODO: find a way to filter this object to get just the lead sources instead of the whole object
const { fields } = await salesforceApiRequest.call(this, 'GET', '/sobjects/lead/describe');
for (const field of fields) {
if (field.custom === true) {
const fieldName = field.label;
const fieldId = field.name;
returnData.push({
name: fieldName,
value: fieldId,
});
}
}
return returnData;
},
// Get all the accounts to display them to user so that he can
// select them easily
async getAccounts(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
@@ -573,6 +611,43 @@ export class Salesforce implements INodeType {
}
return returnData;
},
// Get all the custom objects recurrence instances to display them to user so that he can
// select them easily
async getCustomObjects(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
// TODO: find a way to filter this object to get just the lead sources instead of the whole object
const { sobjects: objects } = await salesforceApiRequest.call(this, 'GET', '/sobjects');
for (const object of objects) {
if (object.custom === true) {
const objectName = object.label;
const objectId = object.name;
returnData.push({
name: objectName,
value: objectId,
});
}
}
return returnData;
},
// Get all the custom objects fields recurrence instances to display them to user so that he can
// select them easily
async getCustomObjectFields(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]> {
const returnData: INodePropertyOptions[] = [];
// TODO: find a way to filter this object to get just the lead sources instead of the whole object
const customObject = this.getCurrentNodeParameter('customObject') as string;
const { fields } = await salesforceApiRequest.call(this, 'GET', `/sobjects/${customObject}/describe`);
for (const field of fields) {
const fieldName = field.label;
const fieldId = field.name;
returnData.push({
name: fieldName,
value: fieldId,
});
}
return returnData;
},
},
};
@@ -658,6 +733,16 @@ export class Salesforce implements INodeType {
if (additionalFields.numberOfEmployees !== undefined) {
body.NumberOfEmployees = additionalFields.numberOfEmployees as number;
}
if (additionalFields.customFieldsUi) {
const customFields = (additionalFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'POST', '/sobjects/lead', body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Lead/patch-lead-id
@@ -737,6 +822,15 @@ export class Salesforce implements INodeType {
if (updateFields.numberOfEmployees !== undefined) {
body.NumberOfEmployees = updateFields.numberOfEmployees as number;
}
if (updateFields.customFieldsUi) {
const customFields = (updateFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'PATCH', `/sobjects/lead/${leadId}`, body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Lead/get-lead-id
@@ -912,6 +1006,15 @@ export class Salesforce implements INodeType {
if (additionalFields.emailBouncedReason !== undefined) {
body.EmailBouncedReason = additionalFields.emailBouncedReason as string;
}
if (additionalFields.customFieldsUi) {
const customFields = (additionalFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'POST', '/sobjects/contact', body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Contact/patch-contact-id
@@ -1012,6 +1115,15 @@ export class Salesforce implements INodeType {
if (updateFields.emailBouncedReason !== undefined) {
body.EmailBouncedReason = updateFields.emailBouncedReason as string;
}
if (updateFields.customFieldsUi) {
const customFields = (updateFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'PATCH', `/sobjects/contact/${contactId}`, body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Contact/get-contact-id
@@ -1089,6 +1201,74 @@ export class Salesforce implements INodeType {
responseData = await salesforceApiRequest.call(this, 'POST', '/sobjects/note', body);
}
}
if (resource === 'customObject') {
if (operation === 'create') {
const customObject = this.getNodeParameter('customObject', i) as string;
const customFieldsUi = this.getNodeParameter('customFieldsUi', i) as IDataObject;
const body: IDataObject = {};
if (customFieldsUi) {
const customFields = (customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'POST', `/sobjects/${customObject}`, body);
}
if (operation === 'update') {
const recordId = this.getNodeParameter('recordId', i) as string;
const customObject = this.getNodeParameter('customObject', i) as string;
const customFieldsUi = this.getNodeParameter('customFieldsUi', i) as IDataObject;
const body: IDataObject = {};
if (customFieldsUi) {
const customFields = (customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'PATCH', `/sobjects/${customObject}/${recordId}`, body);
}
if (operation === 'get') {
const customObject = this.getNodeParameter('customObject', i) as string;
const recordId = this.getNodeParameter('recordId', i) as string;
responseData = await salesforceApiRequest.call(this, 'GET', `/sobjects/${customObject}/${recordId}`);
}
if (operation === 'getAll') {
const customObject = this.getNodeParameter('customObject', i) as string;
const returnAll = this.getNodeParameter('returnAll', i) as boolean;
const options = this.getNodeParameter('options', i) as IDataObject;
let fields = ['id'];
if (options.fields) {
fields = options.fields as string[];
}
try {
if (returnAll) {
qs.q = `SELECT ${fields.join(',')} FROM ${customObject}`;
responseData = await salesforceApiRequestAllItems.call(this, 'records', 'GET', '/query', {}, qs);
} else {
const limit = this.getNodeParameter('limit', i) as number;
qs.q = `SELECT ${fields.join(',')} FROM ${customObject} Limit ${limit}`;
responseData = await salesforceApiRequestAllItems.call(this, 'records', 'GET', '/query', {}, qs);
}
} catch(err) {
throw new Error(`Salesforce Error: ${err}`);
}
}
if (operation === 'delete') {
const customObject = this.getNodeParameter('customObject', i) as string;
const recordId = this.getNodeParameter('recordId', i) as string;
try {
responseData = await salesforceApiRequest.call(this, 'DELETE', `/sobjects/${customObject}/${recordId}`);
} catch(err) {
throw new Error(`Salesforce Error: ${err}`);
}
}
}
if (resource === 'opportunity') {
//https://developer.salesforce.com/docs/api-explorer/sobject/Opportunity/post-opportunity
if (operation === 'create') {
@@ -1134,6 +1314,15 @@ export class Salesforce implements INodeType {
if (additionalFields.forecastCategoryName !== undefined) {
body.ForecastCategoryName = additionalFields.forecastCategoryName as string;
}
if (additionalFields.customFieldsUi) {
const customFields = (additionalFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'POST', '/sobjects/opportunity', body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Opportunity/post-opportunity
@@ -1183,6 +1372,15 @@ export class Salesforce implements INodeType {
if (updateFields.forecastCategoryName !== undefined) {
body.ForecastCategoryName = updateFields.forecastCategoryName as string;
}
if (updateFields.customFieldsUi) {
const customFields = (updateFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'PATCH', `/sobjects/opportunity/${opportunityId}`, body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Opportunity/get-opportunity-id
@@ -1326,6 +1524,15 @@ export class Salesforce implements INodeType {
if (additionalFields.shippingPostalCode !== undefined) {
body.ShippingPostalCode = additionalFields.shippingPostalCode as string;
}
if (additionalFields.customFieldsUi) {
const customFields = (additionalFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'POST', '/sobjects/account', body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Account/patch-account-id
@@ -1408,6 +1615,15 @@ export class Salesforce implements INodeType {
if (updateFields.shippingPostalCode !== undefined) {
body.ShippingPostalCode = updateFields.shippingPostalCode as string;
}
if (updateFields.customFieldsUi) {
const customFields = (updateFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'PATCH', `/sobjects/account/${accountId}`, body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Account/get-account-id
@@ -1708,6 +1924,15 @@ export class Salesforce implements INodeType {
if (additionalFields.recurrenceRegeneratedType !== undefined) {
body.RecurrenceRegeneratedType = additionalFields.recurrenceRegeneratedType as string;
}
if (additionalFields.customFieldsUi) {
const customFields = (additionalFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'POST', '/sobjects/task', body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Task/patch-task-id
@@ -1787,6 +2012,15 @@ export class Salesforce implements INodeType {
if (updateFields.recurrenceRegeneratedType !== undefined) {
body.RecurrenceRegeneratedType = updateFields.recurrenceRegeneratedType as string;
}
if (updateFields.customFieldsUi) {
const customFields = (updateFields.customFieldsUi as IDataObject).customFieldsValues as IDataObject[];
if (customFields) {
for (const customField of customFields) {
//@ts-ignore
body[customField.fieldId] = customField.value;
}
}
}
responseData = await salesforceApiRequest.call(this, 'PATCH', `/sobjects/task/${taskId}`, body);
}
//https://developer.salesforce.com/docs/api-explorer/sobject/Task/get-task-id