mailjet 1.5.4 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +298 -183
  3. data/Rakefile +23 -14
  4. data/lib/mailjet/configuration.rb +56 -4
  5. data/lib/mailjet/connection.rb +68 -33
  6. data/lib/mailjet/exception/errors.rb +94 -0
  7. data/lib/mailjet/mailer.rb +45 -16
  8. data/lib/mailjet/rack/endpoint.rb +2 -3
  9. data/lib/mailjet/resource.rb +105 -72
  10. data/lib/mailjet/resources/campaigndraft.rb +1 -1
  11. data/lib/mailjet/resources/campaigndraft_detailcontent.rb +17 -1
  12. data/lib/mailjet/resources/campaigndraft_schedule.rb +1 -1
  13. data/lib/mailjet/resources/campaigndraft_send.rb +1 -1
  14. data/lib/mailjet/resources/campaigndraft_status.rb +1 -1
  15. data/lib/mailjet/resources/campaigndraft_test.rb +1 -1
  16. data/lib/mailjet/resources/contact.rb +11 -2
  17. data/lib/mailjet/resources/contact_getcontactslists.rb +17 -0
  18. data/lib/mailjet/resources/contact_pii.rb +8 -0
  19. data/lib/mailjet/resources/contactslist_csv.rb +8 -0
  20. data/lib/mailjet/resources/csvimport.rb +0 -1
  21. data/lib/mailjet/resources/listrecipient.rb +2 -1
  22. data/lib/mailjet/resources/messagehistory.rb +16 -0
  23. data/lib/mailjet/resources/messageinformation.rb +17 -0
  24. data/lib/mailjet/resources/newsletter.rb +1 -2
  25. data/lib/mailjet/resources/openinformation.rb +17 -0
  26. data/lib/mailjet/resources/retrieve_errors_csv.rb +8 -0
  27. data/lib/mailjet/resources/send.rb +1 -1
  28. data/lib/mailjet/resources/statcounters.rb +33 -0
  29. data/lib/mailjet/resources/statistics_linkclick.rb +12 -0
  30. data/lib/mailjet/resources/template_detailcontent.rb +18 -2
  31. data/lib/mailjet/version.rb +1 -1
  32. data/lib/mailjet.rb +4 -6
  33. metadata +25 -120
  34. data/lib/mailjet/api_error.rb +0 -29
  35. data/lib/mailjet/core_extensions/ostruct.rb +0 -9
  36. data/lib/mailjet/gem_extensions/rest_client.rb +0 -19
@@ -1,13 +1,9 @@
1
1
  require 'mailjet/connection'
2
- require 'active_support/hash_with_indifferent_access'
3
- require 'active_support/core_ext/class'
4
- require 'active_support/core_ext/hash'
2
+ require 'yajl'
3
+ require 'active_support'
5
4
  require 'active_support/core_ext/string'
6
- require 'active_support/core_ext/module/delegation'
7
- require 'active_support/concern'
8
- require 'active_support/json/decoding'
9
- #require 'mail'
10
- require 'json'
5
+ require 'active_support/core_ext/hash/indifferent_access'
6
+
11
7
 
12
8
 
13
9
  # This option automatically transforms the date output by the API into something a bit more readable.
@@ -18,70 +14,90 @@ require 'json'
18
14
 
19
15
  module Mailjet
20
16
  module Resource
21
- extend ActiveSupport::Concern
22
-
23
17
  # define here available options for filtering
24
18
  OPTIONS = [:version, :url, :perform_api_call, :api_key, :secret_key]
25
19
 
26
20
  NON_JSON_URLS = ['v3/send/message'] # urls that don't accept JSON input
21
+ DATA_URLS = ['plain', 'csv'] # url for send binary data , 'CSVError/text:csv'
27
22
 
28
- included do
29
- cattr_accessor :resource_path, :public_operations, :read_only, :filters, :resourceprop, :action, :non_json_urls, :version
30
- cattr_writer :connection
23
+ def self.included(base)
24
+ base.extend ClassMethods
25
+ base.class_eval do
26
+ cattr_accessor :resource_path, :public_operations, :read_only, :filters, :resourceprop, :read_only_attributes, :action, :non_json_urls, :version
27
+ cattr_writer :connection
31
28
 
32
- def self.connection(options = {})
33
- class_variable_get(:@@connection) || default_connection(options)
34
- end
29
+ self.read_only_attributes = []
35
30
 
36
- def self.default_connection(options = {})
37
- Mailjet::Connection.new(
38
- "#{options[:url]}/#{options[:version]}/#{resource_path}",
39
- options[:api_key] || Mailjet.config.api_key,
40
- options[:secret_key] || Mailjet.config.secret_key,
41
- public_operations: public_operations,
42
- read_only: read_only,
43
- perform_api_call: options[:perform_api_call])
44
- end
31
+ def self.connection(options = {})
32
+ class_variable_get(:@@connection) || default_connection(options)
33
+ end
45
34
 
46
- def self.default_headers
47
- if NON_JSON_URLS.include?(self.resource_path) # don't use JSON if Send API
48
- default_headers = { accept: :json, accept_encoding: :deflate }
49
- else
50
- default_headers = { accept: :json, accept_encoding: :deflate, content_type: :json } #use JSON if *not* Send API
35
+ def self.default_connection(options = {})
36
+ Mailjet::Connection.new(
37
+ "#{options[:url]}/#{options[:version]}/#{resource_path}",
38
+ options[:api_key] || Mailjet.config.api_key,
39
+ options[:secret_key] || Mailjet.config.secret_key,
40
+ public_operations: public_operations,
41
+ read_only: read_only,
42
+ perform_api_call: options[:perform_api_call])
43
+ end
44
+
45
+ def self.default_headers
46
+ if NON_JSON_URLS.include?(self.resource_path) # don't use JSON if Send API
47
+ default_headers = { 'Accept' =>'application/json', 'Accept-Encoding' => 'deflate' }
48
+ elsif DATA_URLS.any? do |data_type|
49
+ default_headers = { 'Content-Type' => "text/#{data_type}" } if self.resource_path.include?(data_type)
50
+ end
51
+ else
52
+ # use JSON if *not* Send API
53
+ default_headers = {'Content-Type' =>'application/json', 'Accept' =>'application/json', 'Accept-Encoding' => 'deflate'}
54
+ end
55
+ return default_headers.merge!('User-Agent' => "mailjet-api-v3-ruby/#{Gem.loaded_specs["mailjet"].version}")
51
56
  end
52
- return default_headers.merge(user_agent: "mailjet-api-v3-ruby/#{Gem.loaded_specs["mailjet"].version}")
53
57
  end
54
58
  end
55
59
 
56
60
  module ClassMethods
57
61
  def first(params = {}, options = {})
58
62
  all(params.merge!(limit: 1), options).first
63
+ rescue Mailjet::ApiError => error
64
+ raise error
59
65
  end
60
66
 
61
67
  def all(params = {}, options = {})
62
68
  opts = define_options(options)
63
69
  params = format_params(params)
64
- response = connection(opts).get(default_headers.merge(params: params))
65
- attribute_array = parse_api_json(response)
70
+ response = connection(opts).get(default_headers.merge!(params: params))
71
+ attribute_array = parse_api_json(response.body)
66
72
  attribute_array.map{ |attributes| instanciate_from_api(attributes) }
73
+ rescue Mailjet::ApiError => error
74
+ raise error
67
75
  end
68
76
 
69
77
  def count(options = {})
70
78
  opts = define_options(options)
71
- response_json = connection(opts).get(default_headers.merge(params: {limit: 1, countrecords: 1}))
72
- response_hash = ActiveSupport::JSON.decode(response_json)
79
+ response_json = connection(opts).get(default_headers.merge!(params: {limit: 1, countrecords: 1}))
80
+ response_hash = Yajl::Parser.parse(response_json.body)
73
81
  response_hash['Total']
82
+ rescue Mailjet::ApiError => error
83
+ raise error
74
84
  end
75
85
 
76
86
  def find(id, job_id = nil, options = {})
87
+ normalized_id = if id.is_a? String
88
+ URI.encode_www_form_component(id)
89
+ else
90
+ id
91
+ end
92
+
77
93
  # if action method, ammend url to appropriate id
78
94
  opts = define_options(options)
79
- self.resource_path = create_action_resource_path(id, job_id) if self.action
80
- #
81
- attributes = parse_api_json(connection(opts)[id].get(default_headers)).first
95
+ self.resource_path = create_action_resource_path(normalized_id, job_id) if self.action
96
+
97
+ attributes = parse_api_json(connection(opts)[normalized_id].get(default_headers).body).first
82
98
  instanciate_from_api(attributes)
83
99
 
84
- rescue Mailjet::ApiError => e
100
+ rescue Mailjet::CommunicationError => e
85
101
  if e.code == 404
86
102
  nil
87
103
  else
@@ -89,10 +105,18 @@ module Mailjet
89
105
  end
90
106
  end
91
107
 
108
+
109
+ def find_by_id(id, options = {})
110
+ # if action method, ammend url to appropriate id
111
+ opts = define_options(options)
112
+ self.resource_path = create_action_resource_path(id) if self.action
113
+ connection(opts).get(default_headers)
114
+ end
115
+
92
116
  def create(attributes = {}, options = {})
93
117
  # if action method, ammend url to appropriate id
94
118
  opts = define_options(options)
95
- self.resource_path = create_action_resource_path(attributes[:id]) if self.action
119
+ self.resource_path = create_action_resource_path(attributes[:id]) if (self.action and attributes[:id])
96
120
  attributes.tap { |hs| hs.delete(:id) }
97
121
 
98
122
  if Mailjet.config.default_from and self.resource_path == 'send/'
@@ -106,9 +130,8 @@ module Mailjet
106
130
 
107
131
  self.new(attributes).tap do |resource|
108
132
  resource.save!(opts)
109
- resource.persisted = true
133
+ resource.attributes[:persisted] = true
110
134
  end
111
-
112
135
  end
113
136
 
114
137
  def delete(id, options = {})
@@ -116,14 +139,25 @@ module Mailjet
116
139
  opts = define_options(options)
117
140
  self.resource_path = create_action_resource_path(id) if self.action
118
141
  connection(opts)[id].delete(default_headers)
142
+ rescue Mailjet::ApiError => error
143
+ raise error
144
+ end
145
+
146
+ def send_data(id, binary_data = nil, options = {})
147
+ opts = define_options(options)
148
+ self.resource_path = create_action_resource_path(id) if self.action
149
+ response = connection(opts).post(binary_data, default_headers.merge({'Content-Length' => "#{binary_data.size}", 'Transfer-Encoding' => 'chunked'}))
150
+
151
+ response_hash = response.respond_to?(:body) ? Yajl::Parser.parse(response.body) : Yajl::Parser.parse(response)
152
+ response_hash['ID'] ? response_hash['ID'] : response_hash
119
153
  end
120
154
 
121
155
  def instanciate_from_api(attributes = {})
122
- self.new(attributes.merge(persisted: true))
156
+ self.new(attributes.merge!(persisted: true))
123
157
  end
124
158
 
125
159
  def parse_api_json(response_json)
126
- response_hash = ActiveSupport::JSON.decode(response_json)
160
+ response_hash = Yajl::Parser.parse(response_json)
127
161
 
128
162
  #Take the response from the API and put it through a method -- taken from the ActiveSupport library -- which converts
129
163
  #the date-time from "2014-05-19T15:31:09Z" to "Mon, 19 May 2014 15:31:09 +0000" format.
@@ -138,17 +172,17 @@ module Mailjet
138
172
  end
139
173
 
140
174
  def create_action_resource_path(id, job_id = nil)
141
- url_elements = self.resource_path.split("/")
142
- url_elements.delete_at(url_elements.length-1) if url_elements.last.to_i > 0 #if there is a trailing number for the job id from last call, delete it
175
+ url_elements = self.resource_path.split("/")
176
+ url_elements.delete_at(url_elements.length-1) if url_elements.last.to_i > 0 #if there is a trailing number for the job id from last call, delete it
143
177
 
144
- if !(url_elements[1] == "contacts" && self.action == "managemanycontacts")
145
- url_elements[2] = id.to_s
146
- end
178
+ if !(url_elements[1] == "contacts" && self.action == "managemanycontacts")
179
+ url_elements[2] = id.to_s
180
+ end
147
181
 
148
- url_elements << job_id.to_s if job_id #if job_id exists, amend it to end of the URI
149
- url = url_elements.join("/")
182
+ url_elements << job_id.to_s if job_id #if job_id exists, amend it to end of the URI
183
+ url = url_elements.join("/")
150
184
 
151
- return url
185
+ return url
152
186
  end
153
187
 
154
188
 
@@ -159,9 +193,9 @@ module Mailjet
159
193
  case data
160
194
  when nil
161
195
  nil
162
- when /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[T \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?))$/
196
+ when /^(?:\d{4}-\d{2}-\d{2}|\d{4}-\d{1,2}-\d{1,2}[T \t]+\d{1,2}:\d{2}:\d{2}(\.[0-9]*)?(([ \t]*)Z|[-+]\d{2}?(:\d{2})?))$/
163
197
  begin
164
- DateTime.parse(data)
198
+ DateTime.iso8601(data)
165
199
  rescue ArgumentError
166
200
  data
167
201
  end
@@ -250,9 +284,9 @@ module Mailjet
250
284
  if opts[:perform_api_call] && !persisted?
251
285
  # get attributes only for entity creation
252
286
  self.attributes = if self.resource_path == 'send'
253
- ActiveSupport::JSON.decode(response)
287
+ Yajl::Parser.parse(response.body)
254
288
  else
255
- parse_api_json(response).first
289
+ parse_api_json(response.body).first
256
290
  end
257
291
  end
258
292
 
@@ -292,7 +326,7 @@ module Mailjet
292
326
  save(opts)
293
327
  end
294
328
 
295
- def delete(call)
329
+ def delete
296
330
  self.class.delete(id)
297
331
  end
298
332
 
@@ -309,12 +343,15 @@ module Mailjet
309
343
  def formatted_payload
310
344
  payload = attributes.reject { |k,v| v.blank? }
311
345
  if persisted?
312
- payload = payload.slice(*resourceprop)
346
+ payload = payload.slice(*resourceprop.map(&:to_s))
347
+ .except(*read_only_attributes.map(&:to_s))
313
348
  end
314
349
  payload = camelcase_keys(payload)
315
350
  payload.tap { |hs| hs.delete("Persisted") }
316
351
  payload.inject({}) do |h, (k, v)|
317
- v = v.utc.as_json if v.respond_to? :utc
352
+ if v.respond_to? :utc
353
+ v = v.utc.to_s
354
+ end
318
355
  h.merge!({k => v})
319
356
  end
320
357
  end
@@ -337,20 +374,16 @@ module Mailjet
337
374
 
338
375
  def method_missing(method_symbol, *arguments) #:nodoc:
339
376
  method_name = method_symbol.to_s
340
- if method_name =~ /(=|\?)$/
341
- case $1
342
- when "="
343
- attributes[$`] = arguments.first
344
- when "?"
345
- attributes[$`]
346
- end
347
- else
348
- return attributes[method_name] if attributes.include?(method_name)
349
- # not set right now but we know about it
350
- # return nil if known_attributes.include?(method_name)
351
- super
377
+ if method_name.end_with?("=")
378
+ attributes[method_name.chop] = arguments.first
379
+ return
380
+ end
381
+
382
+ if attributes.include?(method_name)
383
+ return attributes[method_name]
352
384
  end
353
- end
354
385
 
386
+ super
387
+ end
355
388
  end
356
389
  end
@@ -1,7 +1,7 @@
1
1
  module Mailjet
2
2
  class Campaigndraft
3
3
  include Mailjet::Resource
4
- self.resource_path = 'v3/REST/campaigndraft'
4
+ self.resource_path = 'REST/campaigndraft'
5
5
  self.public_operations = [:get, :put, :post]
6
6
  self.filters = [:campaign, :contacts_list, :delivered_at, :edit_mode, :is_archived, :is_campaign, :is_deleted, :is_handled, :is_starred, :modified, :news_letter_template, :segmentation, :status, :subject, :template]
7
7
  self.resourceprop = [:campaign, :contacts_list, :created_at, :delivered_at, :edit_mode, :id, :is_starred, :is_text_part_included, :locale, :modified_at, :preset, :reply_email, :segmentation, :sender, :sender_email, :sender_name, :status, :subject, :template_id, :title, :url, :used, 'CampaignID', 'CampaignALT', 'ContactsListID', 'ContactsListALT', 'SegmentationID', 'SegmentationALT', :contacts_list_id,'TemplateID']
@@ -2,10 +2,26 @@ module Mailjet
2
2
  class Campaigndraft_detailcontent
3
3
  include Mailjet::Resource
4
4
  self.action = "detailcontent"
5
- self.resource_path = "v3/REST/campaigndraft/id/#{self.action}"
5
+ self.resource_path = "REST/campaigndraft/id/#{self.action}"
6
6
  self.public_operations = [:get, :post]
7
7
  self.filters = []
8
8
  self.resourceprop = [:text_part, :html_part, :headers, :mjml_content]
9
9
 
10
+ def self.find(id, job_id = nil, options = {})
11
+ opts = define_options(options)
12
+ self.resource_path = create_action_resource_path(id, job_id) if self.action
13
+
14
+ raw_data = parse_api_json(connection(opts)[id].get(default_headers).body)
15
+
16
+ raw_data.map do |entity|
17
+ instanciate_from_api(entity)
18
+ end
19
+ rescue Mailjet::CommunicationError => e
20
+ if e.code == 404
21
+ nil
22
+ else
23
+ raise e
24
+ end
25
+ end
10
26
  end
11
27
  end
@@ -2,7 +2,7 @@ module Mailjet
2
2
  class Campaigndraft_schedule
3
3
  include Mailjet::Resource
4
4
  self.action = "schedule"
5
- self.resource_path = "v3/REST/campaigndraft/id/#{self.action}"
5
+ self.resource_path = "REST/campaigndraft/id/#{self.action}"
6
6
  self.public_operations = [:post, :delete , :get]
7
7
  self.filters = []
8
8
  self.resourceprop = [:date]
@@ -2,7 +2,7 @@ module Mailjet
2
2
  class Campaigndraft_send
3
3
  include Mailjet::Resource
4
4
  self.action = "send"
5
- self.resource_path = "v3/REST/campaigndraft/id/#{self.action}"
5
+ self.resource_path = "REST/campaigndraft/id/#{self.action}"
6
6
  self.public_operations = [:post]
7
7
  self.filters = []
8
8
  self.resourceprop = []
@@ -2,7 +2,7 @@ module Mailjet
2
2
  class Campaigndraft_status
3
3
  include Mailjet::Resource
4
4
  self.action = 'status'
5
- self.resource_path = "v3/REST/campaigndraft/id/#{self.action}"
5
+ self.resource_path = "REST/campaigndraft/id/#{self.action}"
6
6
  self.public_operations = [:get]
7
7
  self.filters = []
8
8
  self.resourceprop = []
@@ -2,7 +2,7 @@ module Mailjet
2
2
  class Campaigndraft_test
3
3
  include Mailjet::Resource
4
4
  self.action = "test"
5
- self.resource_path = "v3/REST/campaigndraft/id/#{self.action}"
5
+ self.resource_path = "REST/campaigndraft/id/#{self.action}"
6
6
  self.public_operations = [:post]
7
7
  self.filters = []
8
8
  self.resourceprop = [:email, :name]
@@ -4,7 +4,16 @@ module Mailjet
4
4
  self.resource_path = 'REST/contact'
5
5
  self.public_operations = [:get, :put, :post]
6
6
  self.filters = [:campaign, :contacts_list, :is_unsubscribed, :last_activity_at, :recipient, :status]
7
- self.resourceprop = [:created_at, :delivered_count, :email, :id, :is_opt_in_pending, :is_spam_complaining, :last_activity_at, :last_update_at, :name, :unsubscribed_at, :unsubscribed_by]
8
-
7
+ self.resourceprop = [
8
+ :delivered_count,
9
+ :email,
10
+ :id,
11
+ :is_opt_in_pending,
12
+ :is_spam_complaining,
13
+ :name,
14
+ :unsubscribed_by,
15
+ :is_excluded_from_campaigns
16
+ ]
17
+ self.read_only_attributes = [:created_at, :last_activity_at, :last_update_at, :unsubscribed_at]
9
18
  end
10
19
  end
@@ -6,5 +6,22 @@ module Mailjet
6
6
  self.public_operations = [:get]
7
7
  self.filters = []
8
8
  self.resourceprop = []
9
+
10
+ def self.find(id, job_id = nil, options = {})
11
+ opts = define_options(options)
12
+ self.resource_path = create_action_resource_path(id, job_id) if self.action
13
+
14
+ raw_data = parse_api_json(connection(opts).get(default_headers).body)
15
+
16
+ raw_data.map do |entity|
17
+ instanciate_from_api(entity)
18
+ end
19
+ rescue Mailjet::CommunicationError => e
20
+ if e.code == 404
21
+ nil
22
+ else
23
+ raise e
24
+ end
25
+ end
9
26
  end
10
27
  end
@@ -0,0 +1,8 @@
1
+ module Mailjet
2
+ class ContactPii
3
+ include Mailjet::Resource
4
+ self.version = 'v4'
5
+ self.resource_path = 'contacts'
6
+ self.public_operations = [:delete]
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ module Mailjet
2
+ class ContactslistCsv
3
+ include Mailjet::Resource
4
+ self.action = "DATA/contactslist"
5
+ self.resource_path = "#{self.action}/id/CSVData/text:plain"
6
+ self.public_operations = [:post]
7
+ end
8
+ end
@@ -5,6 +5,5 @@ module Mailjet
5
5
  self.public_operations = [:get, :put, :post]
6
6
  self.filters = []
7
7
  self.resourceprop = [:alive_at, :contacts_list, :count, :current, :data_id, :errcount, :err_treshold, :id, :import_options, :job_end, :job_start, :method, :request_at, :status]
8
-
9
8
  end
10
9
  end
@@ -4,7 +4,8 @@ module Mailjet
4
4
  self.resource_path = 'REST/listrecipient'
5
5
  self.public_operations = [:get, :put, :post, :delete]
6
6
  self.filters = [:active, :blocked, :contact, :contact_email, :contacts_list, :last_activity_at, :list_name, :opened, :status, :unsub]
7
- self.resourceprop = [:contact, :id, :is_active, :is_unsubscribed, :list, :unsubscribed_at, :contact_id, :list_id, 'ContactID', 'ListID', 'ContactALT', 'ListALT']
7
+ self.resourceprop = [:contact, :id, :is_active, :is_unsubscribed, :list, :contact_id, :list_id, 'ContactID', 'ListID', 'ContactALT', 'ListALT']
8
8
 
9
+ self.read_only_attributes = [:subscribed_at, :unsubscribed_at]
9
10
  end
10
11
  end
@@ -8,5 +8,21 @@ module Mailjet
8
8
 
9
9
  self.read_only = true
10
10
 
11
+ def self.find(id, job_id = nil, options = {})
12
+ opts = define_options(options)
13
+ self.resource_path = create_action_resource_path(id, job_id) if self.action
14
+
15
+ raw_data = parse_api_json(connection(opts)[id].get(default_headers).body)
16
+
17
+ raw_data.map do |entity|
18
+ instanciate_from_api(entity)
19
+ end
20
+ rescue Mailjet::CommunicationError => e
21
+ if e.code == 404
22
+ nil
23
+ else
24
+ raise e
25
+ end
26
+ end
11
27
  end
12
28
  end
@@ -8,5 +8,22 @@ module Mailjet
8
8
 
9
9
  self.read_only = true
10
10
 
11
+ def self.find(id, job_id = nil, options = {})
12
+ opts = define_options(options)
13
+ self.resource_path = create_action_resource_path(id, job_id) if self.action
14
+
15
+ raw_data = parse_api_json(connection(opts)[id].get(default_headers).body)
16
+
17
+ raw_data.map do |entity|
18
+ instanciate_from_api(entity)
19
+ end
20
+ rescue Mailjet::CommunicationError => e
21
+ if e.code == 404
22
+ nil
23
+ else
24
+ raise e
25
+ end
26
+ end
27
+
11
28
  end
12
29
  end
@@ -4,7 +4,6 @@ module Mailjet
4
4
  self.resource_path = 'REST/newsletter'
5
5
  self.public_operations = [:get, :put, :post]
6
6
  self.filters = [:campaign, :contacts_list, :delivered_at, :edit_mode, :is_archived, :is_campaign, :is_deleted, :is_handled, :is_starred, :modified, :news_letter_template, :segmentation, :status, :subject]
7
- self.resourceprop = [:callback, :campaign, :contacts_list, :created_at, :delivered_at, :edit_mode, :edit_type, :footer, :footer_address, :footer_wysiwyg_type, :header_filename, :header_link, :header_text, :header_url, :id, :ip, :is_handled, :is_starred, :is_text_part_included, :locale, :modified_at, :permalink, :permalink_host, :permalink_wysiwyg_type, :politeness_mode, :reply_email, :segmentation, :sender, :sender_email, :sender_name, :status, :subject, :template, :test_address, :title, :url, 'CampaignID', 'CampaignALT', 'ContactsListID', 'ContactsListALT', 'SegmentationID', 'SegmentationALT', :contacts_list_id]
8
-
7
+ self.resourceprop = [:callback, :campaign, :contacts_list, :created_at, :delivered_at, :edit_mode, :edit_type, :footer, :footer_address, :footer_wysiwyg_type, :header_filename, :header_link, :header_text, :header_url, :id, :ip, :is_handled, :is_starred, :is_text_part_included, :locale, :modified_at, :permalink, :permalink_host, :permalink_wysiwyg_type, :politeness_mode, :reply_email, :segmentation, :segmentation_id, :sender, :sender_email, :sender_name, :status, :subject, :template, :test_address, :title, :url, 'CampaignID', 'CampaignALT', 'ContactsListID', 'ContactsListALT', 'SegmentationID', 'SegmentationALT', :contacts_list_id]
9
8
  end
10
9
  end
@@ -8,5 +8,22 @@ module Mailjet
8
8
 
9
9
  self.read_only = true
10
10
 
11
+ def self.find(id, job_id = nil, options = {})
12
+ opts = define_options(options)
13
+ self.resource_path = create_action_resource_path(id, job_id) if self.action
14
+
15
+ raw_data = parse_api_json(connection(opts)[id].get(default_headers).body)
16
+
17
+ raw_data.map do |entity|
18
+ instanciate_from_api(entity)
19
+ end
20
+ rescue Mailjet::CommunicationError => e
21
+ if e.code == 404
22
+ nil
23
+ else
24
+ raise e
25
+ end
26
+ end
27
+
11
28
  end
12
29
  end
@@ -0,0 +1,8 @@
1
+ module Mailjet
2
+ class RetrieveErrosCsv
3
+ include Mailjet::Resource
4
+ self.action = "DATA/BatchJob"
5
+ self.resource_path = "#{self.action}/id/CSVError/text:csv"
6
+ self.public_operations = [:get]
7
+ end
8
+ end
@@ -1,7 +1,7 @@
1
1
  module Mailjet
2
2
  class Send
3
3
  include Mailjet::Resource
4
- # self.version = 'v3.1'
4
+
5
5
  self.resource_path = 'send'
6
6
  self.public_operations = [:post]
7
7
  end
@@ -0,0 +1,33 @@
1
+ module Mailjet
2
+ class Statcounters
3
+ include Mailjet::Resource
4
+ self.resource_path = 'REST/statcounters'
5
+ self.public_operations = [:get]
6
+ self.filters = [:source_id, :counter_resolution, :counter_source, :counter_timing]
7
+ self.resourceprop = [
8
+ :api_key_id,
9
+ :event_click_delay,
10
+ :event_clicked_count,
11
+ :event_open_delay,
12
+ :event_opened_count,
13
+ :event_spam_count,
14
+ :event_unsubscribed_count,
15
+ :event_workflow_exited_count,
16
+ :message_blocked_count,
17
+ :message_clicked_count,
18
+ :message_deferred_count,
19
+ :message_hard_bounced_count,
20
+ :message_opened_count,
21
+ :message_queued_count,
22
+ :message_sent_count,
23
+ :message_soft_bounced_count,
24
+ :message_spam_count,
25
+ :message_unsubscribed_count,
26
+ :message_work_flow_exited_count,
27
+ :source_id,
28
+ :timeslice,
29
+ :total,
30
+ ]
31
+ self.read_only = true
32
+ end
33
+ end
@@ -0,0 +1,12 @@
1
+ module Mailjet
2
+ class Statistics_linkclick
3
+ include Mailjet::Resource
4
+ self.resource_path = 'REST/statistics/link-click'
5
+ self.public_operations = [:get]
6
+ self.filters = [:campaign_id]
7
+ self.resourceprop = [:url, :position_index, :clicked_messages_count, :clicked_events_count]
8
+
9
+ self.read_only = true
10
+
11
+ end
12
+ end
@@ -1,10 +1,26 @@
1
1
  module Mailjet
2
2
  class Template_detailcontent
3
3
  include Mailjet::Resource
4
- self.resource_path = 'REST/template/id/${self.action}'
5
- self.public_operations = [:get, :put, :post, :delete]
4
+ self.action = 'detailcontent'
5
+ self.resource_path = "REST/template/id/#{self.action}"
6
+ self.public_operations = [:get,:post]
6
7
  self.filters = [:api_key, :categories, :categories_selection_method, :edit_mode, :name, :owner_type, :purposes, :purposes_selection_method, :user]
7
8
  self.resourceprop = [:author, :categories, :copyright, :description, :edit_mode, :is_starred, :name, :owner_type, :presets, :purposes]
8
9
 
10
+ def self.find(id, options = {})
11
+ self.resource_path = create_action_resource_path(id)
12
+
13
+ opts = define_options(options)
14
+ response = connection(opts).get(default_headers)
15
+ attributes = parse_api_json(response.body).first
16
+
17
+ instanciate_from_api(attributes)
18
+ rescue Mailjet::CommunicationError => e
19
+ if e.code == 404
20
+ nil
21
+ else
22
+ raise e
23
+ end
24
+ end
9
25
  end
10
26
  end
@@ -1,3 +1,3 @@
1
1
  module Mailjet
2
- VERSION = "1.5.4"
2
+ VERSION = "1.8.0"
3
3
  end