iterable-ruby 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/iterable.rb +67 -0
- data/lib/iterable/api.rb +109 -0
- data/lib/iterable/exceptions/service_exception.rb +11 -0
- data/lib/iterable/models/base.rb +11 -0
- data/lib/iterable/models/commerce_item.rb +30 -0
- data/lib/iterable/models/data_fields.rb +4 -0
- data/lib/iterable/models/list_details.rb +8 -0
- data/lib/iterable/models/message_type.rb +7 -0
- data/lib/iterable/models/requests/subscribe.rb +19 -0
- data/lib/iterable/models/requests/subscription_update.rb +27 -0
- data/lib/iterable/models/requests/targeted_email.rb +6 -0
- data/lib/iterable/models/requests/track_event.rb +7 -0
- data/lib/iterable/models/requests/track_purchase.rb +43 -0
- data/lib/iterable/models/requests/unsubscribe.rb +19 -0
- data/lib/iterable/models/requests/user_update.rb +18 -0
- data/lib/iterable/models/responses/error.rb +10 -0
- data/lib/iterable/models/responses/general.rb +9 -0
- data/lib/iterable/models/responses/lists.rb +7 -0
- data/lib/iterable/models/responses/message_types.rb +7 -0
- data/lib/iterable/models/responses/subscribe.rb +9 -0
- data/lib/iterable/models/responses/subscription_update.rb +9 -0
- data/lib/iterable/models/responses/targeted_email.rb +9 -0
- data/lib/iterable/models/responses/templates.rb +7 -0
- data/lib/iterable/models/responses/tracked_event.rb +9 -0
- data/lib/iterable/models/responses/unsubscribe.rb +9 -0
- data/lib/iterable/models/responses/user.rb +7 -0
- data/lib/iterable/models/target_email.rb +7 -0
- data/lib/iterable/models/template.rb +10 -0
- data/lib/iterable/models/tracked_event.rb +9 -0
- data/lib/iterable/models/user.rb +9 -0
- data/lib/iterable/services/base_service.rb +75 -0
- data/lib/iterable/services/commerce_service.rb +18 -0
- data/lib/iterable/services/email_service.rb +18 -0
- data/lib/iterable/services/event_service.rb +18 -0
- data/lib/iterable/services/list_service.rb +32 -0
- data/lib/iterable/services/message_type_service.rb +17 -0
- data/lib/iterable/services/template_service.rb +17 -0
- data/lib/iterable/services/user_service.rb +43 -0
- data/lib/iterable/util/config.rb +89 -0
- data/lib/iterable/util/helpers.rb +27 -0
- data/lib/iterable/version.rb +3 -0
- metadata +209 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/iterable.rb
ADDED
@@ -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
|
data/lib/iterable/api.rb
ADDED
@@ -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
|
+
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,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,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,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,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
|
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: []
|