constantcontact 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +127 -136
  3. data/constantcontact.gemspec +4 -3
  4. data/lib/constantcontact.rb +63 -44
  5. data/lib/constantcontact/api.rb +932 -535
  6. data/lib/constantcontact/auth/oauth2.rb +86 -66
  7. data/lib/constantcontact/components/account/verified_email_address.rb +14 -14
  8. data/lib/constantcontact/components/activities/activity.rb +30 -30
  9. data/lib/constantcontact/components/activities/activity_error.rb +14 -14
  10. data/lib/constantcontact/components/activities/add_contacts.rb +1 -1
  11. data/lib/constantcontact/components/activities/add_contacts_import_data.rb +37 -36
  12. data/lib/constantcontact/components/component.rb +25 -0
  13. data/lib/constantcontact/components/contacts/address.rb +12 -12
  14. data/lib/constantcontact/components/contacts/contact.rb +50 -44
  15. data/lib/constantcontact/components/contacts/contact_list.rb +12 -12
  16. data/lib/constantcontact/components/contacts/custom_field.rb +14 -14
  17. data/lib/constantcontact/components/contacts/email_address.rb +14 -14
  18. data/lib/constantcontact/components/contacts/note.rb +13 -13
  19. data/lib/constantcontact/components/email_marketing/campaign.rb +41 -41
  20. data/lib/constantcontact/components/email_marketing/click_through_details.rb +14 -14
  21. data/lib/constantcontact/components/email_marketing/message_footer.rb +14 -14
  22. data/lib/constantcontact/components/email_marketing/schedule.rb +14 -15
  23. data/lib/constantcontact/components/email_marketing/test_send.rb +21 -21
  24. data/lib/constantcontact/components/event_spot/contact.rb +27 -0
  25. data/lib/constantcontact/components/event_spot/event.rb +63 -0
  26. data/lib/constantcontact/components/event_spot/event_track.rb +28 -0
  27. data/lib/constantcontact/components/event_spot/fee.rb +27 -0
  28. data/lib/constantcontact/components/event_spot/guest.rb +31 -0
  29. data/lib/constantcontact/components/event_spot/notification_option.rb +27 -0
  30. data/lib/constantcontact/components/event_spot/promo_code.rb +26 -0
  31. data/lib/constantcontact/components/event_spot/registrant.rb +54 -0
  32. data/lib/constantcontact/components/event_spot/registrant_field.rb +27 -0
  33. data/lib/constantcontact/components/event_spot/registrant_section.rb +34 -0
  34. data/lib/constantcontact/components/event_spot/sale_item.rb +27 -0
  35. data/lib/constantcontact/components/library/file/library_file.rb +27 -0
  36. data/lib/constantcontact/components/library/folder/library_folder.rb +26 -0
  37. data/lib/constantcontact/components/library/info/library_summary.rb +26 -0
  38. data/lib/constantcontact/components/library/info/move_results.rb +26 -0
  39. data/lib/constantcontact/components/library/info/upload_status.rb +26 -0
  40. data/lib/constantcontact/components/tracking/bounce_activity.rb +14 -14
  41. data/lib/constantcontact/components/tracking/click_activity.rb +14 -14
  42. data/lib/constantcontact/components/tracking/forward_activity.rb +14 -14
  43. data/lib/constantcontact/components/tracking/open_activity.rb +14 -14
  44. data/lib/constantcontact/components/tracking/send_activity.rb +14 -14
  45. data/lib/constantcontact/components/tracking/tracking_summary.rb +17 -17
  46. data/lib/constantcontact/components/tracking/unsubscribe_activity.rb +14 -14
  47. data/lib/constantcontact/services/account_service.rb +4 -3
  48. data/lib/constantcontact/services/activity_service.rb +40 -3
  49. data/lib/constantcontact/services/base_service.rb +34 -6
  50. data/lib/constantcontact/services/campaign_tracking_service.rb +20 -20
  51. data/lib/constantcontact/services/contact_service.rb +10 -12
  52. data/lib/constantcontact/services/contact_tracking_service.rb +20 -20
  53. data/lib/constantcontact/services/email_marketing_service.rb +8 -10
  54. data/lib/constantcontact/services/event_spot_service.rb +254 -0
  55. data/lib/constantcontact/services/library_service.rb +297 -0
  56. data/lib/constantcontact/services/list_service.rb +6 -5
  57. data/lib/constantcontact/util/config.rb +135 -117
  58. data/lib/constantcontact/version.rb +1 -1
  59. data/spec/constantcontact/api_spec.rb +1223 -173
  60. data/spec/constantcontact/auth/oauth2_spec.rb +60 -47
  61. data/spec/constantcontact/components/contacts/address_spec.rb +1 -1
  62. data/spec/constantcontact/components/contacts/contact_list_spec.rb +1 -1
  63. data/spec/constantcontact/components/contacts/contact_spec.rb +1 -1
  64. data/spec/constantcontact/components/contacts/email_address_spec.rb +1 -1
  65. data/spec/constantcontact/services/activity_service_spec.rb +201 -0
  66. data/spec/constantcontact/services/base_service_spec.rb +27 -0
  67. data/spec/constantcontact/services/campaign_schedule_service_spec.rb +111 -0
  68. data/spec/constantcontact/services/campaign_tracking_service_spec.rb +127 -0
  69. data/spec/constantcontact/services/contact_service_spec.rb +24 -22
  70. data/spec/constantcontact/services/contact_tracking_service_spec.rb +127 -0
  71. data/spec/constantcontact/services/email_marketing_spec.rb +72 -66
  72. data/spec/constantcontact/services/event_spot_spec.rb +217 -0
  73. data/spec/constantcontact/services/library_service_spec.rb +248 -0
  74. data/spec/constantcontact/services/list_service_spec.rb +33 -17
  75. data/spec/spec_helper.rb +3 -1
  76. metadata +63 -7
@@ -0,0 +1,26 @@
1
+ #
2
+ # library_summary.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module Components
9
+ class LibrarySummary < Component
10
+ attr_accessor :max_free_file_num, :max_premium_space_limit, :max_upload_size_limit, :image_root, :usage_summary
11
+
12
+ # Factory method to create a LibrarySummary object from a json string
13
+ # @param [Hash] props - properties to create object from
14
+ # @return [LibrarySummary]
15
+ def self.create(props)
16
+ obj = LibrarySummary.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
+ # move_results.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module Components
9
+ class MoveResults < Component
10
+ attr_accessor :id, :uri
11
+
12
+ # Factory method to create a MoveResults object from a json string
13
+ # @param [Hash] props - properties to create object from
14
+ # @return [MoveResults]
15
+ def self.create(props)
16
+ obj = MoveResults.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
+ # upload_status.rb
3
+ # ConstantContact
4
+ #
5
+ # Copyright (c) 2013 Constant Contact. All rights reserved.
6
+
7
+ module ConstantContact
8
+ module Components
9
+ class UploadStatus < Component
10
+ attr_accessor :status, :description, :file_id
11
+
12
+ # Factory method to create an UploadStatus object from a json string
13
+ # @param [Hash] props - properties to create object from
14
+ # @return [UploadStatus]
15
+ def self.create(props)
16
+ obj = UploadStatus.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
@@ -11,18 +11,18 @@ module ConstantContact
11
11
  :contact_id, :email_address, :campaign_id
12
12
 
13
13
 
14
- # Factory method to create a BounceActivity object from an array
15
- # @param [Hash] props - hash of 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
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
28
  end
@@ -9,18 +9,18 @@ module ConstantContact
9
9
  class ClickActivity < Component
10
10
  attr_accessor :activity_type, :campaign_id, :contact_id, :email_address, :link_id, :click_date
11
11
 
12
- \ # Factory method to create a ClickActivity object from an array
13
- # @param [Hash] props - hash of 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
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
26
  end
@@ -9,18 +9,18 @@ module ConstantContact
9
9
  class ForwardActivity < Component
10
10
  attr_accessor :activity_type, :campaign_id, :contact_id, :email_address, :forward_date
11
11
 
12
- # Factory method to create a ForwardActivity object from an array
13
- # @param [Hash] props - hash of 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
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
26
  end
@@ -9,18 +9,18 @@ module ConstantContact
9
9
  class OpenActivity < Component
10
10
  attr_accessor :activity_type, :campaign_id, :email_address, :open_date, :contact_id
11
11
 
12
- # Factory method to create an OpenActivity object from an array
13
- # @param [Hash] props - hash of 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
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
26
  end
@@ -10,18 +10,18 @@ module ConstantContact
10
10
  attr_accessor :activity_type, :campaign_id, :email_address, :contact_id, :send_date
11
11
 
12
12
 
13
- # Factory method to create a SendActivity object from an array
14
- # @param [Hash] props - hash of 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
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
27
  end
@@ -5,23 +5,23 @@
5
5
  # Copyright (c) 2013 Constant Contact. All rights reserved.
6
6
 
7
7
  module ConstantContact
8
- module Components
9
- class TrackingSummary < Component
10
- attr_accessor :sends, :opens, :clicks, :forwards, :unsubscribes, :bounces, :contact_id, :spam_count
8
+ module Components
9
+ class TrackingSummary < Component
10
+ attr_accessor :sends, :opens, :clicks, :forwards, :unsubscribes, :bounces, :spam_count
11
11
 
12
12
 
13
- # Factory method to create a TrackingSummary object from an array
14
- # @param [Hash] props - array of 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
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
27
  end
@@ -10,18 +10,18 @@ module ConstantContact
10
10
  attr_accessor :activity_type, :campaign_id, :contact_id, :email_address, :unsubscribe_date,
11
11
  :unsubscribe_source, :unsubscribe_reason
12
12
 
13
- # Factory method to create an UnsubscribeActivity object from an array
14
- # @param [Hash] props - hash of 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
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
27
  end
@@ -9,12 +9,13 @@ module ConstantContact
9
9
  class AccountService < BaseService
10
10
  class << self
11
11
 
12
- # Get the verified emails from account
12
+ # Get all verified email addresses associated with an account
13
13
  # @param [String] access_token - Constant Contact OAuth2 access token
14
+ # @param [Hash] params - hash of query parameters/values to append to the request
14
15
  # @return [Array<VerifiedEmailAddress>]
15
- def get_verified_email_addresses(access_token)
16
+ def get_verified_email_addresses(access_token, params)
16
17
  url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.account_verified_addresses')
17
- url = build_url(url)
18
+ url = build_url(url, params)
18
19
  response = RestClient.get(url, get_headers(access_token))
19
20
  email_addresses = []
20
21
  JSON.parse(response.body).each do |email_address|
@@ -10,11 +10,12 @@ module ConstantContact
10
10
  class << self
11
11
 
12
12
  # Get a set of activities
13
- # @param [String] access_token
13
+ # @param [String] access_token - Constant Contact OAuth2 access token
14
+ # @param [Hash] params - query parameters to be appended to the url
14
15
  # @return [Array<Activity>]
15
- def get_activities(access_token)
16
+ def get_activities(access_token, params = {})
16
17
  url = Util::Config.get('endpoints.base_url') + Util::Config.get('endpoints.activities')
17
- url = build_url(url)
18
+ url = build_url(url, params)
18
19
  response = RestClient.get(url, get_headers(access_token))
19
20
 
20
21
  activities = []
@@ -53,6 +54,24 @@ module ConstantContact
53
54
  end
54
55
 
55
56
 
57
+ # Create an Add Contacts Activity from a file. Valid file types are txt, csv, xls, xlsx
58
+ # @param [String] access_token - Constant Contact OAuth2 access token
59
+ # @param [String] file_name - The name of the file (ie: contacts.csv)
60
+ # @param [String] contents - The content of the file
61
+ # @param [String] lists - Comma separated list of ContactList id's to add the contacts to
62
+ # @return [Activity]
63
+ def create_add_contacts_activity_from_file(access_token, file_name, contents, lists)
64
+ url = Util::Config.get('endpoints.base_url') +
65
+ Util::Config.get('endpoints.add_contacts_activity')
66
+ url = build_url(url)
67
+
68
+ payload = { :file_name => file_name, :lists => lists, :data => contents, :multipart => true }
69
+
70
+ response = RestClient.post(url, payload, get_headers(access_token))
71
+ Components::Activity.create(JSON.parse(response.body))
72
+ end
73
+
74
+
56
75
  # Create a Clear Lists Activity
57
76
  # @param [String] access_token - Constant Contact OAuth2 access token
58
77
  # @param [Array<lists>] lists - array of list id's to be cleared
@@ -101,6 +120,24 @@ module ConstantContact
101
120
  Components::Activity.create(JSON.parse(response.body))
102
121
  end
103
122
 
123
+
124
+ # Create an Remove Contacts Activity from a file. Valid file types are txt, csv, xls, xlsx
125
+ # @param [String] access_token - Constant Contact OAuth2 access token
126
+ # @param [String] file_name - The name of the file (ie: contacts.csv)
127
+ # @param [String] contents - The content of the file
128
+ # @param [String] lists - Comma separated list of ContactList id' to add the contacts too
129
+ # @return [Activity]
130
+ def add_remove_contacts_from_lists_activity_from_file(access_token, file_name, contents, lists)
131
+ url = Util::Config.get('endpoints.base_url') +
132
+ Util::Config.get('endpoints.remove_from_lists_activity')
133
+ url = build_url(url)
134
+
135
+ payload = { :file_name => file_name, :lists => lists, :data => contents, :multipart => true }
136
+
137
+ response = RestClient.post(url, payload, get_headers(access_token))
138
+ Components::Activity.create(JSON.parse(response.body))
139
+ end
140
+
104
141
  end
105
142
  end
106
143
  end
@@ -12,21 +12,49 @@ module ConstantContact
12
12
 
13
13
  protected
14
14
 
15
- # Helper function to return required headers for making an http request with constant contact
15
+ # Return required headers for making an http request with constant contact
16
16
  # @param [String] access_token - OAuth2 access token to be placed into the Authorization header
17
+ # @param [String] content_type - The MIME type of the body of the request, default is 'application/json'
17
18
  # @return [Hash] - authorization headers
18
- def get_headers(access_token)
19
+ def get_headers(access_token, content_type = 'application/json')
19
20
  {
20
- :content_type => 'application/json',
21
+ :content_type => content_type,
21
22
  :accept => 'application/json',
22
- :authorization => "Bearer #{access_token}"
23
+ :authorization => "Bearer #{access_token}",
24
+ :user_agent => "AppConnect Ruby SDK v#{ConstantContact::SDK::VERSION} (#{RUBY_DESCRIPTION})"
23
25
  }
24
26
  end
25
27
 
26
28
 
27
- # Build a url from the base url and query parameters hash
29
+ # returns the id of a ConstantContact component
30
+ def get_id_for(obj)
31
+ if obj.kind_of? ConstantContact::Components::Component
32
+ obj.id
33
+ elsif obj.kind_of? Hash
34
+ obj["id"]
35
+ else
36
+ obj
37
+ end
38
+ end
39
+
40
+
41
+ # Build a url from the base url and query parameters hash. Query parameters
42
+ # should not be URL encoded because this method will handle that
43
+ # @param [String] url - The base url
44
+ # @param [Hash] params - A hash with query parameters
45
+ # @return [String] - the url with query parameters hash
28
46
  def build_url(url, params = nil)
29
- params = {} if !params
47
+ if params.respond_to? :each
48
+ params.each do |key, value|
49
+ # Convert dates to CC date format
50
+ if value.respond_to? :iso8601
51
+ params[key] = value.iso8601
52
+ end
53
+ end
54
+ else
55
+ params ||= {}
56
+ end
57
+
30
58
  params['api_key'] = BaseService.api_key
31
59
  url += '?' + Util::Helpers.http_build_query(params)
32
60
  end