Hey there, fellow code wranglers! Ready to supercharge your proposal game? Let's dive into the world of Better Proposals API and see how we can integrate it into our JavaScript projects. This powerhouse of an API will have you creating, managing, and tracking proposals like a pro in no time.
Before we jump in, make sure you've got:
First things first, let's get our ducks in a row:
npm install axios dotenv
Create a .env
file and add your API key:
BETTER_PROPOSALS_API_KEY=your_api_key_here
Let's kick things off with a simple API call:
require('dotenv').config(); const axios = require('axios'); const api = axios.create({ baseURL: 'https://api.betterproposals.io/v1', headers: { 'Authorization': `Bearer ${process.env.BETTER_PROPOSALS_API_KEY}`, 'Content-Type': 'application/json' } }); async function testConnection() { try { const response = await api.get('/user'); console.log('Connected successfully:', response.data); } catch (error) { console.error('Connection failed:', error.response.data); } } testConnection();
Now that we're connected, let's flex those API muscles:
async function createProposal(data) { try { const response = await api.post('/proposals', data); console.log('Proposal created:', response.data); } catch (error) { console.error('Failed to create proposal:', error.response.data); } }
async function getProposal(id) { try { const response = await api.get(`/proposals/${id}`); console.log('Proposal data:', response.data); } catch (error) { console.error('Failed to retrieve proposal:', error.response.data); } }
async function updateProposal(id, data) { try { const response = await api.put(`/proposals/${id}`, data); console.log('Proposal updated:', response.data); } catch (error) { console.error('Failed to update proposal:', error.response.data); } }
async function deleteProposal(id) { try { await api.delete(`/proposals/${id}`); console.log('Proposal deleted successfully'); } catch (error) { console.error('Failed to delete proposal:', error.response.data); } }
Set up an Express server to handle webhooks:
const express = require('express'); const app = express(); app.post('/webhook', express.json(), (req, res) => { console.log('Webhook received:', req.body); // Process the webhook data res.sendStatus(200); }); app.listen(3000, () => console.log('Webhook server running on port 3000'));
Use WebSockets for real-time updates:
const WebSocket = require('ws'); const ws = new WebSocket('wss://api.betterproposals.io/v1/websocket'); ws.on('open', function open() { console.log('Connected to WebSocket'); }); ws.on('message', function incoming(data) { console.log('Received:', data); // Handle real-time updates });
Always wrap your API calls in try-catch blocks and log errors comprehensively. Here's a handy error handler:
function handleApiError(error) { if (error.response) { console.error('API Error:', error.response.status, error.response.data); } else if (error.request) { console.error('Network Error:', error.request); } else { console.error('Error:', error.message); } }
Implement caching to reduce API calls:
const NodeCache = require('node-cache'); const cache = new NodeCache({ stdTTL: 600 }); // Cache for 10 minutes async function getCachedProposal(id) { const cachedData = cache.get(id); if (cachedData) return cachedData; const response = await api.get(`/proposals/${id}`); cache.set(id, response.data); return response.data; }
Never expose your API key in client-side code. Use environment variables and implement proper authorization on your server.
Use Jest for testing:
const { getProposal } = require('./api'); test('getProposal returns correct data', async () => { const proposal = await getProposal('123'); expect(proposal).toHaveProperty('id'); expect(proposal.id).toBe('123'); });
Use environment variables for different stages (development, staging, production). Implement proper logging and monitoring in your production environment.
And there you have it, folks! You're now armed with the knowledge to build a robust Better Proposals API integration. Remember, the key to mastery is practice, so get out there and start coding. Happy integrating!