maropost-api 0.1.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.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +6 -0
- data/README.md +1 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/maropost-api.rb +78 -0
- data/lib/maropost_api/ab_test_campaigns.rb +48 -0
- data/lib/maropost_api/campaigns.rb +148 -0
- data/lib/maropost_api/contacts.rb +312 -0
- data/lib/maropost_api/custom_types/operation_result.rb +17 -0
- data/lib/maropost_api/custom_types/order_item.rb +24 -0
- data/lib/maropost_api/journeys.rb +137 -0
- data/lib/maropost_api/products_and_revenue.rb +140 -0
- data/lib/maropost_api/relational_tables.rb +91 -0
- data/lib/maropost_api/reports.rb +176 -0
- data/lib/maropost_api/transactional_campaigns.rb +80 -0
- data/lib/maropost_api/version.rb +3 -0
- data/maropost_api.gemspec +43 -0
- metadata +124 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
class OrderItem
|
2
|
+
|
3
|
+
attr_accessor :item_id, :price, :quantity, :description, :adcode, :category
|
4
|
+
|
5
|
+
def initialize(item_id, price, quantity, description, adcode, category)
|
6
|
+
@item_id = item_id
|
7
|
+
@price = price
|
8
|
+
@quantity = quantity
|
9
|
+
@description = description
|
10
|
+
@adcode = adcode
|
11
|
+
@category = category
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_hash
|
15
|
+
{
|
16
|
+
item_id: @item_id,
|
17
|
+
price: @price,
|
18
|
+
quantity: @quantity,
|
19
|
+
description: @description,
|
20
|
+
adcode: @adcode,
|
21
|
+
category: @category
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
module MaropostApi
|
2
|
+
##
|
3
|
+
# Contains methods that get journey contacts based on provided parameters.
|
4
|
+
# The method names themselves reveal the type of reports they are getting.
|
5
|
+
class Journeys
|
6
|
+
##
|
7
|
+
# Creates a new instance of Reports class.
|
8
|
+
# @param account [Integer] is authentic user account id (Integer) provided by maropost.com
|
9
|
+
# @param api_key [String] is the auth token (String) that is validated on the server to authenticate the user
|
10
|
+
def initialize(account = ENV["ACCOUNT"], api_key = ENV["API_KEY"])
|
11
|
+
MaropostApi.instance_variable_set(:@api_key, api_key)
|
12
|
+
MaropostApi.instance_variable_set(:@account, account)
|
13
|
+
end
|
14
|
+
|
15
|
+
##
|
16
|
+
# gets all the journey contacts grouped by
|
17
|
+
# @param page [Integer] number that decides which page of result to retrieve
|
18
|
+
def get(page)
|
19
|
+
full_path = full_resource_path
|
20
|
+
query_params = MaropostApi.set_query_params({:page => page})
|
21
|
+
|
22
|
+
MaropostApi.get_result(full_path, query_params)
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# gets all campaigns for the provided
|
27
|
+
# @param journey_id [Integer] Unique id of Journey
|
28
|
+
# @param page [Integer] number that decides which page of result to retrieve
|
29
|
+
def get_campaigns(journey_id, page)
|
30
|
+
full_path = full_resource_path("/#{journey_id}/journey_campaigns")
|
31
|
+
query_params = MaropostApi.set_query_params({:pae => page})
|
32
|
+
|
33
|
+
MaropostApi.get_result(full_path, query_params)
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# gets contacts for the provided
|
38
|
+
# @param journey_id [Integer] Unique id of Journey
|
39
|
+
# @param page [Integer] number that decides which page of result to retrieve
|
40
|
+
def get_contacts(journey_id, page)
|
41
|
+
full_path = full_resource_path("/#{journey_id}/journey_contacts")
|
42
|
+
query_params = MaropostApi.set_query_params({:pae => page})
|
43
|
+
|
44
|
+
MaropostApi.get_result(full_path, query_params)
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# stops all journeys for the given
|
49
|
+
# @param contact_id [Integer] Unique id of Contact
|
50
|
+
# @param uid [String] Unique ID
|
51
|
+
# @param email_recipient [String] Email
|
52
|
+
def stop_all(contact_id: nil, uid: nil, email_recipient: nil)
|
53
|
+
query_params = {}
|
54
|
+
query_params[:contact_id] = contact_id unless contact_id.nil?
|
55
|
+
query_params[:uid] = uid unless uid.nil?
|
56
|
+
query_params[:email] = email_recipient unless email_recipient.nil?
|
57
|
+
full_path = full_resource_path "/stop_all_journeys"
|
58
|
+
|
59
|
+
MaropostApi.put_result(full_path, {}, MaropostApi.set_query_params(query_params))
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
##
|
64
|
+
# pauses journey for for the provided
|
65
|
+
# @param journey_id [Integer] Unique id of Journey
|
66
|
+
# @param contact_id [Integer] Unique id of Contact
|
67
|
+
def pause_for_contact(journey_id, contact_id)
|
68
|
+
full_path = full_resource_path "/#{journey_id}/stop/#{contact_id}"
|
69
|
+
query_params = MaropostApi.set_query_params
|
70
|
+
|
71
|
+
MaropostApi.put_result(full_path, {}, query_params)
|
72
|
+
end
|
73
|
+
|
74
|
+
##
|
75
|
+
# pauses journey for the given
|
76
|
+
# @param jouerney_id [Integer] Unique Journey ID
|
77
|
+
# @param uid [String] Unique Identifier
|
78
|
+
def pause_for_uid(journey_id, uid)
|
79
|
+
full_path = full_resource_path "/#{journey_id}/stop/uid"
|
80
|
+
query_params = MaropostApi.set_query_params({:uid => uid})
|
81
|
+
|
82
|
+
MaropostApi.put_result(full_path, {}, query_params)
|
83
|
+
end
|
84
|
+
|
85
|
+
##
|
86
|
+
# resets journey for the given contact
|
87
|
+
# @param journey_id [Integer] Unique id of Journey
|
88
|
+
# @param contact_id [Integer] Unique id of Contact
|
89
|
+
def reset_for_contact(journey_id, contact_id)
|
90
|
+
full_path = full_resource_path "/#{journey_id}/reset/#{contact_id}"
|
91
|
+
query_params = MaropostApi.set_query_params
|
92
|
+
|
93
|
+
MaropostApi.put_result(full_path, {}, query_params)
|
94
|
+
end
|
95
|
+
|
96
|
+
##
|
97
|
+
# resets journey for the given uid
|
98
|
+
# @param jouerney_id [Integer] Unique Journey ID
|
99
|
+
# @param uid [String] Unique Identifier
|
100
|
+
def reset_for_uid(journey_id, uid)
|
101
|
+
full_path = full_resource_path "/#{journey_id}/reset/uid"
|
102
|
+
query_params = MaropostApi.set_query_params({:uid => uid})
|
103
|
+
|
104
|
+
MaropostApi.put_result(full_path, {}, query_params)
|
105
|
+
end
|
106
|
+
|
107
|
+
##
|
108
|
+
# starts journey for the given contact
|
109
|
+
# @param jouerney_id [Integer] Unique Journey ID
|
110
|
+
# @param contact_id [Integer] Unique id of Contact
|
111
|
+
def start_for_contact(journey_id, contact_id)
|
112
|
+
full_path = full_resource_path "/#{journey_id}/start/#{contact_id}"
|
113
|
+
query_params = MaropostApi.set_query_params
|
114
|
+
|
115
|
+
MaropostApi.put_result(full_path, {}, query_params)
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# starts journey for the given uid
|
120
|
+
# @param jouerney_id [Integer] Unique Journey ID
|
121
|
+
# @param uid [String] Unique Identifier
|
122
|
+
def start_for_uid(journey_id, uid)
|
123
|
+
full_path = full_resource_path "/#{journey_id}/start/uid"
|
124
|
+
query_params = MaropostApi.set_query_params({:uid => uid})
|
125
|
+
|
126
|
+
MaropostApi.put_result(full_path, {}, query_params)
|
127
|
+
end
|
128
|
+
|
129
|
+
|
130
|
+
private
|
131
|
+
|
132
|
+
def full_resource_path(specifics = '', root_resource = "journeys")
|
133
|
+
account = MaropostApi.instance_variable_get(:@account)
|
134
|
+
"/accounts/#{account}/#{root_resource}" << specifics
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'maropost_api/custom_types/order_item'
|
2
|
+
|
3
|
+
module MaropostApi
|
4
|
+
|
5
|
+
class ProductsAndRevenue
|
6
|
+
|
7
|
+
def initialize(account = ENV["ACCOUNT"], api_key = ENV["API_KEY"])
|
8
|
+
MaropostApi.instance_variable_set(:@api_key, api_key)
|
9
|
+
MaropostApi.instance_variable_set(:@account, account)
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_order(id)
|
13
|
+
full_path = full_resource_path("/find")
|
14
|
+
query_params = MaropostApi.set_query_params({"where[id]" => id})
|
15
|
+
|
16
|
+
MaropostApi.get_result(full_path, query_params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_order_for_original_order_id(original_order_id)
|
20
|
+
full_path = full_resource_path("/#{original_order_id}")
|
21
|
+
query_params = MaropostApi.set_query_params
|
22
|
+
|
23
|
+
MaropostApi.get_result(full_path, query_params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def create_order(
|
27
|
+
require_unique,
|
28
|
+
contact: {},
|
29
|
+
order: {},
|
30
|
+
order_items: [],
|
31
|
+
add_tags: [],
|
32
|
+
remove_tags: [],
|
33
|
+
uid: nil,
|
34
|
+
list_ids: nil,
|
35
|
+
grand_total: nil,
|
36
|
+
campaign_id: nil,
|
37
|
+
coupon_code: nil
|
38
|
+
)
|
39
|
+
# required contacts fields to check for
|
40
|
+
[:email,].each do |contact_field|
|
41
|
+
raise ArgumentError.new "contact[:#{contact_field}] is required!" if contact.has_key?(contact_field.to_sym) == false
|
42
|
+
end
|
43
|
+
# order items validation
|
44
|
+
order_items.each do |item|
|
45
|
+
raise TypeError.new("Each order item must be an instance of maropost_api/custom_types/OrderItem: " << item.class.to_s << " given") unless item.kind_of?(OrderItem)
|
46
|
+
order[:order_items] ||= []
|
47
|
+
order[:order_items].push(item.to_hash)
|
48
|
+
end
|
49
|
+
# required order fields to check for
|
50
|
+
[:order_date, :order_status, :original_order_id, :order_items].each do |order_field|
|
51
|
+
raise ArgumentError.new "order[:#{order_field}] is required!" if order.has_key?(order_field) == false
|
52
|
+
end
|
53
|
+
|
54
|
+
params = order
|
55
|
+
params[:contact] = contact
|
56
|
+
params[:uid] = uid
|
57
|
+
params[:list_ids] = list_ids
|
58
|
+
params[:grand_total] = grand_total
|
59
|
+
params[:campaign_id] = campaign_id
|
60
|
+
params[:coupon_code] = coupon_code
|
61
|
+
|
62
|
+
full_path = full_resource_path
|
63
|
+
|
64
|
+
MaropostApi.post_result(full_path, {"order" => params})
|
65
|
+
end
|
66
|
+
|
67
|
+
def update_order_for_original_order_id(original_order_id, order: {})
|
68
|
+
raise ArgumentError.new('original_order_id is required') if original_order_id.nil?
|
69
|
+
|
70
|
+
[:order_date, :order_status, :order_items].each do |f|
|
71
|
+
raise ArgumentError.new("order[:#{f}] is required") unless order.has_key?(f)
|
72
|
+
end
|
73
|
+
order[:order_items].each do |oi|
|
74
|
+
raise TypeError.new('each order item should be a type of ' << OrderItem.class.to_s) unless oi.kind_of? OrderItem
|
75
|
+
end
|
76
|
+
order[:order_items].map! {|i| i.to_hash }
|
77
|
+
|
78
|
+
full_path = full_resource_path("/#{original_order_id}")
|
79
|
+
form_body = {order: order}
|
80
|
+
|
81
|
+
MaropostApi.put_result(full_path, form_body)
|
82
|
+
end
|
83
|
+
|
84
|
+
def update_order_for_order_id(order_id, order: {})
|
85
|
+
raise ArgumentError.new('order_id is required') if order_id.nil?
|
86
|
+
|
87
|
+
[:order_date, :order_status, :order_items].each do |f|
|
88
|
+
raise ArgumentError.new("order[:#{f}] is required") unless order.has_key?(f)
|
89
|
+
end
|
90
|
+
order[:order_items].each do |oi|
|
91
|
+
raise TypeError.new('each order item should be a type of ' << OrderItem.class.to_s) unless oi.kind_of? OrderItem
|
92
|
+
end
|
93
|
+
order[:order_items].map! {|i| i.to_hash }
|
94
|
+
|
95
|
+
full_path = full_resource_path("/find")
|
96
|
+
query_params = MaropostApi.set_query_params({"where[id]" => order_id})
|
97
|
+
|
98
|
+
MaropostApi.put_result(full_path, {order: order}, query_params)
|
99
|
+
end
|
100
|
+
|
101
|
+
def delete_for_original_order_id(original_order_id)
|
102
|
+
full_path = full_resource_path("/#{original_order_id}")
|
103
|
+
query_params = MaropostApi.set_query_params
|
104
|
+
|
105
|
+
MaropostApi.delete_result(full_path, query_params)
|
106
|
+
end
|
107
|
+
|
108
|
+
def delete_for_order_id(order_id)
|
109
|
+
full_path = full_resource_path('/find')
|
110
|
+
query_params = MaropostApi.set_query_params({'where[id]' => order_id})
|
111
|
+
|
112
|
+
MaropostApi.delete_result(full_path, query_params)
|
113
|
+
end
|
114
|
+
|
115
|
+
def delete_products_for_original_order_id(original_order_id, product_ids)
|
116
|
+
raise TypeError.new('product_ids should be an Array') if ! product_ids.kind_of? Array
|
117
|
+
full_path = full_resource_path("/#{original_order_id}")
|
118
|
+
query_params = MaropostApi.set_query_params({"product_ids" => product_ids.join(',')})
|
119
|
+
|
120
|
+
MaropostApi.delete_result(full_path, query_params)
|
121
|
+
end
|
122
|
+
|
123
|
+
def delete_products_for_order_id(order_id, product_ids)
|
124
|
+
raise TypeError.new('product_ids should be an Array') if ! product_ids.kind_of? Array
|
125
|
+
full_path = full_resource_path("/find")
|
126
|
+
query_params = MaropostApi.set_query_params({"product_ids" => product_ids.join(','), 'where[id]' => order_id})
|
127
|
+
|
128
|
+
MaropostApi.delete_result(full_path, query_params)
|
129
|
+
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def full_resource_path(specifics = '', root_resource = 'orders')
|
134
|
+
account = MaropostApi.instance_variable_get(:@account)
|
135
|
+
"/accounts/#{account}/#{root_resource}" << specifics
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module MaropostApi
|
2
|
+
class RelationalTables
|
3
|
+
|
4
|
+
attr_accessor :table_name
|
5
|
+
|
6
|
+
def initialize(account = ENV["ACCOUNT"], api_key = ENV["API_KEY"], table_name:)
|
7
|
+
MaropostApi.instance_variable_set(:@api_key, api_key)
|
8
|
+
MaropostApi.instance_variable_set(:@account, account)
|
9
|
+
@table_name = table_name
|
10
|
+
|
11
|
+
MaropostApi.base_uri "https://rdb.maropost.com/#{account}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def get
|
15
|
+
full_path = full_resource_path
|
16
|
+
query_params = MaropostApi.set_query_params
|
17
|
+
|
18
|
+
MaropostApi.get_result(full_path, query_params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def show(unique_field_name, value)
|
22
|
+
raise TypeError.new("#{unique_field_name.inspect} should be a string") unless unique_field_name.is_a? String
|
23
|
+
params = {:record => {}}
|
24
|
+
params[:record][unique_field_name.to_sym] = value
|
25
|
+
full_path = full_resource_path '/show'
|
26
|
+
|
27
|
+
MaropostApi.post_result(full_path, params)
|
28
|
+
end
|
29
|
+
|
30
|
+
def create(key_value_col, *key_value_cols)
|
31
|
+
raise TypeError.new("#{key_value_col.inspect} is not type of Hash") unless key_value_col.kind_of? Hash
|
32
|
+
if (key_value_cols)
|
33
|
+
invalid_cols = key_value_cols.select{|c| !c.is_a? Hash }
|
34
|
+
raise TypeError.new("#{invalid_cols.join(', ')} are not type of Hash") unless invalid_cols.size == 0
|
35
|
+
end
|
36
|
+
full_path = full_resource_path '/create'
|
37
|
+
all_key_values = [key_value_col] + key_value_cols
|
38
|
+
|
39
|
+
MaropostApi.post_result(full_path, :record => all_key_values)
|
40
|
+
end
|
41
|
+
|
42
|
+
def update(key_value_col, *key_value_cols)
|
43
|
+
raise TypeError.new("#{key_value_col.inspect} is not type of Hash") unless key_value_col.kind_of? Hash
|
44
|
+
if (key_value_cols)
|
45
|
+
invalid_cols = key_value_cols.select{|c| !c.is_a? Hash }
|
46
|
+
raise TypeError.new("#{invalid_cols.join(', ')} are not type of Hash") unless invalid_cols.size == 0
|
47
|
+
end
|
48
|
+
full_path = full_resource_path '/update'
|
49
|
+
all_key_values = [key_value_col] + key_value_cols
|
50
|
+
query_params = MaropostApi.set_query_params
|
51
|
+
|
52
|
+
MaropostApi.put_result(full_path, {:record => all_key_values}, query_params)
|
53
|
+
end
|
54
|
+
|
55
|
+
def upsert(key_value_col, *key_value_cols)
|
56
|
+
raise TypeError.new("#{key_value_col.inspect} is not type of Hash") unless key_value_col.kind_of? Hash
|
57
|
+
if (key_value_cols)
|
58
|
+
invalid_cols = key_value_cols.select{|c| !c.is_a? Hash }
|
59
|
+
raise TypeError.new("#{invalid_cols.join(', ')} are not type of Hash") unless invalid_cols.size == 0
|
60
|
+
end
|
61
|
+
full_path = full_resource_path '/upsert'
|
62
|
+
all_key_values = [key_value_col] + key_value_cols
|
63
|
+
|
64
|
+
query_params = MaropostApi.set_query_params
|
65
|
+
|
66
|
+
MaropostApi.put_result(full_path, {:record => all_key_values}, query_params)
|
67
|
+
end
|
68
|
+
|
69
|
+
def delete(unique_field_name, value)
|
70
|
+
raise TypeError.new("#{unique_field_name.inspect} is not a String") unless unique_field_name.is_a? String
|
71
|
+
record = {:record => {}}
|
72
|
+
record[:record][unique_field_name] = value
|
73
|
+
|
74
|
+
# first check if key value exists
|
75
|
+
show_record = show(unique_field_name, value)
|
76
|
+
return show_record unless show_record.success
|
77
|
+
|
78
|
+
full_path = full_resource_path '/delete'
|
79
|
+
query_params = MaropostApi.set_query_params
|
80
|
+
|
81
|
+
MaropostApi.delete_result(full_path, query_params, record)
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
def full_resource_path(resource_name = '')
|
87
|
+
MaropostApi.base_uri + "/#{@table_name}" + "#{resource_name}"
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
module MaropostApi
|
2
|
+
|
3
|
+
##
|
4
|
+
# Contains methods that get reports based on provided parameters.
|
5
|
+
# The method names themselves reveal the type of reports they are getting.
|
6
|
+
class Reports
|
7
|
+
##
|
8
|
+
# Creates a new instance of Reports class.
|
9
|
+
# @param account [Integer] is authentic user account id (Integer) provided by maropost.com
|
10
|
+
# @param api_key [String] is the auth token (String) that is validated on the server to authenticate the user
|
11
|
+
def initialize(account = ENV["ACCOUNT"], api_key = ENV["API_KEY"])
|
12
|
+
MaropostApi.instance_variable_set(:@api_key, api_key)
|
13
|
+
MaropostApi.instance_variable_set(:@account, account)
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# gets all the reports grouped by +page+ (Integer)
|
18
|
+
def get(page)
|
19
|
+
full_path = full_resource_path
|
20
|
+
query_params = MaropostApi.set_query_params({'page' => page})
|
21
|
+
|
22
|
+
MaropostApi.get_result(full_path, query_params)
|
23
|
+
end
|
24
|
+
|
25
|
+
##
|
26
|
+
# gets a report defined by its unique +id+ (Integer)
|
27
|
+
def get_report(id)
|
28
|
+
full_path = full_resource_path "/#{id}"
|
29
|
+
query_params = MaropostApi.set_query_params
|
30
|
+
|
31
|
+
MaropostApi.get_result(full_path, query_params)
|
32
|
+
end
|
33
|
+
|
34
|
+
##
|
35
|
+
# gets all open reports described by
|
36
|
+
# @param page [Integer] Integer that tells the service what page of report to retrieve
|
37
|
+
# @param fields [Array] that contains the name of the fields of the contact to retrieve
|
38
|
+
# @param from [Date] formatted string to add a constriant to our result
|
39
|
+
# @param to [Date] Part of date range of +from+. Determines the result retrieved is in between this range of date
|
40
|
+
# @param unique [Boolean] that indicates whether to get unique reports or not
|
41
|
+
# @param email [String] email to be equated while querying for reports
|
42
|
+
# @param uid [String] carrying unique identifier for the report.
|
43
|
+
# @param per [Integer] determining how many records to get for each page
|
44
|
+
def get_opens(page:, fields: [], from: nil, to: nil, unique: nil, email: nil, uid: nil, per: nil)
|
45
|
+
full_path = full_resource_path "/opens"
|
46
|
+
params = {}
|
47
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
48
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
49
|
+
|
50
|
+
query_params = MaropostApi.set_query_params(params)
|
51
|
+
|
52
|
+
MaropostApi.get_result(full_path, query_params)
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# gets all click reports described by
|
57
|
+
# @param page [Integer] that tells the service what page of report to retrieve
|
58
|
+
# @param fields [Array] that contains the name of the fields of the contact to retrieve
|
59
|
+
# @param from [Date] formatted string to add a constriant to our result
|
60
|
+
# @param to [Part] of date range of +from+. Determines the result retrieved is in between this range of date
|
61
|
+
# @param unique [Boolean] that indicates whether to get unique reports or not
|
62
|
+
# @param email [String] email to be equated while querying for reports
|
63
|
+
# @param uid [String] carrying unique identifier for the report.
|
64
|
+
# @param per [Integer] determining how many records to get for each page
|
65
|
+
def get_clicks(page:, fields: [], from: nil, to: nil, unique: nil, email: nil, uid: nil, per: nil)
|
66
|
+
full_path = full_resource_path "/clicks"
|
67
|
+
params = {}
|
68
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
69
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
70
|
+
|
71
|
+
query_params = MaropostApi.set_query_params(params)
|
72
|
+
|
73
|
+
MaropostApi.get_result(full_path, query_params)
|
74
|
+
end
|
75
|
+
|
76
|
+
##
|
77
|
+
# gets all bounce reports described by
|
78
|
+
# @param page [Integer] that tells the service what page of report to retrieve
|
79
|
+
# @param fields [Array] that contains the name of the fields of the contact to retrieve
|
80
|
+
# @param from [Date] formatted string to add a constriant to our result
|
81
|
+
# @param to [Part] of date range of +from+. Determines the result retrieved is in between this range of date
|
82
|
+
# @param unique [Boolean] that indicates whether to get unique reports or not
|
83
|
+
# @param email [String] email to be equated while querying for reports
|
84
|
+
# @param uid [String] carrying unique identifier for the report.
|
85
|
+
# @param per [Integer] determining how many records to get for each page
|
86
|
+
# @param type [String] Set of values determining "soft" or "hard" bounces
|
87
|
+
def get_bounces(page:, fields: [], from: nil, to: nil, unique: nil, email: nil, uid: nil, per: nil, type: nil)
|
88
|
+
full_path = full_resource_path "/bounces"
|
89
|
+
params = {}
|
90
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
91
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
92
|
+
|
93
|
+
query_params = MaropostApi.set_query_params(params)
|
94
|
+
|
95
|
+
MaropostApi.get_result(full_path, query_params)
|
96
|
+
end
|
97
|
+
|
98
|
+
##
|
99
|
+
# gets all unsubscribe reports described by
|
100
|
+
# @param page: [Integer] that tells the service what page of report to retrieve
|
101
|
+
# @param fields: [Array] that contains the name of the fields of the contact to retrieve
|
102
|
+
# @param from: [Date] formatted string to add a constriant to our result
|
103
|
+
# @param to: [Date] part of date range of +from+. Determines the result retrieved is in between this range of date
|
104
|
+
# @param unique: [Boolean] that indicates whether to get unique reports or not
|
105
|
+
# @param email: [String] email to be equated while querying for reports
|
106
|
+
# @param uid: [String] carrying unique identifier for the report.
|
107
|
+
# @param per: [Integer] determining how many records to get for each page
|
108
|
+
def get_unsubscribes(page:, fields: [], from: nil, to: nil, unique: nil, email: nil, uid: nil, per: nil)
|
109
|
+
full_path = full_resource_path "/unsubscribes"
|
110
|
+
params = {}
|
111
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
112
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
113
|
+
|
114
|
+
query_params = MaropostApi.set_query_params(params)
|
115
|
+
|
116
|
+
MaropostApi.get_result(full_path, query_params)
|
117
|
+
end
|
118
|
+
|
119
|
+
##
|
120
|
+
# gets all complaint reports described by
|
121
|
+
# @param page [Integer] that tells the service what page of report to retrieve
|
122
|
+
# @param fields [Array] that contains the name of the fields of the contact to retrieve
|
123
|
+
# @param from [Date] formatted string to add a constriant to our result
|
124
|
+
# @param to [Date] part of date range of +from+. Determines the result retrieved is in between this range of date
|
125
|
+
# @param unique [Boolean] that indicates whether to get unique reports or not
|
126
|
+
# @param email [String] email to be equated while querying for reports
|
127
|
+
# @param uid [String] carrying unique identifier for the report.
|
128
|
+
# @param per [Integer] determining how many records to get for each page
|
129
|
+
def get_complaints(page:, fields: [], from: nil, to: nil, unique: nil, email: nil, uid: nil, per: nil)
|
130
|
+
full_path = full_resource_path "/unsubscribes"
|
131
|
+
params = {}
|
132
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
133
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
134
|
+
|
135
|
+
query_params = MaropostApi.set_query_params(params)
|
136
|
+
|
137
|
+
MaropostApi.get_result(full_path, query_params)
|
138
|
+
end
|
139
|
+
|
140
|
+
##
|
141
|
+
# gets all ab reports described by
|
142
|
+
# @param page [Integer] that tells the service what page of report to retrieve
|
143
|
+
# @param fields [Array] that contains the name of the fields of the contact to retrieve
|
144
|
+
# @param from [Date] formatted string to add a constriant to our result
|
145
|
+
# @param to [Date] part of date range of +from+. Determines the result retrieved is in between this range of date
|
146
|
+
# @param per [Integer] determining how many records to get for each page
|
147
|
+
def get_ab_reports(name:, page:, from: nil, to: nil, per: nil)
|
148
|
+
full_path = full_resource_path('', "ab_reports")
|
149
|
+
params = {}
|
150
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
151
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
152
|
+
|
153
|
+
query_params = MaropostApi.set_query_params(params)
|
154
|
+
|
155
|
+
MaropostApi.get_result(full_path, query_params)
|
156
|
+
end
|
157
|
+
|
158
|
+
##
|
159
|
+
# gets all journey reports for the provided +page+
|
160
|
+
# @param page [Integer]
|
161
|
+
def get_journeys(page)
|
162
|
+
full_path = full_resource_path '/journeys'
|
163
|
+
query_params = MaropostApi.set_query_params({:page => page})
|
164
|
+
|
165
|
+
MaropostApi.get_result(full_path, query_params)
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
def full_resource_path(specifics = '', root_resource = 'reports')
|
172
|
+
account = MaropostApi.instance_variable_get(:@account)
|
173
|
+
"/accounts/#{account}/#{root_resource}" << specifics
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module MaropostApi
|
2
|
+
class TransactionalCampaigns
|
3
|
+
|
4
|
+
def initialize(account = ENV["ACCOUNT"], api_key = ENV["API_KEY"])
|
5
|
+
MaropostApi.instance_variable_set(:@api_key, api_key)
|
6
|
+
MaropostApi.instance_variable_set(:@account, account)
|
7
|
+
end
|
8
|
+
|
9
|
+
def get(page)
|
10
|
+
full_path = full_resource_path
|
11
|
+
query_params = MaropostApi.set_query_params({:page => page})
|
12
|
+
|
13
|
+
MaropostApi.get_result(full_path, query_params)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create(name:, subject:, preheader:, from_name:, from_email:, reply_to:, content_id:, email_preview_link:, address:, language:, add_ctags: [])
|
17
|
+
params = {}
|
18
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
19
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
20
|
+
|
21
|
+
full_path = full_resource_path
|
22
|
+
|
23
|
+
MaropostApi.post_result(full_path, :campaign => params)
|
24
|
+
end
|
25
|
+
|
26
|
+
def send_email(
|
27
|
+
campaign_id:,
|
28
|
+
content: {},
|
29
|
+
contact: {},
|
30
|
+
send_time: {},
|
31
|
+
ignore_dnm: nil,
|
32
|
+
bcc: nil,
|
33
|
+
from_name: nil,
|
34
|
+
from_email: nil,
|
35
|
+
subject: nil,
|
36
|
+
reply_to: nil,
|
37
|
+
address: nil,
|
38
|
+
tags: {},
|
39
|
+
add_ctags: []
|
40
|
+
)
|
41
|
+
email_regex = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
|
42
|
+
# check for content field values or content id
|
43
|
+
raise ArgumentError.new('Content must be a type of Integer (content_id) or a Hash (content field values)') until content.kind_of? Hash or content.kind_of? Integer
|
44
|
+
if (content.kind_of? Hash)
|
45
|
+
content = content.slice(:name, :html_part, :text_part)
|
46
|
+
raise ArgumentError.new('Content field values must have all or some of :name, :html_part and :text_part as keys') until content.empty? || content.count > 0
|
47
|
+
end
|
48
|
+
# check for contact field values or contact_id
|
49
|
+
raise ArgumentError.new('Contact must be a type of Integer (contact_id) or a Hash (contact field values)') until contact.kind_of? Hash or contact.kind_of? Integer
|
50
|
+
if (contact.kind_of? Hash)
|
51
|
+
contact = contact.slice(:email, :first_name, :last_name, :custom_field)
|
52
|
+
raise ArgumentError.new('Contact field values must have :email and any or all of :first_name and :last_name :custom_field as keys') if contact.empty? || contact[:email].nil?
|
53
|
+
raise ArgumentError.new("contact[:custom_field] must be a type of Hash - #{contact[:custom_field].class} given!") until contact[:custom_field].is_a?(Hash) || contact[:custom_field].nil?
|
54
|
+
end
|
55
|
+
raise ArgumentError.new('contact[:email] must be a valid email address') until contact.is_a? Integer or contact[:email].match? email_regex
|
56
|
+
raise ArgumentError.new('bcc must be a valid email address') until bcc.nil? or bcc.match? email_regex
|
57
|
+
raise ArgumentError.new('from_email must be a valid email address') until from_email.nil? or from_email.match? email_regex
|
58
|
+
raise ArgumentError.new('reply_to must be a valid email address') until reply_to.nil? or reply_to.match? email_regex
|
59
|
+
raise ArgumentError.new('add_ctags must be a valid Array of string') until add_ctags.is_a? Array and add_ctags.all?{|t| t.is_a? String }
|
60
|
+
|
61
|
+
params = {}
|
62
|
+
method(__method__).parameters.each{|p| params[p[1]] = eval(p[1].to_s)}
|
63
|
+
params.reject!{|k,v| v.nil? or (v.respond_to? :empty? and v.empty?) }
|
64
|
+
params[:content_id] = params.delete(:content) if params[:content].kind_of? Integer
|
65
|
+
params[:contact_id] = params.delete(:contact) if params[:contact].kind_of? Integer
|
66
|
+
|
67
|
+
full_path = full_resource_path('/deliver', 'emails')
|
68
|
+
|
69
|
+
MaropostApi.post_result(full_path, :email => params)
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def full_resource_path(specifics = '', root_resource = 'transactional_campaigns')
|
75
|
+
account = MaropostApi.instance_variable_get(:@account)
|
76
|
+
"/accounts/#{account}/#{root_resource}" << specifics
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|