emarsys 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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