exact-target-api 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +41 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +62 -0
  7. data/Rakefile +1 -0
  8. data/exact-target-api.gemspec +22 -0
  9. data/lib/exact-target-api.rb +43 -0
  10. data/lib/exact-target-api/base_object.rb +28 -0
  11. data/lib/exact-target-api/bounce_event.rb +8 -0
  12. data/lib/exact-target-api/campaign.rb +19 -0
  13. data/lib/exact-target-api/click_event.rb +8 -0
  14. data/lib/exact-target-api/client.rb +175 -0
  15. data/lib/exact-target-api/constructor.rb +34 -0
  16. data/lib/exact-target-api/content_area.rb +8 -0
  17. data/lib/exact-target-api/continue.rb +33 -0
  18. data/lib/exact-target-api/continue_rest.rb +24 -0
  19. data/lib/exact-target-api/create_wsdl.rb +53 -0
  20. data/lib/exact-target-api/cud_support.rb +19 -0
  21. data/lib/exact-target-api/cud_support_rest.rb +72 -0
  22. data/lib/exact-target-api/data_extension.rb +226 -0
  23. data/lib/exact-target-api/delete.rb +38 -0
  24. data/lib/exact-target-api/delete_rest.rb +18 -0
  25. data/lib/exact-target-api/describe.rb +25 -0
  26. data/lib/exact-target-api/email.rb +8 -0
  27. data/lib/exact-target-api/folder.rb +8 -0
  28. data/lib/exact-target-api/get.rb +64 -0
  29. data/lib/exact-target-api/get_rest.rb +25 -0
  30. data/lib/exact-target-api/get_support.rb +23 -0
  31. data/lib/exact-target-api/get_support_rest.rb +86 -0
  32. data/lib/exact-target-api/list.rb +68 -0
  33. data/lib/exact-target-api/list_subscriber.rb +10 -0
  34. data/lib/exact-target-api/open_event.rb +8 -0
  35. data/lib/exact-target-api/patch.rb +39 -0
  36. data/lib/exact-target-api/patch_rest.rb +19 -0
  37. data/lib/exact-target-api/post.rb +34 -0
  38. data/lib/exact-target-api/post_rest.rb +19 -0
  39. data/lib/exact-target-api/sent_event.rb +8 -0
  40. data/lib/exact-target-api/subscriber.rb +81 -0
  41. data/lib/exact-target-api/triggered_send.rb +15 -0
  42. data/lib/exact-target-api/unsub_event.rb +8 -0
  43. data/lib/exact-target-api/version.rb +3 -0
  44. metadata +113 -0
@@ -0,0 +1,34 @@
1
+ module ET
2
+ class Constructor
3
+ attr_accessor :status, :code, :message, :results, :request_id, :moreResults
4
+
5
+ def initialize(response = nil, rest = false)
6
+ @results = []
7
+ if !response.nil? && !rest
8
+ envelope = response.hash[:envelope]
9
+ @body = envelope[:body]
10
+
11
+ if !response.soap_fault? || !response.http_error?
12
+ @code = response.http.code
13
+ @status = true
14
+ elsif response.soap_fault?
15
+ @code = response.http.code
16
+ @message = @body[:fault][:faultstring]
17
+ @status = false
18
+ elsif response.http_error?
19
+ @code = response.http.code
20
+ @status = false
21
+ end
22
+ elsif (@code = response.code)
23
+
24
+ @status = @code == "200"
25
+
26
+ begin
27
+ @results = JSON.parse(response.body)
28
+ rescue
29
+ @message = response.body
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,8 @@
1
+ module ET
2
+ class ContentArea < ET::CUDSupport
3
+ def initialize
4
+ super
5
+ @obj = 'ContentArea'
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ module ET
2
+ class Continue < ET::Constructor
3
+ def initialize(authStub, request_id)
4
+ @results = []
5
+ authStub.refreshToken
6
+ obj = {'ContinueRequest' => request_id}
7
+ response = authStub.auth.call(:retrieve, :message => {'RetrieveRequest' => obj})
8
+
9
+ super(response)
10
+
11
+ if @status then
12
+ if @body[:retrieve_response_msg][:overall_status] != "OK" && @body[:retrieve_response_msg][:overall_status] != "MoreDataAvailable" then
13
+ @status = false
14
+ @message = @body[:retrieve_response_msg][:overall_status]
15
+ end
16
+
17
+ @moreResults = false
18
+ if @body[:retrieve_response_msg][:overall_status] == "MoreDataAvailable" then
19
+ @moreResults = true
20
+ end
21
+
22
+ if (!@body[:retrieve_response_msg][:results].is_a? Hash) && (!@body[:retrieve_response_msg][:results].nil?) then
23
+ @results = @results + @body[:retrieve_response_msg][:results]
24
+ elsif (!@body[:retrieve_response_msg][:results].nil?)
25
+ @results.push(@body[:retrieve_response_msg][:results])
26
+ end
27
+
28
+ # Store the Last Request ID for use with continue
29
+ @request_id = @body[:retrieve_response_msg][:request_id]
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ module ET
2
+ class ContinueRest < ET::Constructor
3
+ def initialize(authStub, endpoint, qs = nil)
4
+ authStub.refreshToken
5
+
6
+ if qs
7
+ qs['access_token'] = authStub.authToken
8
+ else
9
+ qs = {"access_token" => authStub.authToken}
10
+ end
11
+
12
+ uri = URI.parse(endpoint)
13
+ uri.query = URI.encode_www_form(qs)
14
+ http = Net::HTTP.new(uri.host, uri.port)
15
+ http.use_ssl = true
16
+ request = Net::HTTP::Get.new(uri.request_uri)
17
+ requestResponse = http.request(request)
18
+
19
+ @moreResults = false
20
+
21
+ super(requestResponse, true)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,53 @@
1
+ module ET
2
+ class CreateWSDL
3
+ def initialize(path)
4
+ # Get the header info for the correct wsdl
5
+ response = HTTPI.head(@wsdl)
6
+ if response && response.code >= 200 && response.code <= 400
7
+ header = response.headers
8
+ # Check when the WSDL was last modified
9
+ modifiedTime = Date.parse(header['last-modified'])
10
+ p = wsdl_file(path)
11
+ # Check if a local file already exists
12
+ if File.file?(p) && File.readable?(p) && !File.zero?(p)
13
+ createdTime = File.new(p).mtime.to_date
14
+
15
+ # Check if the locally created WSDL older than the production WSDL
16
+ createIt = createdTime < modifiedTime
17
+ else
18
+ createIt = true
19
+ end
20
+
21
+ if createIt
22
+ res = open(@wsdl).read
23
+ File.open(p, 'w+') do |f|
24
+ f.write(res)
25
+ end
26
+ end
27
+
28
+ @status = response.code
29
+ else
30
+ @status = response.code
31
+ end
32
+
33
+ end
34
+
35
+ def wsdl_file(path)
36
+ path + '/ExactTargetWSDL.xml'
37
+ end
38
+
39
+ def stringify_keys!(params)
40
+ params.keys.each do |key|
41
+ params[key.to_s] = params.delete(key)
42
+ end
43
+ params
44
+ end
45
+
46
+ def symbolize_keys!(params)
47
+ params.keys.each do |key|
48
+ params[key.to_sym] = params.delete(key)
49
+ end
50
+ params
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,19 @@
1
+ module ET
2
+ class CUDSupport < ET::GetSupport
3
+ def initialize
4
+ super
5
+ end
6
+
7
+ def post(data)
8
+ ET::Post.new(@client, @obj, data)
9
+ end
10
+
11
+ def patch(data)
12
+ ET::Patch.new(@client, @obj, data)
13
+ end
14
+
15
+ def delete(data)
16
+ ET::Delete.new(@client, @obj, data)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,72 @@
1
+ module ET
2
+ class CUDSupportRest < ET::GetSupportRest
3
+ def initialize
4
+ super
5
+ end
6
+
7
+ def post
8
+ completeURL = @endpoint
9
+
10
+ if @props and @props.is_a? Hash then
11
+ @props.each do |k,v|
12
+ if @urlProps.include?(k) then
13
+ completeURL.sub!("{#{k}}", v)
14
+ end
15
+ end
16
+ end
17
+
18
+ @urlPropsRequired.each do |value|
19
+ if !@props || !@props.has_key?(value) then
20
+ raise "Unable to process request due to missing required prop: #{value}"
21
+ end
22
+ end
23
+
24
+ # Clean Optional Parameters from Endpoint URL first
25
+ @urlProps.each do |value|
26
+ completeURL.sub!("/{#{value}}", "")
27
+ end
28
+
29
+ ET::PostRest.new(@authStub, completeURL, @props)
30
+ end
31
+
32
+ def patch
33
+ completeURL = @endpoint
34
+ # All URL Props are required when doing Patch
35
+ @urlProps.each do |value|
36
+ if !@props || !@props.has_key?(value) then
37
+ raise "Unable to process request due to missing required prop: #{value}"
38
+ end
39
+ end
40
+
41
+ if @props and @props.is_a? Hash then
42
+ @props.each do |k,v|
43
+ if @urlProps.include?(k) then
44
+ completeURL.sub!("{#{k}}", v)
45
+ end
46
+ end
47
+ end
48
+
49
+ ET::PatchRest.new(@authStub, completeURL, @props)
50
+ end
51
+
52
+ def delete
53
+ completeURL = @endpoint
54
+ # All URL Props are required when doing Patch
55
+ @urlProps.each do |value|
56
+ if !@props || !@props.has_key?(value) then
57
+ raise "Unable to process request due to missing required prop: #{value}"
58
+ end
59
+ end
60
+
61
+ if @props and @props.is_a? Hash then
62
+ @props.each do |k,v|
63
+ if @urlProps.include?(k) then
64
+ completeURL.sub!("{#{k}}", v)
65
+ end
66
+ end
67
+ end
68
+
69
+ ET::DeleteRest.new(@authStub, completeURL)
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,226 @@
1
+ module ET
2
+ class DataExtension < ET::CUDSupport
3
+ attr_accessor :columns
4
+
5
+ def initialize
6
+ super
7
+ @obj = 'DataExtension'
8
+ end
9
+
10
+ def post
11
+ originalProps = @props
12
+
13
+ if @props.is_a? Array
14
+ multiDE = []
15
+ @props.each { |currentDE|
16
+ currentDE['Fields'] = {}
17
+ currentDE['Fields']['Field'] = []
18
+ currentDE['columns'].each { |key|
19
+ currentDE['Fields']['Field'].push(key)
20
+ }
21
+ currentDE.delete('columns')
22
+ multiDE.push(currentDE.dup)
23
+ }
24
+
25
+ @props = multiDE
26
+ else
27
+ @props['Fields'] = {'Field' => []}
28
+
29
+ @columns.each do |key|
30
+ @props['Fields']['Field'].push(key)
31
+ end
32
+ end
33
+
34
+ obj = super
35
+ @props = originalProps
36
+ obj
37
+ end
38
+
39
+ def patch
40
+ @props['Fields'] = {}
41
+ @props['Fields']['Field'] = []
42
+ @columns.each { |key|
43
+ @props['Fields']['Field'].push(key)
44
+ }
45
+ obj = super
46
+ @props.delete("Fields")
47
+ obj
48
+ end
49
+
50
+ class Column < ET::GetSupport
51
+ def initialize
52
+ super
53
+ @obj = 'DataExtensionField'
54
+ end
55
+
56
+ def get
57
+
58
+ if props and props.is_a? Array then
59
+ @props = props
60
+ end
61
+
62
+ if @props and @props.is_a? Hash then
63
+ @props = @props.keys
64
+ end
65
+
66
+ if filter and filter.is_a? Hash then
67
+ @filter = filter
68
+ end
69
+
70
+ fixCustomerKey = false
71
+ if filter and filter.is_a? Hash
72
+ @filter = filter
73
+ if @filter.has_key?("Property") && @filter["Property"] == "CustomerKey"
74
+ @filter["Property"] = "DataExtension.CustomerKey"
75
+ fixCustomerKey = true
76
+ end
77
+ end
78
+
79
+ obj = ET::Get.new(@authStub, @obj, @props, @filter)
80
+ @lastRequestID = obj.request_id
81
+
82
+ if fixCustomerKey then
83
+ @filter["Property"] = "CustomerKey"
84
+ end
85
+
86
+ obj
87
+ end
88
+ end
89
+
90
+ class Row < ET::CUDSupport
91
+ attr_accessor :Name, :CustomerKey
92
+
93
+ def initialize
94
+ super
95
+ @obj = "DataExtensionObject"
96
+ end
97
+
98
+ def get
99
+ getName
100
+ if props and props.is_a? Array then
101
+ @props = props
102
+ end
103
+
104
+ if @props and @props.is_a? Hash then
105
+ @props = @props.keys
106
+ end
107
+
108
+ if filter and filter.is_a? Hash then
109
+ @filter = filter
110
+ end
111
+
112
+ obj = ET::Get.new(@authStub, "DataExtensionObject[#{@Name}]", @props, @filter)
113
+ @lastRequestID = obj.request_id
114
+
115
+ obj
116
+ end
117
+
118
+ def post
119
+ getCustomerKey
120
+ originalProps = @props
121
+ currentProp = {}
122
+ ## FIX THIS
123
+ if @props.is_a? Array then
124
+ =begin
125
+ multiRow = []
126
+ @props.each { |currentDE|
127
+
128
+ currentDE['columns'].each { |key|
129
+ currentDE['Fields'] = {}
130
+ currentDE['Fields']['Field'] = []
131
+ currentDE['Fields']['Field'].push(key)
132
+ }
133
+ currentDE.delete('columns')
134
+ multiRow.push(currentDE.dup)
135
+ }
136
+
137
+ @props = multiRow
138
+ =end
139
+ else
140
+ currentFields = []
141
+
142
+ @props.each { |key,value|
143
+ currentFields.push({"Name" => key, "Value" => value})
144
+ }
145
+ currentProp['CustomerKey'] = @CustomerKey
146
+ currentProp['Properties'] = {}
147
+ currentProp['Properties']['Property'] = currentFields
148
+ end
149
+
150
+ obj = ET::Post.new(@authStub, @obj, currentProp)
151
+ @props = originalProps
152
+ obj
153
+ end
154
+
155
+ def patch
156
+ getCustomerKey
157
+ currentFields = []
158
+ currentProp = {}
159
+
160
+ @props.each { |key,value|
161
+ currentFields.push({"Name" => key, "Value" => value})
162
+ }
163
+ currentProp['CustomerKey'] = @CustomerKey
164
+ currentProp['Properties'] = {}
165
+ currentProp['Properties']['Property'] = currentFields
166
+
167
+ ET::Patch.new(@authStub, @obj, currentProp)
168
+ end
169
+
170
+ def delete
171
+ getCustomerKey
172
+ currentFields = []
173
+ currentProp = {}
174
+
175
+ @props.each { |key,value|
176
+ currentFields.push({"Name" => key, "Value" => value})
177
+ }
178
+ currentProp['CustomerKey'] = @CustomerKey
179
+ currentProp['Keys'] = {}
180
+ currentProp['Keys']['Key'] = currentFields
181
+
182
+ ET::Delete.new(@authStub, @obj, currentProp)
183
+ end
184
+
185
+ private
186
+
187
+ def getCustomerKey
188
+ if @CustomerKey.nil?
189
+ if @CustomerKey.nil? && @Name.nil?
190
+ raise 'Unable to process DataExtension::Row request due to CustomerKey and Name not being defined on ET::DatExtension::row'
191
+ else
192
+ de = ET::DataExtension.new
193
+ de.authStub = @authStub
194
+ de.props = ["Name","CustomerKey"]
195
+ de.filter = {'Property' => 'CustomerKey','SimpleOperator' => 'equals','Value' => @Name}
196
+ getResponse = de.get
197
+ if getResponse.status && (getResponse.results.length == 1) then
198
+ @CustomerKey = getResponse.results[0][:customer_key]
199
+ else
200
+ raise 'Unable to process DataExtension::Row request due to unable to find DataExtension based on Name'
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ def getName
207
+ if @Name.nil?
208
+ if @CustomerKey.nil? && @Name.nil?
209
+ raise 'Unable to process DataExtension::Row request due to CustomerKey and Name not being defined on ET::DatExtension::row'
210
+ else
211
+ de = ET::DataExtension.new
212
+ de.authStub = @authStub
213
+ de.props = ["Name","CustomerKey"]
214
+ de.filter = {'Property' => 'CustomerKey','SimpleOperator' => 'equals','Value' => @CustomerKey}
215
+ getResponse = de.get
216
+ if getResponse.status && getResponse.results.length == 1
217
+ @Name = getResponse.results[0][:name]
218
+ else
219
+ raise 'Unable to process DataExtension::Row request due to unable to find DataExtension based on CustomerKey'
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end
226
+ end