emarsys 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.
Files changed (59) hide show
  1. data/.gitignore +18 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +11 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +171 -0
  6. data/Rakefile +7 -0
  7. data/emarsys.gemspec +25 -0
  8. data/lib/emarsys.rb +60 -0
  9. data/lib/emarsys/client.rb +40 -0
  10. data/lib/emarsys/data_object.rb +78 -0
  11. data/lib/emarsys/data_objects/condition.rb +20 -0
  12. data/lib/emarsys/data_objects/contact.rb +121 -0
  13. data/lib/emarsys/data_objects/contact_list.rb +47 -0
  14. data/lib/emarsys/data_objects/email.rb +133 -0
  15. data/lib/emarsys/data_objects/email_category.rb +20 -0
  16. data/lib/emarsys/data_objects/email_launch_status.rb +38 -0
  17. data/lib/emarsys/data_objects/email_status_code.rb +39 -0
  18. data/lib/emarsys/data_objects/event.rb +44 -0
  19. data/lib/emarsys/data_objects/export.rb +22 -0
  20. data/lib/emarsys/data_objects/field.rb +39 -0
  21. data/lib/emarsys/data_objects/file.rb +39 -0
  22. data/lib/emarsys/data_objects/folder.rb +24 -0
  23. data/lib/emarsys/data_objects/form.rb +21 -0
  24. data/lib/emarsys/data_objects/language.rb +20 -0
  25. data/lib/emarsys/data_objects/segment.rb +21 -0
  26. data/lib/emarsys/data_objects/source.rb +40 -0
  27. data/lib/emarsys/error.rb +24 -0
  28. data/lib/emarsys/extensions.rb +8 -0
  29. data/lib/emarsys/field_mapping.rb +55 -0
  30. data/lib/emarsys/params_converter.rb +29 -0
  31. data/lib/emarsys/request.rb +46 -0
  32. data/lib/emarsys/response.rb +24 -0
  33. data/lib/emarsys/version.rb +3 -0
  34. data/spec/emarsys/client_spec.rb +85 -0
  35. data/spec/emarsys/data_object_spec.rb +55 -0
  36. data/spec/emarsys/data_objects/condition_spec.rb +9 -0
  37. data/spec/emarsys/data_objects/contact_list_spec.rb +9 -0
  38. data/spec/emarsys/data_objects/contact_spec.rb +79 -0
  39. data/spec/emarsys/data_objects/email_category_spec.rb +9 -0
  40. data/spec/emarsys/data_objects/email_launch_status_spec.rb +25 -0
  41. data/spec/emarsys/data_objects/email_spec.rb +84 -0
  42. data/spec/emarsys/data_objects/email_status_code_spec.rb +25 -0
  43. data/spec/emarsys/data_objects/event_spec.rb +23 -0
  44. data/spec/emarsys/data_objects/export_spec.rb +9 -0
  45. data/spec/emarsys/data_objects/field_spec.rb +19 -0
  46. data/spec/emarsys/data_objects/file_spec.rb +29 -0
  47. data/spec/emarsys/data_objects/folder_spec.rb +13 -0
  48. data/spec/emarsys/data_objects/form_spec.rb +9 -0
  49. data/spec/emarsys/data_objects/language_spec.rb +9 -0
  50. data/spec/emarsys/data_objects/segment_spec.rb +9 -0
  51. data/spec/emarsys/data_objects/source_spec.rb +25 -0
  52. data/spec/emarsys/extensions_spec.rb +24 -0
  53. data/spec/emarsys/field_mapping_spec.rb +14 -0
  54. data/spec/emarsys/params_converter_spec.rb +52 -0
  55. data/spec/emarsys/request_spec.rb +27 -0
  56. data/spec/emarsys/response_spec.rb +35 -0
  57. data/spec/emarsys_spec.rb +22 -0
  58. data/spec/spec_helper.rb +28 -0
  59. metadata +178 -0
@@ -0,0 +1,20 @@
1
+ module Emarsys
2
+
3
+ # Methods for the Condition API
4
+ #
5
+ #
6
+ class Condition < DataObject
7
+ class << self
8
+
9
+ # List conditions
10
+ #
11
+ # @return [Hash] List of conditions
12
+ # @example
13
+ # Emarsys::Condition.collection
14
+ def collection
15
+ get 'condition', {}
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,121 @@
1
+ module Emarsys
2
+
3
+ # Methods for the Contact API
4
+ #
5
+ #
6
+ class Contact < DataObject
7
+ class << self
8
+
9
+ # Create a new contact. The given params are transformed to emarsys ids.
10
+ #
11
+ # @param key_id [Integer, String] internal id of key field
12
+ # @param key_value [Integer, String] value of interal id field
13
+ # @param params [Hash] Contact information to create
14
+ # @return [Hash] internal id of the contact
15
+ # @example
16
+ # Emarsys::Contact.create('app_id', 23, {:firstname => "Jon", :lastname => "Doe"})
17
+ # Emarsys::Contact.create('3', 'john.doe@example.com', {'1' => "Jon", '2' => "Doe"})
18
+ def create(key_id, key_value, params = {})
19
+ transformed_key_id = transform_key_id(key_id)
20
+ post "contact", params.merge!({'key_id' => transformed_key_id, transformed_key_id => key_value})
21
+ end
22
+
23
+ # Get the interal emarsys id of a contact. The given params are transformed to emarsys ids.
24
+ #
25
+ # @param key_id [Integer, String] internal id of key field
26
+ # @param key_value [Integer, String] value of interal id field
27
+ # @return [Hash] internal emarsys id of the contact
28
+ # @example
29
+ # Emarsys::Contact.emarsys_id('email', 'john.dow@example.com')
30
+ # Emarsys::Contact.emarsys_id(1, 'John')
31
+ def emarsys_id(key_id, key_value)
32
+ get "contact/#{transform_key_id(key_id).to_s}=#{key_value.to_s}", {}
33
+ end
34
+
35
+ # Update a contact. The given params are transformed to emarsys ids.
36
+ #
37
+ # @param key_id [Integer, String] internal id of key field
38
+ # @param key_value [Integer, String] value of interal id field
39
+ # @param params [Hash] Contact information to update
40
+ # @return [Hash] internal id of the contact
41
+ # @example
42
+ # Emarsys::Contact.update('app_id', 23, {:firstname => "Jon", :lastname => "Doe"})
43
+ # Emarsys::Contact.update('3', 'john.doe@example.com', {'1' => "Jon", '2' => "Doe"})
44
+ def update(key_id, key_value, params = {})
45
+ transformed_key_id = transform_key_id(key_id)
46
+ put "contact", params.merge!({'key_id' => transformed_key_id, transformed_key_id => key_value})
47
+ end
48
+
49
+ # Batch creation of contacts.
50
+ #
51
+ # @param key_id [Integer, String] internal id of key field
52
+ # @param params [Hash] Contact information of each new contact
53
+ # @example
54
+ # Emarsys::Contact.create_batch(
55
+ # 'email', {:app_id => 1, :firstname => "Jon", :lastname => "Doe"},
56
+ # {:app_id => 2, :firstname => "Jane", :lastname => "Doe"}
57
+ # )
58
+ #
59
+ # TODO params should be parameterized with field mappings
60
+ def create_batch(key_id, params = [])
61
+ post "contact", {'key_id' => transform_key_id(key_id), 'contacts' => params}
62
+ end
63
+
64
+ # Batch update of contacts.
65
+ #
66
+ # @param key_id [Integer, String] internal id of key field
67
+ # @param params [Hash] Contact information of each new contact
68
+ # @example
69
+ # Emarsys::Contact.update_batch(
70
+ # 'email', {:app_id => 1, :firstname => "Jon", :lastname => "Doe"},
71
+ # {:app_id => 2, :firstname => "Jane", :lastname => "Doe"}
72
+ # )
73
+ #
74
+ # TODO params should be parameterized with field mappings
75
+ def update_batch(key_id, params = [])
76
+ put "contact", {'key_id' => transform_key_id(key_id), 'contacts' => params}
77
+ end
78
+
79
+ # Get list of emails send to a contact
80
+ #
81
+ # @param contact_ids_array [array] Array of contact ids
82
+ # @return [Hash] result data
83
+ # @example
84
+ # Emarsys::Contact.contact_history([1,2,3]
85
+ def contact_history(contact_ids_array)
86
+ post "contact/getcontacthistory", {'contacts' => contact_ids_array}
87
+ end
88
+
89
+ # Get contact data by custom search
90
+ #
91
+ # @param key_id [Integer, String] Array of contact ids
92
+ # @param key_values [array] Array of key field values
93
+ # @param fields [array] requested fields. If empty, all are considered
94
+ # @return [Hash] result data
95
+ # @example
96
+ # Emarsys::Contact.search('3', ['john.doe@example.com'], [1,2,3]
97
+ #
98
+ # TODO transform fields to numeric fields
99
+ def search(key_id, key_values = [], fields = [])
100
+ post "contact/getdata", {'keyId' => key_id, 'keyValues' => key_values, 'fields' => fields}
101
+ end
102
+
103
+ # Exports the selected fields of contacts whoch registered in the specified time range
104
+ #
105
+ # @param params [hash] hash of parameters according to emarsys API
106
+ # @return [Hash] result data
107
+ # @example
108
+ # Emarsys::Contact.export_registrations(distribution_method: 'local', time_range: ["2013-01-01","2013-12-31"], contact_fields: [1,2,3])
109
+ def export_registrations(params = {})
110
+ post "contact/getregistrations", params
111
+ end
112
+
113
+ # @private
114
+ def transform_key_id(key_id)
115
+ matching_attributes = Emarsys::FieldMapping::ATTRIBUTES.find{|elem| elem[:identifier] == key_id.to_s}
116
+ matching_attributes.nil? ? key_id : matching_attributes[:id]
117
+ end
118
+
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,47 @@
1
+ module Emarsys
2
+
3
+ # Methods for the ContactList API
4
+ #
5
+ #
6
+ class ContactList < DataObject
7
+ class << self
8
+
9
+ # List contact lists
10
+ #
11
+ # @return [Hash] List of contact_lists
12
+ # @example
13
+ # Emarsys::ContactList.collection
14
+ def collection
15
+ get 'contactlist', {}
16
+ end
17
+
18
+ # Create a new contact list
19
+ #
20
+ # @param params [Hash] Contact list information to create
21
+ # @option params [String] :name Name of the list
22
+ # @option params [String] :description Detailed description of the list
23
+
24
+ # @return [Hash] internal id of the contact list
25
+ # @example
26
+ # Emarsys::ContactList.create(key_id: "3", name: 'Test-Liste', description: 'Something')
27
+ def create(params = {})
28
+ post "contactlist", params
29
+ end
30
+
31
+ # Add a contacts to a specific contact list
32
+ #
33
+ # This cannot be an instance method, because the API does not allow to retrieve a single resource. How crappy is that?
34
+ def add_contacts(contact_list_id, key_id, external_ids = [])
35
+ post "contactlist/#{contact_list_id}/add", {'key_id' => key_id, 'external_ids' => external_ids}
36
+ end
37
+
38
+ # Remove contacts from a specific contact list
39
+ #
40
+ # This cannot be an instance method, because the API does not allow to retrieve a single resource. How crappy is that?
41
+ def remove_contacts(contact_list_id, key_id, external_ids = [])
42
+ post "contactlist/#{contact_list_id}/remove", {'key_id' => key_id, 'external_ids' => external_ids}
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,133 @@
1
+ module Emarsys
2
+
3
+ # Methods for the Email API
4
+ #
5
+ #
6
+ class Email < DataObject
7
+ class << self
8
+
9
+ # List email campaigns
10
+ #
11
+ # @param params [Hash] Optional filter for the emails
12
+ # @option params [String] :status filter by status
13
+ # @option params [String] :contactlist filter by contactlist
14
+ # @return [Hash] List of emails
15
+ # @example
16
+ # Emarsys::Email.collection
17
+ # Emarsys::Email.collection(:status => 3)
18
+ # Emarsys::Email.collection(:contactlist => 5)
19
+ def collection(params = {})
20
+ get 'email', params
21
+ end
22
+
23
+ # Get Email attirbutes of a specific email
24
+ #
25
+ # @param id [Integer, String] The internal id of an email
26
+ # @return [Hash] Attributes hash
27
+ # @example
28
+ # Emarsys::Email.resource(1)
29
+ def resource(id)
30
+ get "email/#{id}", {}
31
+ end
32
+
33
+ # Create a new email campaign
34
+ #
35
+ # @param params [Hash] Email information to create
36
+ # @option params [String] :name Name of the email campagin
37
+ # @option params [String] :language Language Code
38
+ # @option params [String] :fromemail sets the from-header email
39
+ # @option params [String] :fromname sets the from-header name
40
+ # @option params [String] :subject Subject of the email
41
+ # @option params [Integer] :email_category associated Email-Category-Id
42
+ # @option params [Integer] :segment associated Segment-id
43
+ # @option params [Integer] :contactlist associated Contactlist-id
44
+ # @option params [String] :html_source
45
+ # @option params [String] :text_source
46
+ # @option params [Integer] :unsubscribe (optional)
47
+ # @option params [Integer] :browse (optional)
48
+ # @return [Hash] internal id of the campaign
49
+ # @example
50
+ # Emarsys::Email.create(
51
+ # name: 'Test', language: 'de', fromemail: 'john.doe@example.com', fromname: 'John Doe',
52
+ # subject: 'Test Subject', :email_category: 3, segment: 1121, contactlist: 0,
53
+ # html_source: '<h1>Test</h1>', text_source: 'Test'
54
+ # )
55
+ def create(params = {})
56
+ post "email", params
57
+ end
58
+
59
+ # Launches an email
60
+ #
61
+ # @param id [Integer, String] Internal email id
62
+ # @param params [hash] Optional launch parmeters
63
+ # @option params [Datetime] :schedule launch time
64
+ # @option params [String] :timezone
65
+ # @return [Hash] Result data
66
+ # @example
67
+ # Emarsys::Email.launch(1)
68
+ def launch(id, params = {})
69
+ post "email/#{id}/launch", params
70
+ end
71
+
72
+ # Preview an email
73
+ #
74
+ # @param id [Integer, String] Internal email id
75
+ # @param version [String] 'html' or 'text' version
76
+ # @return [Hash] Result data
77
+ # @example
78
+ # Emarsys::Email.preview(1)
79
+ def preview(id, version = 'html')
80
+ post "email/#{id}/preview", {:version => version}
81
+ end
82
+
83
+ # View response summary of an email
84
+ #
85
+ # @param id [Integer, String] Internal email id
86
+ # @return [Hash] Result data
87
+ # @example
88
+ # Emarsys::Email.response_summary(1)
89
+ def response_summary(id)
90
+ get "email/#{id}/responsesummary", {}
91
+ end
92
+
93
+ # Instruct emarsys to send a test mail
94
+ #
95
+ # @param id [Integer, String] Internal email id
96
+ # @param params [hash] recipient parmeters
97
+ # @option params [String] :recipientlist email_addresses separated by ';'
98
+ # @option params [Integer] :segment_id custom segement id
99
+ # @option params [Integer] :contactlist_id custom contactlist id
100
+ # Only one of the three parameters must be sent.
101
+ #
102
+ # @return [Hash] Result data
103
+ # @example
104
+ # Emarsys::Email.send_test_mail(1, {:recipientlist => 'john.doe@example.com;jane.doe@example.com'})
105
+ def send_test_mail(id, params = {})
106
+ post "email/#{id}/sendtestmail", params
107
+ end
108
+
109
+ # Returns the delivery status of an email
110
+ #
111
+ # @param id [Integer, String] Internal email id
112
+ # @param params [hash] recipient parmeters
113
+ # @option params [String] 'lastId'
114
+ # @option params [Integer] 'launchId'
115
+ # @return [Hash] Result data
116
+ # @example
117
+ # Emarsys::Email.delivery_status(1)
118
+ def delivery_status(id, params = {})
119
+ post "email/#{id}/getdeliverystatus", params
120
+ end
121
+
122
+ # TODO POST /getlaunchesofemail
123
+ def email_launches(id)
124
+ raise "Not implemented yet"
125
+ end
126
+
127
+ # TODO POST /getresponses
128
+ def export_responses(params = {})
129
+ raise "Not implemented yet"
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,20 @@
1
+ module Emarsys
2
+
3
+ # Methods for the EmailCategory API
4
+ #
5
+ #
6
+ class EmailCategory < DataObject
7
+ class << self
8
+
9
+ # List email categories
10
+ #
11
+ # @return [Hash] List of email_categories
12
+ # @example
13
+ # Emarsys::EmailCategory.collection
14
+ def collection
15
+ get 'emailcategory', {}
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,38 @@
1
+ module Emarsys
2
+
3
+ # Internal helper class for valid email launch status.
4
+ # Emarsys has no implementation for this data resource.
5
+ #
6
+ class EmailLaunchStatus < DataObject
7
+
8
+ CODES = [
9
+ {'0' => 'Not launched'},
10
+ {'1' => 'Launch called via API, launching in Progress'},
11
+ {'2' => 'Email launched or scheduled for future launch'},
12
+ {'10' => 'Error (details in api_error)'}
13
+ ]
14
+
15
+ class << self
16
+
17
+ # List email launch status codes
18
+ #
19
+ # @return [Hash] List of email launch status
20
+ # @example
21
+ # Emarsys::EmailLaunchStatus.collection
22
+ def collection
23
+ CODES
24
+ end
25
+
26
+ # Get a specific email launch status
27
+ #
28
+ # @param [Integer, String] id of the code
29
+ # @return [Hash] Key-Value-Pair of the launch code
30
+ # @example
31
+ # Emarsys::EmailLaunchStatus.resource('1')
32
+ def resource(id)
33
+ CODES.select{|hash| hash.has_key?(id.to_s)}[0]
34
+ end
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ module Emarsys
2
+
3
+ # Internal helper class for valid email status codes.
4
+ # Emarsys has no implementation for this data resource.
5
+ #
6
+ class EmailStatusCode < DataObject
7
+
8
+ CODES = [
9
+ {'1' => 'In design'},
10
+ {'2' => 'Tested'},
11
+ {'3' => 'Launched'},
12
+ {'4' => 'Ready to launch'},
13
+ {'-3' => 'Deactivated'}
14
+ ]
15
+
16
+ class << self
17
+
18
+ # List email status codes
19
+ #
20
+ # @return [Hash] List of email status codes
21
+ # @example
22
+ # Emarsys::EmailStatusCode.collection
23
+ def collection
24
+ CODES
25
+ end
26
+
27
+ # Get a specific email status codes
28
+ #
29
+ # @param [Integer, String] id of the code
30
+ # @return [Hash] Key-Value-Pair of the status code
31
+ # @example
32
+ # Emarsys::EmailStatusCode.resource('1')
33
+ def resource(id)
34
+ CODES.select{|hash| hash.has_key?(id.to_s)}[0]
35
+ end
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,44 @@
1
+ module Emarsys
2
+
3
+ # Methods for the Event API
4
+ #
5
+ #
6
+ class Event < DataObject
7
+
8
+ class << self
9
+
10
+ # List events
11
+ #
12
+ # @return [Hash] List of events
13
+ # @example
14
+ # Emarsys::Event.collection
15
+ def collection
16
+ get 'event', {}
17
+ end
18
+
19
+ # Trigger an external event
20
+ #
21
+ # @param event_id [Integer, String] The internal emarsys id
22
+ # @param key_id [Integer, String] The identifer of the key field (e.g. 3 for 'email')
23
+ # @param external_id [String] The id of the given filed specified with key_id (e.g. 'test@example.com')
24
+ # @option data [Hash] data hash for transactional mails
25
+ # @return [Hash] Result data
26
+ # @example
27
+ # Emarsys::Event.trigger(2, 3, 'test@example.com')
28
+ # Emarsys::Event.trigger(2, 'user_id', 57687, {:global => {:name => "Special Name"}})
29
+ def trigger(event_id, key_id, external_id, data = {})
30
+ transformed_key_id = transform_key_id(key_id)
31
+ params = {:key_id => transformed_key_id, :external_id => external_id}
32
+ params.merge!(:data => data) if not data.empty?
33
+ post "event/#{event_id}/trigger", params
34
+ end
35
+
36
+ # @private
37
+ def transform_key_id(key_id)
38
+ matching_attributes = Emarsys::FieldMapping::ATTRIBUTES.find{|elem| elem[:identifier] == key_id.to_s}
39
+ matching_attributes.nil? ? key_id : matching_attributes[:id]
40
+ end
41
+ end
42
+
43
+ end
44
+ end