iterable-ruby 0.5.1

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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/lib/iterable.rb +67 -0
  3. data/lib/iterable/api.rb +109 -0
  4. data/lib/iterable/exceptions/service_exception.rb +11 -0
  5. data/lib/iterable/models/base.rb +11 -0
  6. data/lib/iterable/models/commerce_item.rb +30 -0
  7. data/lib/iterable/models/data_fields.rb +4 -0
  8. data/lib/iterable/models/list_details.rb +8 -0
  9. data/lib/iterable/models/message_type.rb +7 -0
  10. data/lib/iterable/models/requests/subscribe.rb +19 -0
  11. data/lib/iterable/models/requests/subscription_update.rb +27 -0
  12. data/lib/iterable/models/requests/targeted_email.rb +6 -0
  13. data/lib/iterable/models/requests/track_event.rb +7 -0
  14. data/lib/iterable/models/requests/track_purchase.rb +43 -0
  15. data/lib/iterable/models/requests/unsubscribe.rb +19 -0
  16. data/lib/iterable/models/requests/user_update.rb +18 -0
  17. data/lib/iterable/models/responses/error.rb +10 -0
  18. data/lib/iterable/models/responses/general.rb +9 -0
  19. data/lib/iterable/models/responses/lists.rb +7 -0
  20. data/lib/iterable/models/responses/message_types.rb +7 -0
  21. data/lib/iterable/models/responses/subscribe.rb +9 -0
  22. data/lib/iterable/models/responses/subscription_update.rb +9 -0
  23. data/lib/iterable/models/responses/targeted_email.rb +9 -0
  24. data/lib/iterable/models/responses/templates.rb +7 -0
  25. data/lib/iterable/models/responses/tracked_event.rb +9 -0
  26. data/lib/iterable/models/responses/unsubscribe.rb +9 -0
  27. data/lib/iterable/models/responses/user.rb +7 -0
  28. data/lib/iterable/models/target_email.rb +7 -0
  29. data/lib/iterable/models/template.rb +10 -0
  30. data/lib/iterable/models/tracked_event.rb +9 -0
  31. data/lib/iterable/models/user.rb +9 -0
  32. data/lib/iterable/services/base_service.rb +75 -0
  33. data/lib/iterable/services/commerce_service.rb +18 -0
  34. data/lib/iterable/services/email_service.rb +18 -0
  35. data/lib/iterable/services/event_service.rb +18 -0
  36. data/lib/iterable/services/list_service.rb +32 -0
  37. data/lib/iterable/services/message_type_service.rb +17 -0
  38. data/lib/iterable/services/template_service.rb +17 -0
  39. data/lib/iterable/services/user_service.rb +43 -0
  40. data/lib/iterable/util/config.rb +89 -0
  41. data/lib/iterable/util/helpers.rb +27 -0
  42. data/lib/iterable/version.rb +3 -0
  43. metadata +209 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7661fd73d8df9f2f34bb1075efa532ddbd4971e1
4
+ data.tar.gz: 037a1da51b3dfd95ee83a958c0ca6d8bf23f110c
5
+ SHA512:
6
+ metadata.gz: 2bfdef2de02fa49e8dbe32df3eeb8aadfd1ebe18843aa1e8d4da44297287a39286f1ea383f0e86c6db3a821fbc4d1e86c139fcf6d80a2972ee501b25d96cee36
7
+ data.tar.gz: b183f4404798332f46d92ac82631d95010253f6a2c2376d7ff8038b2efe4f8378d0543a633fba09a2448674db544b93fcecf8c235eca2e42e405723d55a8bb2a
@@ -0,0 +1,67 @@
1
+
2
+ require 'rubygems'
3
+ require 'rest_client'
4
+ require 'json'
5
+ require 'hashie'
6
+ require 'openssl'
7
+ require 'base64'
8
+
9
+ module Iterable
10
+ autoload :Api, 'iterable/api'
11
+ autoload :VERSION, 'iterable/version'
12
+
13
+ # Models
14
+ autoload :Base, 'iterable/models/base'
15
+ autoload :User, 'iterable/models/user'
16
+ autoload :DataFields, 'iterable/models/data_fields'
17
+ autoload :ListDetails, 'iterable/models/list_details'
18
+ autoload :CommerceItem, 'iterable/models/commerce_item'
19
+ autoload :TrackedEvent, 'iterable/models/tracked_event'
20
+ autoload :TargetEmail, 'iterable/models/target_email'
21
+ autoload :MessageType, 'iterable/models/message_type'
22
+ autoload :Template, 'iterable/models/template'
23
+
24
+ module Responses
25
+ autoload :Error, 'iterable/models/responses/error'
26
+ autoload :General, 'iterable/models/responses/general'
27
+ autoload :Lists, 'iterable/models/responses/lists'
28
+ autoload :Subscribe, 'iterable/models/responses/subscribe'
29
+ autoload :Unsubscribe, 'iterable/models/responses/unsubscribe'
30
+ autoload :User, 'iterable/models/responses/user'
31
+ autoload :TrackedEvent, 'iterable/models/responses/tracked_event'
32
+ autoload :TargetedEmail, 'iterable/models/responses/targeted_email'
33
+ autoload :SubscriptionUpdate, 'iterable/models/responses/subscription_update'
34
+ autoload :MessageTypes, 'iterable/models/responses/message_types'
35
+ autoload :Templates, 'iterable/models/responses/templates'
36
+ end
37
+
38
+ module Requests
39
+ autoload :Subscribe, 'iterable/models/requests/subscribe'
40
+ autoload :Unsubscribe, 'iterable/models/requests/unsubscribe'
41
+ autoload :TrackPurchase, 'iterable/models/requests/track_purchase'
42
+ autoload :UserUpdate, 'iterable/models/requests/user_update'
43
+ autoload :TrackEvent, 'iterable/models/requests/track_event'
44
+ autoload :TargetedEmail, 'iterable/models/requests/targeted_email'
45
+ autoload :SubscriptionUpdate, 'iterable/models/requests/subscription_update'
46
+ end
47
+
48
+ module Services
49
+ autoload :BaseService, 'iterable/services/base_service'
50
+ autoload :CommerceService, 'iterable/services/commerce_service'
51
+ autoload :ListService, 'iterable/services/list_service'
52
+ autoload :MessageTypeService, 'iterable/services/message_type_service'
53
+ autoload :UserService, 'iterable/services/user_service'
54
+ autoload :EventService, 'iterable/services/event_service'
55
+ autoload :EmailService, 'iterable/services/email_service'
56
+ autoload :TemplateService, 'iterable/services/template_service'
57
+ end
58
+
59
+ module Exceptions
60
+ autoload :ServiceException, 'iterable/exceptions/service_exception'
61
+ end
62
+
63
+ module Util
64
+ autoload :Config, 'iterable/util/config'
65
+ autoload :Helpers, 'iterable/util/helpers'
66
+ end
67
+ end
@@ -0,0 +1,109 @@
1
+ #
2
+ # api.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ class Api
9
+ # Class constructor
10
+ # @param [String] api_key - Iterable API Key
11
+ # @return
12
+ def initialize(api_key = nil)
13
+ Services::BaseService.api_key = api_key || Util::Config.get('auth.api_key')
14
+ if Services::BaseService.api_key.nil? || Services::BaseService.api_key == ''
15
+ raise ArgumentError.new(Util::Config.get('errors.api_key_missing'))
16
+ end
17
+ end
18
+
19
+ # Event Services
20
+ def track_event(track_event_request)
21
+ Services::EventService.track(track_event_request)
22
+ end
23
+
24
+ # Email Services
25
+ def send_email(targeted_email_request)
26
+ Services::EmailService.send_email(targeted_email_request)
27
+ end
28
+
29
+ #
30
+ # List Services
31
+ #
32
+ def lists
33
+ Services::ListService.all
34
+ end
35
+
36
+ def lists_subscribe(list_id, subscribers)
37
+ Services::ListService.subscribe(list_id, subscribers)
38
+ end
39
+
40
+ def lists_unsubscribe(list_id, subscribers)
41
+ Services::ListService.unsubscribe(list_id, subscribers)
42
+ end
43
+
44
+ def list_by_id(list_id)
45
+ Services::ListService.find_by_id(list_id)
46
+ end
47
+
48
+ #
49
+ # Template Services
50
+ #
51
+ def templates
52
+ Services::TemplateService.all
53
+ end
54
+
55
+ #
56
+ # MessageType Services
57
+ #
58
+ def message_types
59
+ Services::MessageTypeService.all
60
+ end
61
+
62
+ #
63
+ # User Services
64
+ #
65
+ def user_by_email(email)
66
+ Services::UserService.find_by_email(email)
67
+ end
68
+
69
+ def user_by_id(id)
70
+ Services::UserService.find_by_id(id)
71
+ end
72
+
73
+ def user_update(user)
74
+ Services::UserService.update(user)
75
+ end
76
+
77
+ def user_fields
78
+ Services::UserService.fields
79
+ end
80
+
81
+ def user_update_subscriptions(subscription_request)
82
+ Services::UserService.update_subscription(subscription_request)
83
+ end
84
+
85
+ def unsubscribe_all(email)
86
+ if !email.blank?
87
+ # Get all message types
88
+ iterable_message_types = message_types
89
+ if iterable_message_types && iterable_message_types["messageTypes"]
90
+ message_type_ids = iterable_message_types["messageTypes"].collect { |message_type| message_type["id"] }
91
+ if !message_type_ids.blank?
92
+ subscription_request = Iterable::Requests::SubscriptionUpdate.new({
93
+ email: email,
94
+ unsubscribedMessageTypeIds: message_type_ids
95
+ })
96
+ user_update_subscriptions(subscription_request)
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ #
103
+ # Commerce Services
104
+ #
105
+ def track_purchase(track_purchase_request)
106
+ Services::CommerceService.track_purchase(track_purchase_request)
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,11 @@
1
+ #
2
+ # service_exception.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 Kyle Schutt. All rights reserved.
6
+
7
+ module Iterable
8
+ module Exceptions
9
+ class ServiceException < Exception; end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Iterable
2
+ class Base < Hashie::Dash
3
+ include Hashie::Extensions::Dash::Coercion
4
+ include Hashie::Extensions::Dash::PropertyTranslation
5
+
6
+ def initialize(hash = {})
7
+ # ensure we symbolize keys
8
+ super(Hashie.symbolize_keys!(hash))
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,30 @@
1
+ # {
2
+ # "id": "",
3
+ # "sku": "",
4
+ # "name": "",
5
+ # "description": "",
6
+ # "categories": [
7
+ # ""
8
+ # ],
9
+ # "price": 0,
10
+ # "quantity": 0,
11
+ # "imageUrl": "",
12
+ # "url": "",
13
+ # "dataFields": "Map[string, object]"
14
+ # }
15
+ module Iterable
16
+ class CommerceItem < Iterable::Base
17
+ property :id, required: true, coerce: String
18
+ property :name, required: true
19
+ property :price, required: true, coerce: Float
20
+ property :quantity, required: true, coerce: Integer
21
+
22
+ property :sku
23
+ property :description
24
+ property :imageUrl
25
+ property :url
26
+
27
+ property :categories, coerce: Array[String]
28
+ property :dataFields, coerce: DataFields
29
+ end
30
+ end
@@ -0,0 +1,4 @@
1
+ module Iterable
2
+ class DataFields < Hashie::Mash
3
+ end
4
+ end
@@ -0,0 +1,8 @@
1
+ module Iterable
2
+ class ListDetails < Iterable::Base
3
+ property :id, coerce: Integer
4
+ property :name
5
+ property :createdAt
6
+ property :listType
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ class MessageType < Iterable::Base
3
+ property :id, coerce: Integer
4
+ property :name
5
+ property :channelId
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ # Example request
2
+ # {
3
+ # listId": 0,
4
+ # "subscribers": [
5
+ # {
6
+ # "email": "",
7
+ # "dataFields": "Map[string, object]",
8
+ # "userId": ""
9
+ # }
10
+ # ]
11
+ # }
12
+ module Iterable
13
+ module Requests
14
+ class Subscribe < Iterable::Base
15
+ property :listId, coerce: Integer, required: true
16
+ property :subscribers, coerce: Array[Iterable::User]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+ # Example request
2
+ # {
3
+ # "email": "string",
4
+ # "emailListIds": [
5
+ # 0
6
+ # ],
7
+ # "unsubscribedChannelIds": [
8
+ # 0
9
+ # ],
10
+ # "unsubscribedMessageTypeIds": [
11
+ # 0
12
+ # ],
13
+ # "campaignId": 0,
14
+ # "templateId": 0
15
+ # }
16
+ module Iterable
17
+ module Requests
18
+ class SubscriptionUpdate < Iterable::Base
19
+ property :email, required: true
20
+ property :emailListIds, coerce: Array[Integer]
21
+ property :unsubscribedChannelIds, coerce: Array[Integer]
22
+ property :unsubscribedMessageTypeIds, coerce: Array[Integer]
23
+ property :campaignId, coerce: Integer
24
+ property :templateId, coerce: Integer
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,6 @@
1
+ module Iterable
2
+ module Requests
3
+ class TargetedEmail < Iterable::TargetEmail
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ module Requests
3
+ class TrackEvent < Iterable::TrackedEvent
4
+ property :mergeNestedObjects, default: false
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,43 @@
1
+ # Example request
2
+ # {
3
+ # "user": {
4
+ # "email": "",
5
+ # "dataFields": "Map[string, object]",
6
+ # "userId": "",
7
+ # "mergeNestedObjects": false
8
+ # },
9
+ # "items": [
10
+ # {
11
+ # "id": "",
12
+ # "sku": "",
13
+ # "name": "",
14
+ # "description": "",
15
+ # "categories": [
16
+ # ""
17
+ # ],
18
+ # "price": 0,
19
+ # "quantity": 0,
20
+ # "imageUrl": "",
21
+ # "url": "",
22
+ # "dataFields": "Map[string, object]"
23
+ # }
24
+ # ],
25
+ # "campaignId": 0,
26
+ # "templateId": 0,
27
+ # "total": 0,
28
+ # "createdAt": 0,
29
+ # "dataFields": "Map[string, object]"
30
+ # }
31
+ module Iterable
32
+ module Requests
33
+ class TrackPurchase < Iterable::Base
34
+ property :user, coerce: Iterable::Requests::UserUpdate, required: true
35
+ property :items, coerce: Array[Iterable::CommerceItem], required: true
36
+ property :campaignId
37
+ property :templateId
38
+ property :total, required: true
39
+ property :createdAt
40
+ property :dataFields, coerce: DataFields
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,19 @@
1
+ # Example request
2
+ # {
3
+ # listId": 0,
4
+ # "subscribers": [
5
+ # {
6
+ # "email": "",
7
+ # "dataFields": "Map[string, object]",
8
+ # "userId": ""
9
+ # }
10
+ # ]
11
+ # }
12
+ module Iterable
13
+ module Requests
14
+ class Unsubscribe < Iterable::Base
15
+ property :listId, coerce: Integer, required: true
16
+ property :subscribers, coerce: Array[Iterable::User]
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ # Example request
2
+ # {
3
+ # listId": 0,
4
+ # "subscribers": [
5
+ # {
6
+ # "email": "",
7
+ # "dataFields": "Map[string, object]",
8
+ # "userId": ""
9
+ # }
10
+ # ]
11
+ # }
12
+ module Iterable
13
+ module Requests
14
+ class UserUpdate < Iterable::User
15
+ property :mergeNestedObjects, default: false
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,10 @@
1
+ module Iterable
2
+ module Responses
3
+ class Error < Iterable::Base
4
+ property :msg
5
+ property :code
6
+ property :response
7
+ property :params, coerce: Hashie::Mash
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class General < Iterable::Base
4
+ property :msg
5
+ property :code
6
+ property :params, coerce: Hashie::Mash
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ module Responses
3
+ class Lists < Iterable::Base
4
+ property :lists, coerce: Array[Iterable::ListDetails]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ module Responses
3
+ class MessageTypes < Iterable::Base
4
+ property :message_types, coerce: Array[Iterable::MessageType]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class Subscribe < Iterable::Base
4
+ property :successCount
5
+ property :failCount
6
+ property :invalidEmails, coerce: Array[String]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class SubscriptionUpdate < Iterable::Base
4
+ property :msg
5
+ property :code
6
+ property :params, coerce: Hashie::Mash
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class TargetedEmail < Iterable::Base
4
+ property :msg
5
+ property :code
6
+ property :params, coerce: Hashie::Mash
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ module Responses
3
+ class Templates < Iterable::Base
4
+ property :templates, coerce: Array[Iterable::Template]
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class TrackedEvent < Iterable::Base
4
+ property :msg
5
+ property :code
6
+ property :params, coerce: Hashie::Mash
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ module Responses
3
+ class Unsubscribe < Iterable::Base
4
+ property :successCount
5
+ property :failCount
6
+ property :invalidEmails, coerce: Array[String]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ module Responses
3
+ class User < Iterable::Base
4
+ property :user, coerce: Iterable::User
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module Iterable
2
+ class TargetEmail < Iterable::Base
3
+ property :campaignId, required: true, coerce: Integer
4
+ property :recipientEmail, required: true, coerce: String
5
+ property :dataFields, coerce: DataFields
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module Iterable
2
+ class Template < Iterable::Base
3
+ property :templateId, coerce: Integer
4
+ property :createdAt
5
+ property :updatedAt
6
+ property :name
7
+ property :messageTypeId, coerce: Integer
8
+ property :campaignId
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ class TrackedEvent < Iterable::Base
3
+ property :eventName, required: true, coerce: String
4
+ property :email, required: true, coerce: String
5
+ property :dataFields, coerce: DataFields
6
+ property :userId, coerce: String
7
+ property :campaignId, coerce: String
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Iterable
2
+ class User < Iterable::Base
3
+ property :email, required: true, coerce: String
4
+
5
+ property :userId, coerce: String
6
+
7
+ property :dataFields, coerce: DataFields
8
+ end
9
+ end
@@ -0,0 +1,75 @@
1
+ #
2
+ # base_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 Kyle Schutt. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class BaseService
10
+ class << self
11
+ attr_accessor :api_key
12
+
13
+ protected
14
+
15
+ def get(path, params = {}, response_type = Iterable::Responses::General)
16
+ url = URI::join(Util::Config.get('endpoints.base_url'), path).to_s
17
+ url = build_url(url, params)
18
+ response = RestClient.get(url, get_headers())
19
+ begin
20
+ response_type.new JSON.parse(response.body)
21
+ rescue
22
+ Hashie::Mash.new JSON.parse(response.body)
23
+ end
24
+ end
25
+
26
+ def post(path, body = {}, params = {}, response_type = Iterable::Responses::General)
27
+ url = URI::join(Util::Config.get('endpoints.base_url'), path).to_s
28
+ url = build_url(url, params)
29
+ response = RestClient.post(url, body.to_json, get_headers())
30
+ begin
31
+ response_type.new JSON.parse(response.body)
32
+ rescue
33
+ Hashie::Mash.new JSON.parse(response.body)
34
+ end
35
+ end
36
+
37
+ # Return required headers for making an http request with Iterable
38
+ # @param [String] content_type - The MIME type of the body of the request, default is 'application/json'
39
+ # @return [Hash] - authorization headers
40
+ def get_headers(content_type = 'application/json')
41
+ {
42
+ :content_type => content_type,
43
+ :accept => 'application/json',
44
+ :user_agent => "Iterable Ruby SDK v#{Iterable::VERSION} (#{RUBY_DESCRIPTION})",
45
+ :x_ctct_request_source => "sdk.ruby.#{Iterable::VERSION}",
46
+ 'Api-Key' => BaseService.api_key
47
+ }
48
+ end
49
+
50
+ # Build a url from the base url and query parameters hash. Query parameters
51
+ # should not be URL encoded because this method will handle that
52
+ # @param [String] url - The base url
53
+ # @param [Hash] params - A hash with query parameters
54
+ # @return [String] - the url with query parameters hash
55
+ def build_url(url, params = nil)
56
+ if params.respond_to? :each
57
+ params.each do |key, value|
58
+ # Convert dates to CC date format
59
+ if value.respond_to? :iso8601
60
+ params[key] = value.iso8601
61
+ end
62
+
63
+ if key.to_s == 'next' && value.match(/^.*?next=(.*)$/)
64
+ params[key] = $1
65
+ end
66
+ end
67
+ else
68
+ params ||= {}
69
+ end
70
+ url + '?' + Util::Helpers.http_build_query(params)
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # commerce_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 Kyle Schutt. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class CommerceService < BaseService
10
+ class << self
11
+ def track_purchase(request)
12
+ raise Exceptions::ServiceException, "Must be a Iterable::Requests::TrackPurchase" unless request.is_a?(Iterable::Requests::TrackPurchase)
13
+ post(Util::Config.get('endpoints.track_purchase'), request)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # email_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class EmailService < BaseService
10
+ class << self
11
+ def send_email(request)
12
+ raise Exceptions::ServiceException, "Must be a Iterable::Requests::TargetedEmail" unless request.is_a?(Iterable::Requests::TargetedEmail)
13
+ post(Util::Config.get('endpoints.send_email'), request)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ #
2
+ # event_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class EventService < BaseService
10
+ class << self
11
+ def track(request)
12
+ raise Exceptions::ServiceException, "Must be a Iterable::Requests::TrackEvent" unless request.is_a?(Iterable::Requests::TrackEvent)
13
+ post(Util::Config.get('endpoints.track_event'), request)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,32 @@
1
+ #
2
+ # list_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class ListService < BaseService
10
+ class << self
11
+ def all
12
+ get(Util::Config.get('endpoints.lists'), nil, Iterable::Responses::Lists)
13
+ end
14
+
15
+ def find_by_id(id)
16
+ # iterate over all lists to find the id
17
+ all.lists.select{|x| x.id == id.to_i}.first
18
+ end
19
+
20
+ def subscribe(list_id, subscribers)
21
+ request = Iterable::Requests::Subscribe.new(listId: list_id, subscribers: subscribers)
22
+ post(Util::Config.get('endpoints.lists_subscribe'), request, nil, Iterable::Responses::Subscribe)
23
+ end
24
+
25
+ def unsubscribe(list_id, subscribers)
26
+ request = Iterable::Requests::Unsubscribe.new(listId: list_id, subscribers: subscribers)
27
+ post(Util::Config.get('endpoints.lists_unsubscribe'), request, nil, Iterable::Responses::Unsubscribe)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ #
2
+ # message_type_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class MessageTypeService < BaseService
10
+ class << self
11
+ def all
12
+ get(Util::Config.get('endpoints.message_types'), nil, Iterable::Responses::MessageTypes)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ #
2
+ # message_type_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class TemplateService < BaseService
10
+ class << self
11
+ def all(templateType='Triggered')
12
+ get(Util::Config.get('endpoints.templates'), { templateType: templateType }, Iterable::Responses::Templates)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,43 @@
1
+ #
2
+ # user_service.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ module Services
9
+ class UserService < BaseService
10
+ class << self
11
+ def find_by_email(email)
12
+ raise Exceptions::ServiceException, "Email is required." if email.nil?
13
+ find_by((Util::Config.get('endpoints.user_by_email') % [email]))
14
+ end
15
+
16
+ def find_by_id(id)
17
+ raise Exceptions::ServiceException, "Id is required." if id.nil?
18
+ find_by((Util::Config.get('endpoints.user_by_id') % [id]))
19
+ end
20
+
21
+ def update(user)
22
+ raise Exceptions::ServiceException, "Must be a Iterable::Requests::UserUpdate" unless user.is_a?(Iterable::Requests::UserUpdate)
23
+ post(Util::Config.get('endpoints.user_update'), user)
24
+ end
25
+
26
+ def fields
27
+ get(Util::Config.get('endpoints.user_fields'))
28
+ end
29
+
30
+ def update_subscription(subscription_request)
31
+ raise Exceptions::ServiceException, "Must be a Iterable::Requests::SubscriptionUpdate" unless subscription_request.is_a?(Iterable::Requests::SubscriptionUpdate)
32
+ post(Util::Config.get('endpoints.user_update_subscriptions'), subscription_request)
33
+ end
34
+
35
+ private
36
+
37
+ def find_by(path)
38
+ get(path, nil, Iterable::Responses::User)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,89 @@
1
+ #
2
+ # config.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 MoveWith. All rights reserved.
6
+
7
+ module Iterable
8
+ module Util
9
+ class Config
10
+
11
+ # Return a hash of configuration strings
12
+ # @return [Hash] - hash of configuration properties
13
+ @props = {
14
+ # REST endpoints
15
+ :endpoints => {
16
+ :base_url => 'https://api.iterable.com:443/api/',
17
+
18
+ # events
19
+ :track_event => 'events/track',
20
+
21
+ # emails
22
+ :send_email => 'email/target',
23
+
24
+ # subscribers (users)
25
+ :user_by_email => 'users/%s',
26
+ :user_by_id => 'users/byUserId/%s',
27
+ :user_update => 'users/update',
28
+ :user_subscriptions_update => 'users/updateSubscriptions',
29
+ :user_fields => 'users/getFields',
30
+ :user_update_subscriptions => 'users/updateSubscriptions',
31
+
32
+ # subscriptions (lists)
33
+ :lists => 'lists',
34
+ :lists_subscribe => 'lists/subscribe',
35
+ :lists_unsubscribe => 'lists/unsubscribe',
36
+
37
+ # message types
38
+ :message_types => 'messageTypes',
39
+
40
+ # templates
41
+ :templates => 'templates',
42
+
43
+ # purchases (commerce)
44
+ :track_purchase => 'commerce/trackPurchase',
45
+ },
46
+
47
+ # Authorization related configuration options
48
+ :auth => {
49
+ :api_key => ''
50
+ },
51
+
52
+ # Errors to be returned for various exceptions
53
+ :errors => {
54
+ :api_key_missing => 'api_key required either explicitly or in configuration.',
55
+ }
56
+ }
57
+
58
+ class << self
59
+ attr_accessor :props
60
+
61
+ def configure
62
+ yield props if block_given?
63
+ end
64
+
65
+ # Get a configuration property given a specified location, example usage: Config::get('auth.token_endpoint')
66
+ # @param [String] index - location of the property to obtain
67
+ # @return [String]
68
+ def get(index)
69
+ properties = index.split('.')
70
+ get_value(properties, props)
71
+ end
72
+
73
+ private
74
+
75
+ # Navigate through a config array looking for a particular index
76
+ # @param [Array] index The index sequence we are navigating down
77
+ # @param [Hash, String] value The portion of the config array to process
78
+ # @return [String]
79
+ def get_value(index, value)
80
+ index = index.is_a?(Array) ? index : [index]
81
+ key = index.shift.to_sym
82
+ value.is_a?(Hash) and value[key] and value[key].is_a?(Hash) ?
83
+ get_value(index, value[key]) :
84
+ value[key]
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,27 @@
1
+ #
2
+ # helpers.rb
3
+ # Iterable
4
+ #
5
+ # Copyright (c) 2017 Kyle Schutt. All rights reserved.
6
+
7
+ module Iterable
8
+ module Util
9
+ class Helpers
10
+ class << self
11
+
12
+ # Build the HTTP query from the given parameters
13
+ # @param [Hash] params
14
+ # @return [String] query string
15
+ def http_build_query(params)
16
+ params.collect{ |k,v| "#{k}=#{encode(v)}" }.reverse.join('&')
17
+ end
18
+
19
+ # Escape special characters
20
+ # @param [String] str
21
+ def encode(str)
22
+ CGI.escape(str).gsub('.', '%2E').gsub('-', '%2D')
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,3 @@
1
+ module Iterable
2
+ VERSION = "0.5.1".freeze
3
+ end
metadata ADDED
@@ -0,0 +1,209 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: iterable-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.1
5
+ platform: ruby
6
+ authors:
7
+ - Iterable
8
+ - MoveWith
9
+ - Matt Brand
10
+ autorequire:
11
+ bindir: exe
12
+ cert_chain: []
13
+ date: 2017-09-12 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rest-client
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '4.0'
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 1.6.7
25
+ type: :runtime
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '4.0'
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.6.7
35
+ - !ruby/object:Gem::Dependency
36
+ name: json
37
+ requirement: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '1.8'
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 1.8.1
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - "~>"
50
+ - !ruby/object:Gem::Version
51
+ version: '1.8'
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 1.8.1
55
+ - !ruby/object:Gem::Dependency
56
+ name: mime-types
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "<"
60
+ - !ruby/object:Gem::Version
61
+ version: '4.0'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 1.25.1
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "<"
70
+ - !ruby/object:Gem::Version
71
+ version: '4.0'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 1.25.1
75
+ - !ruby/object:Gem::Dependency
76
+ name: hashie
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "<"
80
+ - !ruby/object:Gem::Version
81
+ version: '4.0'
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: 1.2.0
85
+ type: :runtime
86
+ prerelease: false
87
+ version_requirements: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "<"
90
+ - !ruby/object:Gem::Version
91
+ version: '4.0'
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: 1.2.0
95
+ - !ruby/object:Gem::Dependency
96
+ name: bundler
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.12'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.12'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rake
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '10.0'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '10.0'
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '3.0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '3.0'
137
+ description:
138
+ email:
139
+ - info@movewith.com
140
+ executables: []
141
+ extensions: []
142
+ extra_rdoc_files: []
143
+ files:
144
+ - lib/iterable.rb
145
+ - lib/iterable/api.rb
146
+ - lib/iterable/exceptions/service_exception.rb
147
+ - lib/iterable/models/base.rb
148
+ - lib/iterable/models/commerce_item.rb
149
+ - lib/iterable/models/data_fields.rb
150
+ - lib/iterable/models/list_details.rb
151
+ - lib/iterable/models/message_type.rb
152
+ - lib/iterable/models/requests/subscribe.rb
153
+ - lib/iterable/models/requests/subscription_update.rb
154
+ - lib/iterable/models/requests/targeted_email.rb
155
+ - lib/iterable/models/requests/track_event.rb
156
+ - lib/iterable/models/requests/track_purchase.rb
157
+ - lib/iterable/models/requests/unsubscribe.rb
158
+ - lib/iterable/models/requests/user_update.rb
159
+ - lib/iterable/models/responses/error.rb
160
+ - lib/iterable/models/responses/general.rb
161
+ - lib/iterable/models/responses/lists.rb
162
+ - lib/iterable/models/responses/message_types.rb
163
+ - lib/iterable/models/responses/subscribe.rb
164
+ - lib/iterable/models/responses/subscription_update.rb
165
+ - lib/iterable/models/responses/targeted_email.rb
166
+ - lib/iterable/models/responses/templates.rb
167
+ - lib/iterable/models/responses/tracked_event.rb
168
+ - lib/iterable/models/responses/unsubscribe.rb
169
+ - lib/iterable/models/responses/user.rb
170
+ - lib/iterable/models/target_email.rb
171
+ - lib/iterable/models/template.rb
172
+ - lib/iterable/models/tracked_event.rb
173
+ - lib/iterable/models/user.rb
174
+ - lib/iterable/services/base_service.rb
175
+ - lib/iterable/services/commerce_service.rb
176
+ - lib/iterable/services/email_service.rb
177
+ - lib/iterable/services/event_service.rb
178
+ - lib/iterable/services/list_service.rb
179
+ - lib/iterable/services/message_type_service.rb
180
+ - lib/iterable/services/template_service.rb
181
+ - lib/iterable/services/user_service.rb
182
+ - lib/iterable/util/config.rb
183
+ - lib/iterable/util/helpers.rb
184
+ - lib/iterable/version.rb
185
+ homepage: https://github.com/movewith/iterable-ruby
186
+ licenses:
187
+ - MIT
188
+ metadata: {}
189
+ post_install_message:
190
+ rdoc_options: []
191
+ require_paths:
192
+ - lib
193
+ required_ruby_version: !ruby/object:Gem::Requirement
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ version: '0'
198
+ required_rubygems_version: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ requirements: []
204
+ rubyforge_project:
205
+ rubygems_version: 2.5.1
206
+ signing_key:
207
+ specification_version: 4
208
+ summary: Ruby Library for interactions with the Iterable API
209
+ test_files: []