mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
⚡ Add salesforce custom objects and custom fields (#1061)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user