iterable-api-client 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,59 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /events API endpoints
5
+ #
6
+ # @example Creating events endpoint object
7
+ # # With default config
8
+ # campaigns = Iterable::Events.new
9
+ # campaigns.all
10
+ #
11
+ # # With custom config
12
+ # conf = Iterable::Config.new(token: 'new-token')
13
+ # campaigns = Iterable::Events.new(config)
14
+ class Events < ApiResource
15
+ ##
16
+ #
17
+ # Get all events for a user by email
18
+ #
19
+ # @param email [String] Email of user to find events for
20
+ # @param limit [Integer] Limit of events to return, max 200 default 30
21
+ #
22
+ # @return [Iterable::Response] A response object
23
+ def for_email(email, limit = 30)
24
+ Iterable.request(conf, "/events/#{email}", limit: limit).get
25
+ end
26
+
27
+ ##
28
+ #
29
+ # Track an event
30
+ #
31
+ # @param name [String] Required name of event
32
+ # @param email [String] Email of user to track event for
33
+ # @param attrs [Hash] Event values and fields to include
34
+ #
35
+ # @return [Iterable::Response] A response object
36
+ def track(name, email = nil, attrs = {})
37
+ attrs[:eventName] = name
38
+ attrs[:email] = email
39
+ Iterable.request(conf, '/events/track').post(attrs)
40
+ end
41
+
42
+ ##
43
+ #
44
+ # Track an event
45
+ #
46
+ # @param campaign_id [String] Campaign ID of the push event to track
47
+ # @param message_id [String] Message ID of the push event to track
48
+ # @param email [String] Email of user to track push event for
49
+ # @param attrs [Hash] Event values and fields to include
50
+ #
51
+ # @return [Iterable::Response] A response object
52
+ def track_push_open(campaign_id, message_id, email, attrs = {})
53
+ attrs[:campaignId] = campaign_id
54
+ attrs[:messageId] = message_id
55
+ attrs[:email] = email
56
+ Iterable.request(conf, '/events/trackPushOpen').post(attrs)
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,50 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /experiments API endpoints
5
+ #
6
+ # @example Creating experiments endpoint object
7
+ # # With default config
8
+ # templates = Iterable::Experiments.new [1, 2, 3]
9
+ # templates.get
10
+ #
11
+ # # With custom config
12
+ # conf = Iterable::Config.new(token: 'new-token')
13
+ # templates = Iterable::Experiments.new([1, 2, 3], config)
14
+ class Experiments < ApiResource
15
+ attr_reader :experiment_ids
16
+ ##
17
+ #
18
+ # Initialize Experiments with an array of experiment ids
19
+ #
20
+ # @param experiment_ids [Array[Integer]] Array of experiment_id Integers
21
+ # @param conf [Iterable::Config] A config to optionally pass for requests
22
+ #
23
+ # @return [Iterable::Experiments]
24
+ def initialize(experiment_ids = [], conf = nil)
25
+ @experiment_ids = experiment_ids
26
+ super conf
27
+ end
28
+
29
+ ##
30
+ #
31
+ # Get metrics for experiments
32
+ #
33
+ # @params campaign_ids [Array] Array of campaignIds to optionally query for
34
+ # @param start_time [Date|Time] Start of metrics to query for
35
+ # @param end_time [Date|Time] End of metrics to query for
36
+ #
37
+ # @return [Iterable::Response] A response object
38
+ def metrics(campaign_ids = [], start_time = nil, end_time = nil)
39
+ params = {
40
+ experimentId: @experiment_ids,
41
+ campaignId: campaign_ids
42
+ }
43
+ if start_time
44
+ params[:startTime] = start_time.to_date.strftime(Iterable::DATE_FORMAT)
45
+ params[:endTime] = end_time.to_date.strftime(Iterable::DATE_FORMAT)
46
+ end
47
+ Iterable.request(conf, '/experiments/metrics', params).get
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,124 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /export API endpoints
5
+ #
6
+ # @example Creating an export endpoint object
7
+ # # With default config
8
+ # export = Iterable::Export.new
9
+ # export = Iterable::Export.new Iterable::Export::EMAIL_SEND_TYPE
10
+ # export.all
11
+ #
12
+ # # With custom config
13
+ # conf = Iterable::Config.new(token: 'new-token')
14
+ # export = Iterable::Export.new(Iterable::Export::EMAIL_SEND_TYPE, nil, nil, nil, config)
15
+ class Export < ApiResource
16
+ DATE_FORMAT = '%Y-%m-%d %H:%M:%S'.freeze
17
+ DATA_TYPES = [
18
+ EMAIL_SEND_TYPE = 'emailSend'.freeze,
19
+ EMAIL_OPEN_TYPE = 'emailOpen'.freeze,
20
+ EMAIL_CLICK_TYPE = 'emailClick'.freeze,
21
+ EMAIL_UNSUBSCRIBE_TYPE = 'emailUnSubscribe'.freeze,
22
+ EMAIL_SUBSCRIBE_TYPE = 'emailSubscribe'.freeze,
23
+ EMAIL_BOUNCE_TYPE = 'emailBounce'.freeze,
24
+ EMAIL_COMPLAINT_TYPE = 'emailComplaint'.freeze,
25
+ PUSH_SEND_TYPE = 'pushSend'.freeze,
26
+ PUSH_BOUNCE_TYPE = 'pushBounce'.freeze,
27
+ PUSH_OPEN_TYPE = 'pushOpen'.freeze,
28
+ SMS_SEND_TYPE = 'smsSend'.freeze,
29
+ SMS_BOUNCE_TYPE = 'smsBounce'.freeze,
30
+ SMS_RECEIVED_TYPE = 'smsReceived'.freeze,
31
+ IN_APP_OPEN_TYPE = 'inAppOpen'.freeze,
32
+ IN_APP_CLICK_TYPE = 'inAppClick'.freeze,
33
+ WEB_PUSH_SEND_TYPE = 'webPushSend'.freeze,
34
+ HOSTED_UNSUBSCRIBE_CLICK_TYPE = 'hostedUnsubscribeClick'.freeze,
35
+ PURCHASE_TYPE = 'purchase'.freeze,
36
+ CUSTOM_EVENT_TYPE = 'customEvent'.freeze,
37
+ USER_TYPE = 'user'.freeze
38
+ ].freeze
39
+
40
+ RANGES = [
41
+ TODAY = 'Today'.freeze,
42
+ YESTERDAY = 'Yesterday'.freeze,
43
+ BEFORE_TODAY = 'BeforeToday'.freeze,
44
+ ALL = 'All'.freeze
45
+ ].freeze
46
+
47
+ attr_reader :data_type, :only_fields, :omit_fields, :campaign_id
48
+
49
+ ##
50
+ #
51
+ # Initialize an [Iterable::Export] object to export data from Iterable
52
+ #
53
+ # @param data_type [String] The type of data to export, one of [Iterable::Export::DATA_TYPES]
54
+ # @param only_fields [Array[String]] Array of fields to only export
55
+ # @param omit_fields [Array[String]] Array of fields to omit
56
+ # @param data_fields [Hash] Additional device data fields
57
+ # @param conf [Iterable::Config] A config to optionally pass for requests
58
+ #
59
+ # @return [Iterable::Export]
60
+ def initialize(data_type, only_fields = [], omit_fields = [], campaign_id = nil, conf = nil)
61
+ @data_type = data_type
62
+ @only_fields = only_fields
63
+ @omit_fields = omit_fields
64
+ @campaign_id = campaign_id
65
+ super conf
66
+ end
67
+
68
+ ##
69
+ # The format of the exporter to be implemented by a subclass
70
+ #
71
+ # @example Formats are currently csv or json
72
+ #
73
+ # @return [Exception] Raises an exception
74
+ def format
75
+ raise '#format must be implemented in child class'
76
+ end
77
+
78
+ ##
79
+ #
80
+ # Export data between a start and end time
81
+ #
82
+ # @param start_time [Time] The start time of the data to export
83
+ # @param end_time [Time] The end time of the data to export
84
+ #
85
+ # @return [Iterable::Response] A response object
86
+ def export(start_time, end_time)
87
+ params = {
88
+ startDateTime: start_time.strftime(Iterable::Export::DATE_FORMAT),
89
+ endDateTime: end_time.strftime(Iterable::Export::DATE_FORMAT)
90
+ }
91
+ Iterable.request(conf, base_path, request_params(params)).get
92
+ end
93
+
94
+ ##
95
+ #
96
+ # Export data given a valid range constant [Iterable::Export::RANGES]
97
+ #
98
+ # @param range [Iterable::Export::RANGES] A valid range to export data for
99
+ #
100
+ # @return [Iterable::Response] A response object
101
+ def export_range(range = Iterable::Export::TODAY)
102
+ params = { range: range }
103
+ Iterable.request(conf, base_path, request_params(params)).get
104
+ end
105
+
106
+ protected
107
+
108
+ def base_path
109
+ "/export/data.#{format}"
110
+ end
111
+
112
+ def request_params(params = {})
113
+ default_params.merge params
114
+ end
115
+
116
+ def default_params
117
+ params = { dataTypeName: @data_type }
118
+ params[:onlyFields] = @only_fields if @only_fields && @only_fields.length.positive?
119
+ params[:omitFields] = @omit_fields.join(',') if @omit_fields && @omit_fields.length.positive?
120
+ params[:campaignId] = @campaign_id if @campaign_id
121
+ params
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,23 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Subclass of [Iterable::Export] for JSON exporting of data
5
+ #
6
+ # @example Creating a JSON Exporter
7
+ # # With default config
8
+ # exporter = Iterable::JsonExporter.new Iterable::Export::EMAIL_SEND_TYPE
9
+ # exporter.export
10
+ #
11
+ # # With custom config
12
+ # conf = Iterable::Config.new(token: 'new-token')
13
+ # exporter = Iterable::JsonExporter.new(Iterable::Export::EMAIL_SEND_TYPE, nil, nil, nil, config)
14
+ class JsonExporter < Export
15
+ ##
16
+ # Format to use for exporting
17
+ #
18
+ # @return [String] Format of export
19
+ def format
20
+ 'json'
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,89 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /lists API endpoints
5
+ #
6
+ # @example Creating list endpoint object
7
+ # # With default config
8
+ # lists = Iterable::Lists.new
9
+ # lists.all
10
+ #
11
+ # # With custom config
12
+ # conf = Iterable::Config.new(token: 'new-token')
13
+ # lists = Iterable::Lists.new(config)
14
+ class Lists < ApiResource
15
+ ##
16
+ #
17
+ # Get all lists
18
+ #
19
+ # @return [Iterable::Response] A response object
20
+ def all
21
+ Iterable.request(conf, '/lists').get
22
+ end
23
+
24
+ ##
25
+ #
26
+ # Create a new list with a name
27
+ #
28
+ # @param name [String] The name of the list to create
29
+ #
30
+ # @return [Iterable::Response] A response object
31
+ def create(name)
32
+ Iterable.request(conf, '/lists').post(name: name)
33
+ end
34
+
35
+ ##
36
+ #
37
+ # Delete an existing list given a list id
38
+ #
39
+ # @param name [String|Integer] The id of the list to delete
40
+ #
41
+ # @return [Iterable::Response] A response object
42
+ def delete(list_id)
43
+ Iterable.request(conf, "/lists/#{list_id}").delete
44
+ end
45
+
46
+ ##
47
+ #
48
+ # Get users for a list
49
+ #
50
+ # @param list_id [String|Integer] The id of the list
51
+ #
52
+ # @return [Iterable::Response] A response object
53
+ def users(list_id)
54
+ Iterable.request(conf, '/lists/getUsers', listId: list_id).get
55
+ end
56
+
57
+ ##
58
+ #
59
+ # Subscribe users to a list
60
+ #
61
+ # @param list_id [String|Integer] The id of the list
62
+ # @param subscribes [Array[Hash]] An array of hashes of user emails and data fields
63
+ #
64
+ # @return [Iterable::Response] A response object
65
+ def subscribe(list_id, subscribers = [])
66
+ attrs = {
67
+ listId: list_id,
68
+ subscribers: subscribers
69
+ }
70
+ Iterable.request(conf, '/lists/subscribe').post(attrs)
71
+ end
72
+
73
+ ##
74
+ #
75
+ # Subscribe users to a list
76
+ #
77
+ # @param list_id [String|Integer] The id of the list
78
+ # @param subscribes [Array[Hash]] An array of hashes with an email
79
+ #
80
+ # @return [Iterable::Response] A response object
81
+ def unsubscribe(list_id, subscribers = [])
82
+ attrs = {
83
+ listId: list_id,
84
+ subscribers: subscribers
85
+ }
86
+ Iterable.request(conf, '/lists/unsubscribe').post(attrs)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,31 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /messageTypes API endpoints
5
+ #
6
+ # @example Creating message_types endpoint object
7
+ # # With default config
8
+ # message_types = Iterable::MessageTypes.new
9
+ # message_types.all
10
+ #
11
+ # # With custom config
12
+ # conf = Iterable::Config.new(token: 'new-token')
13
+ # message_types = Iterable::MessageTypes.new(config)
14
+ class MessageTypes < ApiResource
15
+ # Message mediums
16
+ MEDIUMS = [
17
+ EMAIL_MEDIUM = 'Email'.freeze,
18
+ PUSH_MEDIUM = 'Push'.freeze,
19
+ IN_APP_MEDIUM = 'InApp'.freeze,
20
+ SMS_MEDIUM = 'SMS'.freeze
21
+ ].freeze
22
+ ##
23
+ #
24
+ # Get all message_types
25
+ #
26
+ # @return [Iterable::Response] A response object
27
+ def all
28
+ Iterable.request(conf, '/messageTypes').get
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,24 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /metadata API endpoints
5
+ #
6
+ # @example Creating metadata endpoint object
7
+ # # With default config
8
+ # templates = Iterable::Metadata.new
9
+ # templates.get
10
+ #
11
+ # # With custom config
12
+ # conf = Iterable::Config.new(token: 'new-token')
13
+ # templates = Iterable::Metadata.new(config)
14
+ class Metadata < ApiResource
15
+ ##
16
+ #
17
+ # Get metadata
18
+ #
19
+ # @return [Iterable::Response] A response object
20
+ def get
21
+ Iterable.request(conf, '/metadata').get
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,93 @@
1
+ module Iterable
2
+ ##
3
+ #
4
+ # Interact with /metadata/{table} API endpoints
5
+ #
6
+ # @example Creating metadata table endpoint object
7
+ # # With default config
8
+ # templates = Iterable::MetadataTable.new "table-name"
9
+ # templates.get
10
+ #
11
+ # # With custom config
12
+ # conf = Iterable::Config.new(token: 'new-token')
13
+ # templates = Iterable::MetadataTable.new("table-name", config)
14
+ class MetadataTable < ApiResource
15
+ attr_reader :name
16
+ ##
17
+ #
18
+ # Initialize a MetadataTable with a table name
19
+ #
20
+ # @param name [String] The name of the table to interact with
21
+ # @param conf [Iterable::Config] A config to optionally pass for requests
22
+ #
23
+ # @return [Iterable::MetadataTable]
24
+ def initialize(name, conf = nil)
25
+ @name = name
26
+ super conf
27
+ end
28
+
29
+ ##
30
+ #
31
+ # Get metadata table keys
32
+ #
33
+ # @params next_marker [String] next result set id if more hits exist
34
+ #
35
+ # @return [Iterable::Response] A response object
36
+ def list_keys(next_marker = nil)
37
+ params = {}
38
+ params['nextMarker'] = next_marker if next_marker
39
+ Iterable.request(conf, base_path, params).get
40
+ end
41
+
42
+ ##
43
+ #
44
+ # Delete metadata table
45
+ #
46
+ # @return [Iterable::Response] A response object
47
+ def delete
48
+ Iterable.request(conf, base_path).delete
49
+ end
50
+
51
+ ##
52
+ #
53
+ # Add metadata for table
54
+ #
55
+ # @param key [String] Key of metadata to add
56
+ # @param value [Hash] Value of metadata key as a hash of key/value data
57
+ #
58
+ # @return [Iterable::Response] A response object
59
+ def add(key, value = {})
60
+ Iterable.request(conf, base_path(key)).put(value: value)
61
+ end
62
+
63
+ ##
64
+ #
65
+ # Get metadata key for table
66
+ #
67
+ # @param key [String] Key of metadata to get
68
+ #
69
+ # @return [Iterable::Response] A response object
70
+ def get(key)
71
+ Iterable.request(conf, base_path(key)).get
72
+ end
73
+
74
+ ##
75
+ #
76
+ # Remove metadata key for table
77
+ #
78
+ # @param key [String] Key of metadata to delete
79
+ #
80
+ # @return [Iterable::Response] A response object
81
+ def remove(key)
82
+ Iterable.request(conf, base_path(key)).delete
83
+ end
84
+
85
+ private
86
+
87
+ def base_path(key = nil)
88
+ path = "/metadata/#{@name}"
89
+ path += "/#{key}" if key
90
+ path
91
+ end
92
+ end
93
+ end