Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions lib/connectors/campaignmonitor.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
module Connectors
class CampaignMonitor
def self.call(params:, auth:)
new(params, auth)
end

def initialize(params, auth)
@params = params
@auth = auth
@refresh_token = auth.credentials.refresh_token
@oauth_token = auth.credentials.token
@expires = auth.credentials.expires_at
end

attr_reader :params, :auth
private :params, :auth

def connector_code
"campaignmonitor"
end

def description
"campaignmonitor mailinglist"
end

def account_identifiers
{
#there is nothing from Omniauth that we could use
}
end

def credential_details
{
refresh_token: @refresh_token,
oauth_token: @oauth_token,
expires: @expires,
}
end
end
end
40 changes: 40 additions & 0 deletions lib/external_service_new/campaignmonitor_dispatcher.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
require "oj"
require "rest_client"
require "external_service_new/rest_client_dispatcher"
require "createsend"

module ExternalServiceNew
class CampaignMonitorDispatcher < RestClientDispatcher
PAGE_SIZE_MAX = 1000
PAGE_SIZE_MIN = 10

def initialize(account_identifiers: nil, credential_details:, sleep_time_seconds: 5, client: RestClient)
account_identifiers = account_identifiers.symbolize_keys
credential_details = credential_details.symbolize_keys
@auth = {
access_token: credential_details.fetch(:oauth_token),
refresh_token: credential_details.fetch(:refresh_token)
}

cs = CreateSend::CreateSend.new @auth
clients = cs.clients
@client = CreateSend::Client.new @auth, clients[0].ClientID
end

#method = :lists will get the lists
#method = :subscribers get the subscribers of a list
def dispatch(method, id: nil, page: 1, page_size: PAGE_SIZE_MAX)
super() do
if (method == :lists)
@client.lists
elsif (method == :subscribers)
if (page_size < PAGE_SIZE_MIN)
page_size = PAGE_SIZE_MIN
end
list_client = CreateSend::List.new @auth, id
list_client.active("", page, page_size, "email", "asc")
end
end
end
end
end
59 changes: 59 additions & 0 deletions lib/external_service_new/campaignmonitor_downloader.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
module ExternalServiceNew
class CampaignMonitorDownloader
def initialize(dispatcher:, logger:nil)
@dispatcher = dispatcher
@logger = logger
end

def each_list(&block)
return to_enum(:each_list) unless block
response = dispatcher.dispatch(:lists).each do |list|
# We are doing an other request to get the total number of email by list
email_count = dispatcher.dispatch(:subscribers, id:list.ListID, page_size:10)
block.call(list[:ListID], list[:Name], email_count[:TotalNumberOfRecords])
end
end

def each_email(list_id:, &block)
raise "list_id must not be nil" unless list_id
CreatesendInternalDownloader.new(
dispatcher: dispatcher,
logger: logger
).each_email(list_id: list_id, &block)
end

private

attr_reader :dispatcher, :logger
end

class CreatesendInternalDownloader
def initialize(dispatcher:, filters: nil, logger:nil)
raise "dispatcher must not be nil, found #{dispatcher.inspect}" unless dispatcher

@dispatcher = dispatcher
@filters = filters
@logger = logger
end

def each_email(list_id:, &block)
page = 1
return to_enum(:each_email) unless block
logger && logger.info("Downloading Campaign Monitor ListId: #{list_id} with #{filters ? filters.inspect : "no filters"}")

loop do
response = dispatcher.dispatch(:subscribers, id: list_id, page: page)
break if response[:Results].empty?
response[:Results].each{|contact| yield(contact[:EmailAddress])}

page +=1
end

logger && logger.info("Downloaded Campaign Monitor ListID: #{list_id}")
end

private

attr_reader :dispatcher, :filters, :logger
end
end
2 changes: 1 addition & 1 deletion lib/external_service_new/zendesk_dispatcher.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def initialize(account_identifiers: nil, credential_details:, sleep_time_seconds

def dispatch(method, path)
super() do
@client.search(method => path).fetch()
@client.search(method => path)
end
end
end
Expand Down
15 changes: 13 additions & 2 deletions lib/external_service_new/zendesk_downloader.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ def each_email(id: nil, &block)
end

class ZendeskInternalDownloader
# maximum of 100 records per page
PER_PAGE = 100
def initialize(dispatcher:, filters: nil, logger:nil)
raise "dispatcher must not be nil, found #{dispatcher.inspect}" unless dispatcher

Expand All @@ -36,17 +38,26 @@ def initialize(dispatcher:, filters: nil, logger:nil)
end

def each_email(&block)
page = 1
return to_enum(:each_email) unless block
logger && logger.info("Downloading Zendesk Customer List with #{filters ? filters.inspect : "no filters"}")

response = dispatcher.dispatch(:query, "type:user role:end-user")
response.each {|contact| yield(contact["email"])}
loop do
response = dispatcher.dispatch(:query, each_email_path).per_page(PER_PAGE).page(page).fetch
break if response.empty?
response.each{|contact| yield(contact["email"])}

page +=1
end

logger && logger.info("Downloaded Zendesk )Customer List")
end

private

def each_email_path
"type:user role:end-user"
end
attr_reader :dispatcher, :filters, :logger
end
end
3 changes: 3 additions & 0 deletions lib/wafflehouse.rb
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
require "connectors/campaignmonitor"
require "connectors/hubspot"
require "connectors/mailchimp"
require "connectors/shopify"
require "connectors/salesforce"
require "connectors/zendesk"
require "external_service_new/rest_client_dispatcher"
require "external_service_new/campaignmonitor_dispatcher"
require "external_service_new/campaignmonitor_downloader"
require "external_service_new/hubspot_dispatcher"
require "external_service_new/hubspot_downloader"
require "external_service_new/mailchimp_dispatcher"
Expand Down
2 changes: 1 addition & 1 deletion lib/wafflehouse/version.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module Wafflehouse
VERSION = "1.2.2"
VERSION = "1.3.0"
end
1 change: 1 addition & 0 deletions wafflehouse.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ Gem::Specification.new do |spec|
spec.add_dependency 'oj'
spec.add_dependency 'rest-client'
spec.add_dependency 'zendesk_api'
spec.add_dependency 'createsend'


end