constantcontact-ruby 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +2 -0
- data/README.md +136 -0
- data/constantcontact-ruby.gemspec +31 -0
- data/lib/constantcontact/api.rb +1012 -0
- data/lib/constantcontact/auth/oauth2.rb +105 -0
- data/lib/constantcontact/auth/session_data_store.rb +69 -0
- data/lib/constantcontact/components/account/account_address.rb +26 -0
- data/lib/constantcontact/components/account/account_info.rb +38 -0
- data/lib/constantcontact/components/account/verified_email_address.rb +26 -0
- data/lib/constantcontact/components/activities/activity.rb +43 -0
- data/lib/constantcontact/components/activities/activity_error.rb +26 -0
- data/lib/constantcontact/components/activities/add_contacts.rb +127 -0
- data/lib/constantcontact/components/activities/add_contacts_import_data.rb +46 -0
- data/lib/constantcontact/components/activities/export_contacts.rb +30 -0
- data/lib/constantcontact/components/component.rb +48 -0
- data/lib/constantcontact/components/contacts/address.rb +27 -0
- data/lib/constantcontact/components/contacts/contact.rb +92 -0
- data/lib/constantcontact/components/contacts/contact_list.rb +26 -0
- data/lib/constantcontact/components/contacts/custom_field.rb +26 -0
- data/lib/constantcontact/components/contacts/email_address.rb +33 -0
- data/lib/constantcontact/components/contacts/note.rb +26 -0
- data/lib/constantcontact/components/email_marketing/campaign.rb +83 -0
- data/lib/constantcontact/components/email_marketing/campaign_preview.rb +29 -0
- data/lib/constantcontact/components/email_marketing/click_through_details.rb +27 -0
- data/lib/constantcontact/components/email_marketing/message_footer.rb +29 -0
- data/lib/constantcontact/components/email_marketing/schedule.rb +27 -0
- data/lib/constantcontact/components/email_marketing/test_send.rb +45 -0
- data/lib/constantcontact/components/event_spot/contact.rb +27 -0
- data/lib/constantcontact/components/event_spot/event.rb +69 -0
- data/lib/constantcontact/components/event_spot/event_address.rb +29 -0
- data/lib/constantcontact/components/event_spot/event_fee.rb +27 -0
- data/lib/constantcontact/components/event_spot/event_item.rb +36 -0
- data/lib/constantcontact/components/event_spot/event_item_attribute.rb +26 -0
- data/lib/constantcontact/components/event_spot/event_track.rb +31 -0
- data/lib/constantcontact/components/event_spot/guest.rb +31 -0
- data/lib/constantcontact/components/event_spot/guest_section.rb +34 -0
- data/lib/constantcontact/components/event_spot/notification_option.rb +27 -0
- data/lib/constantcontact/components/event_spot/online_meeting.rb +28 -0
- data/lib/constantcontact/components/event_spot/payment_address.rb +29 -0
- data/lib/constantcontact/components/event_spot/payment_summary.rb +33 -0
- data/lib/constantcontact/components/event_spot/promocode.rb +25 -0
- data/lib/constantcontact/components/event_spot/registrant.rb +52 -0
- data/lib/constantcontact/components/event_spot/registrant_fee.rb +29 -0
- data/lib/constantcontact/components/event_spot/registrant_field.rb +27 -0
- data/lib/constantcontact/components/event_spot/registrant_order.rb +39 -0
- data/lib/constantcontact/components/event_spot/registrant_promo_code.rb +31 -0
- data/lib/constantcontact/components/event_spot/registrant_promo_code_info.rb +27 -0
- data/lib/constantcontact/components/event_spot/registrant_section.rb +34 -0
- data/lib/constantcontact/components/event_spot/sale_item.rb +29 -0
- data/lib/constantcontact/components/library/file/library_file.rb +27 -0
- data/lib/constantcontact/components/library/folder/library_folder.rb +26 -0
- data/lib/constantcontact/components/library/info/library_summary.rb +26 -0
- data/lib/constantcontact/components/library/info/move_results.rb +26 -0
- data/lib/constantcontact/components/library/info/upload_status.rb +26 -0
- data/lib/constantcontact/components/result_set.rb +50 -0
- data/lib/constantcontact/components/tracking/bounce_activity.rb +28 -0
- data/lib/constantcontact/components/tracking/click_activity.rb +26 -0
- data/lib/constantcontact/components/tracking/forward_activity.rb +26 -0
- data/lib/constantcontact/components/tracking/open_activity.rb +26 -0
- data/lib/constantcontact/components/tracking/send_activity.rb +27 -0
- data/lib/constantcontact/components/tracking/tracking_activity.rb +26 -0
- data/lib/constantcontact/components/tracking/tracking_summary.rb +27 -0
- data/lib/constantcontact/components/tracking/unsubscribe_activity.rb +27 -0
- data/lib/constantcontact/exceptions/ctct_exception.rb +25 -0
- data/lib/constantcontact/exceptions/illegal_argument_exception.rb +11 -0
- data/lib/constantcontact/exceptions/oauth2_exception.rb +11 -0
- data/lib/constantcontact/exceptions/webhooks_exception.rb +11 -0
- data/lib/constantcontact/services/account_service.rb +39 -0
- data/lib/constantcontact/services/activity_service.rb +136 -0
- data/lib/constantcontact/services/base_service.rb +68 -0
- data/lib/constantcontact/services/campaign_schedule_service.rb +101 -0
- data/lib/constantcontact/services/campaign_tracking_service.rb +152 -0
- data/lib/constantcontact/services/contact_service.rb +105 -0
- data/lib/constantcontact/services/contact_tracking_service.rb +152 -0
- data/lib/constantcontact/services/email_marketing_service.rb +94 -0
- data/lib/constantcontact/services/event_spot_service.rb +448 -0
- data/lib/constantcontact/services/library_service.rb +281 -0
- data/lib/constantcontact/services/list_service.rb +81 -0
- data/lib/constantcontact/util/config.rb +180 -0
- data/lib/constantcontact/util/helpers.rb +27 -0
- data/lib/constantcontact/version.rb +12 -0
- data/lib/constantcontact/webhooks/helpers/validator.rb +30 -0
- data/lib/constantcontact/webhooks/models/billing_change_notification.rb +27 -0
- data/lib/constantcontact/webhooks/webhooks_util.rb +45 -0
- data/lib/constantcontact.rb +124 -0
- data/spec/constantcontact/api_spec.rb +1560 -0
- data/spec/constantcontact/auth/oauth2_spec.rb +125 -0
- data/spec/constantcontact/components/contacts/address_spec.rb +18 -0
- data/spec/constantcontact/components/contacts/contact_list_spec.rb +18 -0
- data/spec/constantcontact/components/contacts/contact_spec.rb +18 -0
- data/spec/constantcontact/components/contacts/custom_field_spec.rb +18 -0
- data/spec/constantcontact/components/contacts/email_address_spec.rb +18 -0
- data/spec/constantcontact/sdk_spec.rb +24 -0
- data/spec/constantcontact/services/account_service_spec.rb +46 -0
- data/spec/constantcontact/services/activity_service_spec.rb +244 -0
- data/spec/constantcontact/services/base_service_spec.rb +50 -0
- data/spec/constantcontact/services/campaign_schedule_service_spec.rb +115 -0
- data/spec/constantcontact/services/campaign_tracking_service_spec.rb +131 -0
- data/spec/constantcontact/services/contact_service_spec.rb +111 -0
- data/spec/constantcontact/services/contact_tracking_service_spec.rb +131 -0
- data/spec/constantcontact/services/email_marketing_spec.rb +100 -0
- data/spec/constantcontact/services/event_spot_spec.rb +423 -0
- data/spec/constantcontact/services/library_service_spec.rb +252 -0
- data/spec/constantcontact/services/list_service_spec.rb +89 -0
- data/spec/constantcontact/webhooks/webhooks_spec.rb +26 -0
- metadata +243 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
#
|
2
|
+
# result_set.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class ResultSet
|
10
|
+
attr_accessor :results, :next
|
11
|
+
|
12
|
+
|
13
|
+
# Constructor to create a ResultSet from the results/meta response when performing a get on a collection
|
14
|
+
# @param [Array<Hash>] results - results array from request
|
15
|
+
# @param [Hash] meta - meta hash from request
|
16
|
+
def initialize(results, meta, component = nil)
|
17
|
+
@results = results
|
18
|
+
if component.present?
|
19
|
+
@component = component
|
20
|
+
end
|
21
|
+
|
22
|
+
if meta.has_key?('pagination') and meta['pagination'].has_key?('next_link')
|
23
|
+
@next_link = meta['pagination']['next_link']
|
24
|
+
@next = @next_link[@next_link.index('?'), @next_link.length]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def next_results
|
29
|
+
if @next_link.present? and @component.present?
|
30
|
+
url = Util::Config.get('endpoints.api_url') + @next_link
|
31
|
+
url = url.gsub(@next, "")
|
32
|
+
url = Services::BaseService.build_url(url, {
|
33
|
+
:next => @next.split("next=")[1]
|
34
|
+
})
|
35
|
+
response = RestClient.get(url, Services::BaseService.get_headers())
|
36
|
+
body = JSON.parse(response.body)
|
37
|
+
|
38
|
+
events = body['results'].collect do |event|
|
39
|
+
@component.create_summary(event)
|
40
|
+
end
|
41
|
+
|
42
|
+
return Components::ResultSet.new(events, body['meta'], @component)
|
43
|
+
else
|
44
|
+
return nil
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#
|
2
|
+
# bounce_activity.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class BounceActivity < Component
|
10
|
+
attr_accessor :activity_type, :bounce_code, :bounce_description, :bounce_message, :bounce_date,
|
11
|
+
:contact_id, :email_address, :campaign_id
|
12
|
+
|
13
|
+
|
14
|
+
# Factory method to create a BounceActivity object from an array
|
15
|
+
# @param [Hash] props - properties to create object from
|
16
|
+
# @return [BounceActivity]
|
17
|
+
def self.create(props)
|
18
|
+
obj = BounceActivity.new
|
19
|
+
if props
|
20
|
+
props.each do |key, value|
|
21
|
+
obj.send("#{key}=", value) if obj.respond_to? key
|
22
|
+
end
|
23
|
+
end
|
24
|
+
obj
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# click_activity.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class ClickActivity < Component
|
10
|
+
attr_accessor :activity_type, :campaign_id, :contact_id, :email_address, :link_id, :click_date
|
11
|
+
|
12
|
+
# Factory method to create a ClickActivity object from an array
|
13
|
+
# @param [Hash] props - properties to create object from
|
14
|
+
# @return [ClickActivity]
|
15
|
+
def self.create(props)
|
16
|
+
obj = ClickActivity.new
|
17
|
+
if props
|
18
|
+
props.each do |key, value|
|
19
|
+
obj.send("#{key}=", value) if obj.respond_to? key
|
20
|
+
end
|
21
|
+
end
|
22
|
+
obj
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# forward_activity.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class ForwardActivity < Component
|
10
|
+
attr_accessor :activity_type, :campaign_id, :contact_id, :email_address, :forward_date
|
11
|
+
|
12
|
+
# Factory method to create a ForwardActivity object from an array
|
13
|
+
# @param [Hash] props - properties to create object from
|
14
|
+
# @return [ForwardActivity]
|
15
|
+
def self.create(props)
|
16
|
+
obj = ForwardActivity.new
|
17
|
+
if props
|
18
|
+
props.each do |key, value|
|
19
|
+
obj.send("#{key}=", value) if obj.respond_to? key
|
20
|
+
end
|
21
|
+
end
|
22
|
+
obj
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# open_activity.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class OpenActivity < Component
|
10
|
+
attr_accessor :activity_type, :campaign_id, :email_address, :open_date, :contact_id
|
11
|
+
|
12
|
+
# Factory method to create an OpenActivity object from an array
|
13
|
+
# @param [Hash] props - properties to create object from
|
14
|
+
# @return [OpenActivity]
|
15
|
+
def self.create(props)
|
16
|
+
obj = OpenActivity.new
|
17
|
+
if props
|
18
|
+
props.each do |key, value|
|
19
|
+
obj.send("#{key}=", value) if obj.respond_to? key
|
20
|
+
end
|
21
|
+
end
|
22
|
+
obj
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# send_activity.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class SendActivity < Component
|
10
|
+
attr_accessor :activity_type, :campaign_id, :email_address, :contact_id, :send_date
|
11
|
+
|
12
|
+
|
13
|
+
# Factory method to create a SendActivity object from an array
|
14
|
+
# @param [Hash] props - properties to create object from
|
15
|
+
# @return [SendActivity]
|
16
|
+
def self.create(props)
|
17
|
+
obj = SendActivity.new
|
18
|
+
if props
|
19
|
+
props.each do |key, value|
|
20
|
+
obj.send("#{key}=", value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
obj
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
#
|
2
|
+
# tracking_activity.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class TrackingActivity < Component
|
10
|
+
attr_accessor :results, :next
|
11
|
+
|
12
|
+
|
13
|
+
# Constructor to create a TrackingActivity from the results/pagination response from getting a set of activities
|
14
|
+
# @param [Array] results - results array from a tracking endpoint
|
15
|
+
# @param [Hash] pagination - pagination hash returned from a tracking endpoint
|
16
|
+
# @return [TrackingActivity]
|
17
|
+
def initialize(results, pagination)
|
18
|
+
@results = results
|
19
|
+
|
20
|
+
if (pagination.has_key?('next'))
|
21
|
+
@next = pagination['next'][pagination['next'].index('&next=') + 6, pagination['next'].length]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# tracking_summary.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class TrackingSummary < Component
|
10
|
+
attr_accessor :sends, :opens, :clicks, :forwards, :unsubscribes, :bounces, :spam_count
|
11
|
+
|
12
|
+
|
13
|
+
# Factory method to create a TrackingSummary object from an array
|
14
|
+
# @param [Hash] props - properties to create object from
|
15
|
+
# @return [TrackingSummary]
|
16
|
+
def self.create(props)
|
17
|
+
obj = TrackingSummary.new
|
18
|
+
if props
|
19
|
+
props.each do |key, value|
|
20
|
+
obj.send("#{key}=", value) if obj.respond_to? key
|
21
|
+
end
|
22
|
+
end
|
23
|
+
obj
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
# unsubscribe_activity.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Components
|
9
|
+
class UnsubscribeActivity < Component
|
10
|
+
attr_accessor :activity_type, :campaign_id, :contact_id, :email_address, :unsubscribe_date,
|
11
|
+
:unsubscribe_source, :unsubscribe_reason
|
12
|
+
|
13
|
+
# Factory method to create an UnsubscribeActivity object from an array
|
14
|
+
# @param [Hash] props - properties to create object from
|
15
|
+
# @return [UnsubscribeActivity]
|
16
|
+
def self.create(props)
|
17
|
+
obj = UnsubscribeActivity.new
|
18
|
+
if props
|
19
|
+
props.each do |key, value|
|
20
|
+
obj.send("#{key}=", value) if obj.respond_to? key
|
21
|
+
end
|
22
|
+
end
|
23
|
+
obj
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#
|
2
|
+
# ctct_exception.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Exceptions
|
9
|
+
class CtctException < Exception
|
10
|
+
attr_accessor :errors
|
11
|
+
|
12
|
+
# Setter
|
13
|
+
# @param [Array<String>] errors
|
14
|
+
def set_errors(errors)
|
15
|
+
@errors = errors
|
16
|
+
end
|
17
|
+
|
18
|
+
# Getter
|
19
|
+
# @return [Array<String>]
|
20
|
+
def get_errors
|
21
|
+
@errors
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
#
|
2
|
+
# account_service.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Services
|
9
|
+
class AccountService < BaseService
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Get a summary of account information
|
13
|
+
# @return [AccountInfo]
|
14
|
+
def get_account_info()
|
15
|
+
url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.account_info')
|
16
|
+
url = build_url(url)
|
17
|
+
response = RestClient.get(url, get_headers())
|
18
|
+
Components::AccountInfo.create(JSON.parse(response.body))
|
19
|
+
end
|
20
|
+
|
21
|
+
|
22
|
+
# Get all verified email addresses associated with an account
|
23
|
+
# @param [Hash] params - hash of query parameters/values to append to the request
|
24
|
+
# @return [Array<VerifiedEmailAddress>]
|
25
|
+
def get_verified_email_addresses(params)
|
26
|
+
url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.account_verified_addresses')
|
27
|
+
url = build_url(url, params)
|
28
|
+
response = RestClient.get(url, get_headers())
|
29
|
+
email_addresses = []
|
30
|
+
JSON.parse(response.body).each do |email_address|
|
31
|
+
email_addresses << Components::VerifiedEmailAddress.create(email_address)
|
32
|
+
end
|
33
|
+
email_addresses
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
#
|
2
|
+
# activity_service.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Services
|
9
|
+
class ActivityService < BaseService
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Get a set of activities
|
13
|
+
# @param [Hash] params - query parameters to be appended to the url
|
14
|
+
# @return [Array<Activity>]
|
15
|
+
def get_activities(params = {})
|
16
|
+
url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.activities')
|
17
|
+
url = build_url(url, params)
|
18
|
+
response = RestClient.get(url, get_headers())
|
19
|
+
|
20
|
+
activities = []
|
21
|
+
JSON.parse(response.body).each do |activity|
|
22
|
+
activities << Components::Activity.create(activity)
|
23
|
+
end
|
24
|
+
|
25
|
+
activities
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# Get an array of activities
|
30
|
+
# @param [String] activity_id - Activity id
|
31
|
+
# @return [Activity]
|
32
|
+
def get_activity(activity_id)
|
33
|
+
url = Util::Config.get('endpoints.base_url') +
|
34
|
+
sprintf(Util::Config.get('endpoints.activity'), activity_id)
|
35
|
+
url = build_url(url)
|
36
|
+
response = RestClient.get(url, get_headers())
|
37
|
+
Components::Activity.create(JSON.parse(response.body))
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# Create an Add Contacts Activity
|
42
|
+
# @param [AddContacts] add_contacts
|
43
|
+
# @return [Activity]
|
44
|
+
def create_add_contacts_activity(add_contacts)
|
45
|
+
url = Util::Config.get('endpoints.base_url') +
|
46
|
+
Util::Config.get('endpoints.add_contacts_activity')
|
47
|
+
url = build_url(url)
|
48
|
+
payload = add_contacts.to_json
|
49
|
+
response = RestClient.post(url, payload, get_headers())
|
50
|
+
Components::Activity.create(JSON.parse(response.body))
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
# Create an Add Contacts Activity from a file. Valid file types are txt, csv, xls, xlsx
|
55
|
+
# @param [String] file_name - The name of the file (ie: contacts.csv)
|
56
|
+
# @param [String] contents - The content of the file
|
57
|
+
# @param [String] lists - Comma separated list of ContactList id's to add the contacts to
|
58
|
+
# @return [Activity]
|
59
|
+
def create_add_contacts_activity_from_file(file_name, contents, lists)
|
60
|
+
url = Util::Config.get('endpoints.base_url') +
|
61
|
+
Util::Config.get('endpoints.add_contacts_activity')
|
62
|
+
url = build_url(url)
|
63
|
+
|
64
|
+
payload = { :file_name => file_name, :lists => lists, :data => contents, :multipart => true }
|
65
|
+
|
66
|
+
response = RestClient.post(url, payload, get_headers())
|
67
|
+
Components::Activity.create(JSON.parse(response.body))
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# Create a Clear Lists Activity
|
72
|
+
# @param [Array<lists>] lists - array of list id's to be cleared
|
73
|
+
# @return [Activity]
|
74
|
+
def add_clear_lists_activity(lists)
|
75
|
+
url = Util::Config.get('endpoints.base_url') +
|
76
|
+
Util::Config.get('endpoints.clear_lists_activity')
|
77
|
+
url = build_url(url)
|
78
|
+
payload = {'lists' => lists}.to_json
|
79
|
+
response = RestClient.post(url, payload, get_headers())
|
80
|
+
Components::Activity.create(JSON.parse(response.body))
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# Create an Export Contacts Activity
|
85
|
+
# @param [ExportContacts] export_contacts
|
86
|
+
# @return [Activity]
|
87
|
+
def add_export_contacts_activity(export_contacts)
|
88
|
+
url = Util::Config.get('endpoints.base_url') +
|
89
|
+
Util::Config.get('endpoints.export_contacts_activity')
|
90
|
+
url = build_url(url)
|
91
|
+
payload = export_contacts.to_json
|
92
|
+
response = RestClient.post(url, payload, get_headers())
|
93
|
+
Components::Activity.create(JSON.parse(response.body))
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
# Create a Remove Contacts From Lists Activity
|
98
|
+
# @param [<Array>EmailAddress] email_addresses
|
99
|
+
# @param [<Array>RemoveFromLists] lists
|
100
|
+
# @return [Activity]
|
101
|
+
def add_remove_contacts_from_lists_activity(email_addresses, lists)
|
102
|
+
url = Util::Config.get('endpoints.base_url') +
|
103
|
+
Util::Config.get('endpoints.remove_from_lists_activity')
|
104
|
+
url = build_url(url)
|
105
|
+
|
106
|
+
payload = { 'import_data' => [], 'lists' => lists }
|
107
|
+
email_addresses.each do |email_address|
|
108
|
+
payload['import_data'] << { 'email_addresses' => [email_address] }
|
109
|
+
end
|
110
|
+
payload = payload.to_json
|
111
|
+
|
112
|
+
response = RestClient.post(url, payload, get_headers())
|
113
|
+
Components::Activity.create(JSON.parse(response.body))
|
114
|
+
end
|
115
|
+
|
116
|
+
|
117
|
+
# Create an Remove Contacts Activity from a file. Valid file types are txt, csv, xls, xlsx
|
118
|
+
# @param [String] file_name - The name of the file (ie: contacts.csv)
|
119
|
+
# @param [String] contents - The content of the file
|
120
|
+
# @param [String] lists - Comma separated list of ContactList id' to add the contacts too
|
121
|
+
# @return [Activity]
|
122
|
+
def add_remove_contacts_from_lists_activity_from_file(file_name, contents, lists)
|
123
|
+
url = Util::Config.get('endpoints.base_url') +
|
124
|
+
Util::Config.get('endpoints.remove_from_lists_activity')
|
125
|
+
url = build_url(url)
|
126
|
+
|
127
|
+
payload = { :file_name => file_name, :lists => lists, :data => contents, :multipart => true }
|
128
|
+
|
129
|
+
response = RestClient.post(url, payload, get_headers())
|
130
|
+
Components::Activity.create(JSON.parse(response.body))
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
#
|
2
|
+
# base_service.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Services
|
9
|
+
class BaseService
|
10
|
+
class << self
|
11
|
+
attr_accessor :api_key, :access_token
|
12
|
+
|
13
|
+
# Build a url from the base url and query parameters hash. Query parameters
|
14
|
+
# should not be URL encoded because this method will handle that
|
15
|
+
# @param [String] url - The base url
|
16
|
+
# @param [Hash] params - A hash with query parameters
|
17
|
+
# @return [String] - the url with query parameters hash
|
18
|
+
def build_url(url, params = nil)
|
19
|
+
if params.respond_to? :each
|
20
|
+
params.each do |key, value|
|
21
|
+
# Convert dates to CC date format
|
22
|
+
if value.respond_to? :iso8601
|
23
|
+
params[key] = value.iso8601
|
24
|
+
end
|
25
|
+
|
26
|
+
if key.to_s == 'next' && value.match(/^.*?next=(.*)$/)
|
27
|
+
params[key] = $1
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
params ||= {}
|
32
|
+
end
|
33
|
+
|
34
|
+
params['api_key'] = BaseService.api_key
|
35
|
+
url += '?' + Util::Helpers.http_build_query(params)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Return required headers for making an http request with Constant Contact
|
39
|
+
# @param [String] content_type - The MIME type of the body of the request, default is 'application/json'
|
40
|
+
# @return [Hash] - authorization headers
|
41
|
+
def get_headers(content_type = 'application/json')
|
42
|
+
{
|
43
|
+
:content_type => content_type,
|
44
|
+
:accept => 'application/json',
|
45
|
+
:authorization => "Bearer #{BaseService.access_token}",
|
46
|
+
:user_agent => "AppConnect Ruby SDK v#{ConstantContact::SDK::VERSION} (#{RUBY_DESCRIPTION})",
|
47
|
+
:x_ctct_request_source => "sdk.ruby.#{ConstantContact::SDK::VERSION}"
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
51
|
+
protected
|
52
|
+
|
53
|
+
|
54
|
+
# returns the id of a ConstantContact component
|
55
|
+
def get_id_for(obj)
|
56
|
+
if obj.kind_of? ConstantContact::Components::Component
|
57
|
+
obj.id
|
58
|
+
elsif obj.kind_of? Hash
|
59
|
+
obj["id"]
|
60
|
+
else
|
61
|
+
obj
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
#
|
2
|
+
# campaign_schedule_service.rb
|
3
|
+
# ConstantContact
|
4
|
+
#
|
5
|
+
# Copyright (c) 2013 Constant Contact. All rights reserved.
|
6
|
+
|
7
|
+
module ConstantContact
|
8
|
+
module Services
|
9
|
+
class CampaignScheduleService < BaseService
|
10
|
+
class << self
|
11
|
+
|
12
|
+
# Create a new schedule for a campaign
|
13
|
+
# @param [Integer] campaign_id - Campaign id to be scheduled
|
14
|
+
# @param [Schedule] schedule - Schedule to be created
|
15
|
+
# @return [Schedule]
|
16
|
+
def add_schedule(campaign_id, schedule)
|
17
|
+
url = Util::Config.get('endpoints.base_url') +
|
18
|
+
sprintf(Util::Config.get('endpoints.campaign_schedules'), campaign_id)
|
19
|
+
url = build_url(url)
|
20
|
+
payload = schedule.to_json
|
21
|
+
response = RestClient.post(url, payload, get_headers())
|
22
|
+
Components::Schedule.create(JSON.parse(response.body))
|
23
|
+
end
|
24
|
+
|
25
|
+
|
26
|
+
# Get a list of schedules for a campaign
|
27
|
+
# @param [Integer] campaign_id - Campaign id to be scheduled
|
28
|
+
# @return [Array<Schedule>]
|
29
|
+
def get_schedules(campaign_id)
|
30
|
+
url = Util::Config.get('endpoints.base_url') +
|
31
|
+
sprintf(Util::Config.get('endpoints.campaign_schedules'), campaign_id)
|
32
|
+
url = build_url(url)
|
33
|
+
response = RestClient.get(url, get_headers())
|
34
|
+
body = JSON.parse(response.body)
|
35
|
+
|
36
|
+
schedules = []
|
37
|
+
body.each do |schedule|
|
38
|
+
schedules << Components::Schedule.create(schedule)
|
39
|
+
end
|
40
|
+
|
41
|
+
schedules
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
# Get a specific schedule for a campaign
|
46
|
+
# @param [Integer] campaign_id - Campaign id to get a schedule for
|
47
|
+
# @param [Integer] schedule_id - Schedule id to retrieve
|
48
|
+
# @return [Schedule]
|
49
|
+
def get_schedule(campaign_id, schedule_id)
|
50
|
+
url = Util::Config.get('endpoints.base_url') +
|
51
|
+
sprintf(Util::Config.get('endpoints.campaign_schedule'), campaign_id, schedule_id)
|
52
|
+
url = build_url(url)
|
53
|
+
response = RestClient.get(url, get_headers())
|
54
|
+
Components::Schedule.create(JSON.parse(response.body))
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
# Delete a specific schedule for a campaign
|
59
|
+
# @param [Integer] campaign_id - Campaign id to delete a schedule for
|
60
|
+
# @param [Integer] schedule_id - Schedule id to delete
|
61
|
+
# @return [Boolean]
|
62
|
+
def delete_schedule(campaign_id, schedule_id)
|
63
|
+
url = Util::Config.get('endpoints.base_url') +
|
64
|
+
sprintf(Util::Config.get('endpoints.campaign_schedule'), campaign_id, schedule_id)
|
65
|
+
url = build_url(url)
|
66
|
+
response = RestClient.delete(url, get_headers())
|
67
|
+
response.code == 204
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
# Update a specific schedule for a campaign
|
72
|
+
# @param [Integer] campaign_id - Campaign id to be scheduled
|
73
|
+
# @param [Schedule] schedule - Schedule to retrieve
|
74
|
+
# @return [Schedule]
|
75
|
+
def update_schedule(campaign_id, schedule)
|
76
|
+
url = Util::Config.get('endpoints.base_url') +
|
77
|
+
sprintf(Util::Config.get('endpoints.campaign_schedule'), campaign_id, schedule.id)
|
78
|
+
url = build_url(url)
|
79
|
+
payload = schedule.to_json
|
80
|
+
response = RestClient.put(url, payload, get_headers())
|
81
|
+
Components::Schedule.create(JSON.parse(response.body))
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
# Send a test send of a campaign
|
86
|
+
# @param [Integer] campaign_id - Id of campaign to send test of
|
87
|
+
# @param [TestSend] test_send - Test send details
|
88
|
+
# @return [TestSend]
|
89
|
+
def send_test(campaign_id, test_send)
|
90
|
+
url = Util::Config.get('endpoints.base_url') +
|
91
|
+
sprintf(Util::Config.get('endpoints.campaign_test_sends'), campaign_id)
|
92
|
+
url = build_url(url)
|
93
|
+
payload = test_send.to_json
|
94
|
+
response = RestClient.post(url, payload, get_headers())
|
95
|
+
Components::TestSend.create(JSON.parse(response.body))
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|