Back

Step by Step Guide to Building a Odoo CRM API Integration in JS

Aug 18, 20248 minute read

Introduction

Hey there, fellow developer! Ready to dive into the world of Odoo CRM API integration? You're in for a treat. Odoo CRM is a powerful tool, and its API opens up a whole new realm of possibilities. In this guide, we'll walk through the process of building a robust integration using JavaScript. Let's get cracking!

Prerequisites

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

  • An Odoo instance up and running
  • API access and authentication details
  • Your favorite JS libraries or frameworks at the ready

Got all that? Great! Let's move on.

Setting up the Development Environment

First things first, let's get our project structure sorted. Create a new directory for your project and initialize it with npm:

mkdir odoo-crm-integration cd odoo-crm-integration npm init -y

Now, let's install the dependencies we'll need:

npm install axios dotenv

We'll use axios for making HTTP requests and dotenv for managing environment variables. Easy peasy!

Authentication

Alright, time to get our hands dirty with authentication. Head over to your Odoo instance and generate those API keys. Once you've got them, create a .env file in your project root and add your credentials:

ODOO_URL=https://your-odoo-instance.com
ODOO_DB=your_database
ODOO_USERNAME=your_username
ODOO_PASSWORD=your_api_key

Now, let's create a simple authentication function:

require('dotenv').config(); const axios = require('axios'); async function authenticate() { try { const response = await axios.post(`${process.env.ODOO_URL}/web/session/authenticate`, { jsonrpc: "2.0", params: { db: process.env.ODOO_DB, login: process.env.ODOO_USERNAME, password: process.env.ODOO_PASSWORD } }); return response.data.result.session_id; } catch (error) { console.error('Authentication failed:', error); } }

Basic API Operations

Now that we're authenticated, let's dive into some CRUD operations. Here's a quick example of how to fetch CRM leads:

async function getLeads() { const sessionId = await authenticate(); try { const response = await axios.post(`${process.env.ODOO_URL}/web/dataset/call_kw`, { jsonrpc: "2.0", method: "call", params: { model: "crm.lead", method: "search_read", args: [[]], kwargs: { fields: ["name", "email_from", "phone"], limit: 10 } } }, { headers: { 'Cookie': `session_id=${sessionId}` } }); return response.data.result; } catch (error) { console.error('Failed to fetch leads:', error); } }

Creating, updating, and deleting records follow a similar pattern. Just change the method and params accordingly.

Advanced API Usage

Want to get fancy? Let's add some filtering and pagination:

async function searchLeads(query, page = 1, limit = 10) { const sessionId = await authenticate(); try { const offset = (page - 1) * limit; const response = await axios.post(`${process.env.ODOO_URL}/web/dataset/call_kw`, { jsonrpc: "2.0", method: "call", params: { model: "crm.lead", method: "search_read", args: [[['name', 'ilike', query]]], kwargs: { fields: ["name", "email_from", "phone"], offset: offset, limit: limit } } }, { headers: { 'Cookie': `session_id=${sessionId}` } }); return response.data.result; } catch (error) { console.error('Failed to search leads:', error); } }

Error Handling and Logging

Always expect the unexpected! Here's a simple error handling wrapper:

async function apiCall(func) { try { return await func(); } catch (error) { console.error(`API call failed: ${error.message}`); // You might want to log this error to a service like Sentry throw error; } } // Usage const leads = await apiCall(() => getLeads());

Performance Optimization

To keep things speedy, consider implementing some caching:

const NodeCache = require('node-cache'); const cache = new NodeCache({ stdTTL: 600 }); // Cache for 10 minutes async function getCachedLeads() { const cacheKey = 'leads'; let leads = cache.get(cacheKey); if (leads == undefined) { leads = await getLeads(); cache.set(cacheKey, leads); } return leads; }

Testing

Don't forget to test your integration! Here's a quick Jest test to get you started:

jest.mock('axios'); test('getLeads returns leads', async () => { axios.post.mockResolvedValue({ data: { result: [{ name: 'Test Lead' }] } }); const leads = await getLeads(); expect(leads).toEqual([{ name: 'Test Lead' }]); });

Security Considerations

Remember, keep those API keys safe! Never commit them to your repository. Use environment variables and consider using a secrets management service for production deployments.

Deployment

When you're ready to deploy, make sure you've got proper error handling, logging, and monitoring in place. Consider using a process manager like PM2 for Node.js applications.

Conclusion

And there you have it! You've just built a solid Odoo CRM API integration in JavaScript. Remember, this is just the beginning. The Odoo API is vast and powerful, so don't be afraid to explore and experiment.

Keep coding, keep learning, and most importantly, have fun with it! If you need more info, the Odoo API documentation is your best friend. Happy integrating!