How the Pipedrive adapter works
- Aryn Wiebe
Need some help? Contact us:
Like all our adapters, the Pipedrive adapter uses simple core concepts and common design patterns to ensure it is extensible and easy to understand.
Here is how it works:
In main, the “P” object will be used to call the methods defined in PIPEDRIVEclient.
local Config = component.fields()
local P = PIPEDRIVEclient(Config)
Concepts used:
PIPEDRIVEclient creates the Pipedrive adapter framework.
PIPEDRIVEgetRecent and PIPEDRIVEgetDeal modules are defined in a metatable as methods and set to the P object. The API key passed to PIPEDRIVEclient is assigned to the new P table so that it can be used by the methods.
local MT={}
MT.__index = {}
MT.__index.custom = require 'PIPEDRIVE.PIPEDRIVEcustom'
MT.__index.getRecent = require 'PIPEDRIVE.PIPEDRIVEgetRecent'
MT.__index.getDeal = require 'PIPEDRIVE.PIPEDRIVEgetDeal'
help.map{dir='PIPEDRIVE/help',methods=MT.__index}
function PIPEDRIVEclient(T)
P = {}
setmetatable(P, MT)
P.key = T.Key
P.domain = T.PipedriveDomain
return P
end
Concepts used:
Setting up help for an object with methods using the MT.__index table of methods.
In main, the LastPollTime is checked and used to call PIPEDRIVEgetRecent for new Deals. If there are any new Deals they are serialized as a string and pushed to the component queue.
local LastPollTime = COUNTget('LastPollTime')
local NextPollTime = os.time()
-- Retrieve recent deals
iguana.logInfo('Pulling recent items from '..os.date('%Y-%m-%d %H:%M:%S',LastPollTime))
local S, R = P:getRecent{LastPollTime = LastPollTime, items = 'deal', live=true}
if R.data ~= json.NULL then
for i=1,#R.data do
queue.push{data=json.serialize{data=R.data[i]}}
end
end
Concepts used:
PIPEDRIVEgetRecent is passed the client object and the table of defined parameters.
PIPEDRIVEgetRecent formats the required endpoint and parameters to call PIPEDRIVEcustom to make the 'recents' API call. The COUNT Library returns 1 if the field is empty, therefore if the LastPollTime is 1, we set it to poll for deals from the last 24 hours.
If successful, then we check the response for an indication that there are more items to be collected. In the case that there are a large number of results, greater than the Pipedrive APIs limit (default ~500), then the Pipedrive API uses pagination to return results in pages with a flag to indicate where there are pages present and an index to the next item on the next page. This information is used to recursively call PIPEDRIVEgetRecent to compile all the results into a single table to be returned.
Concepts used:
PIPEDRIVEcustom is a helper function designed to handle different API requests with Pipedrive.
It prepares the base Pipedrive URL, authorization details in the header, and any additional parameters to be passed in the URL of the request.
net.http.get{} is used to send the request to Pipedrive. The response is parsed and either the response or error response is returned.
Concepts used:
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2697166850
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2693038082 and https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2702508049 to capture the passed path parameter values
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2685665315
Thats it! You can easily extend the functionality based on your needs by creating new Pipedrive methods using their API documentation: https://developers.pipedrive.com/docs/api/v1.