iterable-ruby 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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: []