Back

Step by Step Guide to Building a Dynamics 365 CRM API Integration in JS

Aug 2, 20245 minute read

Hey there, fellow developer! Ready to dive into the world of Dynamics 365 CRM API integration? Buckle up, because we're about to embark on a journey that'll have you integrating like a pro in no time. We'll be using the awesome dynamics-web-api package, so let's get started!

Prerequisites

Before we jump in, make sure you've got:

  • Node.js and npm (you're a dev, so I'm sure you've got this covered)
  • A Dynamics 365 CRM instance (if you don't have one, go grab a trial)
  • An application registered in Azure AD (trust me, it's easier than it sounds)

Setting Up the Project

First things first, let's get our project set up:

mkdir dynamics-crm-integration cd dynamics-crm-integration npm init -y npm install dynamics-web-api @azure/msal-node

Authentication

Now, let's tackle authentication. You'll need your client credentials from Azure AD. Here's a quick snippet to get you started:

const msal = require('@azure/msal-node'); const config = { auth: { clientId: 'YOUR_CLIENT_ID', authority: 'https://login.microsoftonline.com/YOUR_TENANT_ID', clientSecret: 'YOUR_CLIENT_SECRET' } }; const cca = new msal.ConfidentialClientApplication(config);

Initializing dynamics-web-api

Time to set up our DynamicsWebApi instance:

const DynamicsWebApi = require('dynamics-web-api'); const dynamicsWebApi = new DynamicsWebApi({ webApiUrl: 'https://your-org.crm.dynamics.com/api/data/v9.2/', onTokenRefresh: async (cb) => { const result = await cca.acquireTokenByClientCredential({ scopes: ['https://your-org.crm.dynamics.com/.default'] }); cb(result.accessToken); } });

Basic CRUD Operations

Let's get our hands dirty with some CRUD operations:

// Create const newAccount = { name: 'Contoso Ltd' }; const accountId = await dynamicsWebApi.create(newAccount, 'accounts'); // Retrieve const account = await dynamicsWebApi.retrieve(accountId, 'accounts', ['name', 'accountnumber']); // Update await dynamicsWebApi.update(accountId, { name: 'Contoso Corporation' }, 'accounts'); // Delete await dynamicsWebApi.deleteRecord(accountId, 'accounts');

Advanced Queries

Want to flex those querying muscles? Try these:

// Filtering const accounts = await dynamicsWebApi.retrieveMultiple('accounts', { filter: 'revenue gt 1000000', select: ['name', 'revenue'] }); // Expanding related entities const contact = await dynamicsWebApi.retrieve(contactId, 'contacts', { expand: [{ property: 'account' }] }); // Using FetchXML const fetchXml = `<fetch> <entity name="account"> <attribute name="name" /> <filter> <condition attribute="revenue" operator="gt" value="1000000" /> </filter> </entity> </fetch>`; const result = await dynamicsWebApi.fetch('accounts', fetchXml);

Error Handling and Best Practices

Don't forget to wrap your calls in try-catch blocks and respect those rate limits:

try { // Your API calls here } catch (error) { console.error('Oops! Something went wrong:', error); }

Testing the Integration

Last but not least, set up a test environment and write some unit tests. Your future self will thank you!

const assert = require('assert'); describe('Dynamics CRM Integration', () => { it('should create an account', async () => { const newAccount = { name: 'Test Account' }; const accountId = await dynamicsWebApi.create(newAccount, 'accounts'); assert(accountId, 'Account was not created'); }); // More tests... });

And there you have it! You're now equipped to build a robust Dynamics 365 CRM API integration. Remember, practice makes perfect, so don't be afraid to experiment and push the boundaries. Happy coding!