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:
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:
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2691006510
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2684322170
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2685534228
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2685075463 and https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2684486393
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2684454372
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:
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2692120634 and https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2685075463
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2705850973
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2697297941
https://interfaceware.atlassian.net/wiki/spaces/EC/pages/2706538589
https://interfaceware.atlassian.net/wiki/spaces/IXB/pages/2702147658
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/2685534228
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.