Mailspring/packages/client-app/internal_packages/participant-profile/lib/clearbit-data-source.coffee

73 lines
2.5 KiB
CoffeeScript

# This file is in coffeescript just to use the existential operator!
{AccountStore} = require 'nylas-exports'
MAX_RETRY = 10
module.exports = class ClearbitDataSource
clearbitAPI: ->
return "https://person.clearbit.com/v2/combined"
find: ({email, tryCount}) ->
if (tryCount ? 0) >= MAX_RETRY
return Promise.resolve(null)
new Promise (resolve, reject) =>
return; # TODO BG
req = LegacyEdXgehillAPI.makeRequest({
authWithNylasAPI: true
path: "/proxy/clearbit/#{@clearbitAPI()}/find?email=#{email}",
})
req.run()
.then((body) =>
@parseResponse(body, req.response.statusCode, email, tryCount).then(resolve).catch(reject)
)
# The clearbit -> Nylas adapater
parseResponse: (body={}, statusCode, requestedEmail, tryCount=0) =>
new Promise (resolve, reject) =>
# This means it's in the process of fetching. Return null so we don't
# cache and try again.
if statusCode is 202
setTimeout =>
@find({email: requestedEmail, tryCount: tryCount+1}).then(resolve).catch(reject)
, 1000
return
else if statusCode isnt 200
resolve(null)
return
person = body.person
# This means there was no data about the person available. Return a
# valid, but empty object for us to cache. This can happen when we
# have company data, but no personal data.
if not person
person = {email: requestedEmail}
resolve({
cacheDate: Date.now()
email: requestedEmail # Used as checksum
bio: person.bio ? person.twitter?.bio ? person.aboutme?.bio,
location: person.location ? person.geo?.city
currentTitle: person.employment?.title,
currentEmployer: person.employment?.name,
profilePhotoUrl: person.avatar,
rawClearbitData: body,
socialProfiles: @_socialProfiles(person)
})
_socialProfiles: (person={}) ->
profiles = {}
if (person.twitter?.handle ? "").length > 0
profiles.twitter =
handle: person.twitter.handle
url: "https://twitter.com/#{person.twitter.handle}"
if (person.facebook?.handle ? "").length > 0
profiles.facebook =
handle: person.facebook.handle
url: "https://facebook.com/#{person.facebook.handle}"
if (person.linkedin?.handle ? "").length > 0
profiles.linkedin =
handle: person.linkedin.handle
url: "https://linkedin.com/#{person.linkedin.handle}"
return profiles