sfmc-fuelsdk-ruby 1.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 +28 -0
- data/Gemfile +3 -0
- data/Gemfile.lock +90 -0
- data/Guardfile +8 -0
- data/LICENSE.md +13 -0
- data/README.md +143 -0
- data/Rakefile +1 -0
- data/lib/marketingcloudsdk/client.rb +296 -0
- data/lib/marketingcloudsdk/http_request.rb +118 -0
- data/lib/marketingcloudsdk/objects.rb +757 -0
- data/lib/marketingcloudsdk/rest.rb +118 -0
- data/lib/marketingcloudsdk/soap.rb +282 -0
- data/lib/marketingcloudsdk/targeting.rb +99 -0
- data/lib/marketingcloudsdk/utils.rb +47 -0
- data/lib/marketingcloudsdk/version.rb +39 -0
- data/lib/marketingcloudsdk.rb +74 -0
- data/lib/new.rb +1240 -0
- data/marketingcloudsdk.gemspec +30 -0
- data/samples/sample-AddSubscriberToList.rb +56 -0
- data/samples/sample-CreateAndStartDataExtensionImport.rb +29 -0
- data/samples/sample-CreateAndStartListImport.rb +27 -0
- data/samples/sample-CreateContentAreas.rb +48 -0
- data/samples/sample-CreateDataExtensions.rb +54 -0
- data/samples/sample-CreateProfileAttributes.rb +48 -0
- data/samples/sample-SendEmailToDataExtension.rb +23 -0
- data/samples/sample-SendEmailToList.rb +23 -0
- data/samples/sample-SendTriggeredSends.rb +30 -0
- data/samples/sample-bounceevent.rb +70 -0
- data/samples/sample-campaign.rb +211 -0
- data/samples/sample-clickevent.rb +71 -0
- data/samples/sample-contentarea.rb +122 -0
- data/samples/sample-dataextension.rb +209 -0
- data/samples/sample-directverb.rb +54 -0
- data/samples/sample-email.rb +122 -0
- data/samples/sample-email.senddefinition.rb +134 -0
- data/samples/sample-folder.rb +143 -0
- data/samples/sample-import.rb +103 -0
- data/samples/sample-list.rb +105 -0
- data/samples/sample-list.subscriber.rb +97 -0
- data/samples/sample-openevent.rb +70 -0
- data/samples/sample-profileattribute.rb +56 -0
- data/samples/sample-sentevent.rb +70 -0
- data/samples/sample-subscriber.rb +135 -0
- data/samples/sample-triggeredsend.rb +129 -0
- data/samples/sample-unsubevent.rb +72 -0
- data/samples/sample_helper.rb.template +10 -0
- data/spec/client_spec.rb +218 -0
- data/spec/default_values_fallback_spec.rb +30 -0
- data/spec/helper_funcs_spec.rb +11 -0
- data/spec/http_request_spec.rb +61 -0
- data/spec/objects_helper_spec.rb +32 -0
- data/spec/objects_spec.rb +484 -0
- data/spec/rest_spec.rb +48 -0
- data/spec/soap_spec.rb +140 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/targeting_spec.rb +44 -0
- metadata +262 -0
@@ -0,0 +1,118 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2013 ExactTarget, Inc.
|
3
|
+
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
7
|
+
|
8
|
+
following conditions are met:
|
9
|
+
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
11
|
+
|
12
|
+
following disclaimer.
|
13
|
+
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
15
|
+
|
16
|
+
following disclaimer in the documentation and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
19
|
+
|
20
|
+
products derived from this software without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
23
|
+
|
24
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
|
26
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
27
|
+
|
28
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
29
|
+
|
30
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
31
|
+
|
32
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
33
|
+
|
34
|
+
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
=end
|
36
|
+
|
37
|
+
module MarketingCloudSDK
|
38
|
+
module Rest
|
39
|
+
|
40
|
+
include MarketingCloudSDK::Targeting
|
41
|
+
|
42
|
+
def rest_client
|
43
|
+
self
|
44
|
+
end
|
45
|
+
|
46
|
+
def normalize_keys obj
|
47
|
+
if obj and obj.is_a? Hash
|
48
|
+
obj.keys.each do |k|
|
49
|
+
obj[(k.to_sym rescue k) || k] = obj.delete(k)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
obj
|
53
|
+
end
|
54
|
+
|
55
|
+
def get_url_properties url, properties
|
56
|
+
url_property_names = url.scan(/(%{(.+?)})/).collect{|frmt, name| name}
|
57
|
+
url_properties = {}
|
58
|
+
properties.keys.each do |k|
|
59
|
+
if url_property_names.include? k
|
60
|
+
url_properties[k] = properties.delete(k)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
url_properties
|
64
|
+
end
|
65
|
+
|
66
|
+
def complete_url url, url_properties
|
67
|
+
normalize_keys(url_properties)
|
68
|
+
url = url % url_properties if url_properties
|
69
|
+
url.end_with?('/') ? url.chop : url
|
70
|
+
rescue KeyError => ex
|
71
|
+
raise "#{ex.message} to complete #{url}"
|
72
|
+
end
|
73
|
+
|
74
|
+
def parse_properties url, properties
|
75
|
+
url_properties = get_url_properties url, properties
|
76
|
+
url = complete_url url, url_properties
|
77
|
+
[url, properties]
|
78
|
+
end
|
79
|
+
|
80
|
+
def rest_get url, properties={}
|
81
|
+
url, properties = parse_properties url, properties
|
82
|
+
rest_request :get, url, {'params' => properties}
|
83
|
+
end
|
84
|
+
|
85
|
+
def rest_delete url, properties={}
|
86
|
+
url, properties = parse_properties url, properties
|
87
|
+
rest_request :delete, url
|
88
|
+
end
|
89
|
+
|
90
|
+
def rest_patch url, properties={}
|
91
|
+
url, payload = parse_properties url, properties
|
92
|
+
rest_request :patch, url, {'data' => payload,
|
93
|
+
'content_type' => 'application/json'}
|
94
|
+
end
|
95
|
+
|
96
|
+
def rest_post url, properties={}
|
97
|
+
url, payload = parse_properties url, properties
|
98
|
+
rest_request :post, url, {'data' => payload,
|
99
|
+
'content_type' => 'application/json'}
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
def rest_request action, url, options={}
|
104
|
+
#Try to refresh the token and if we do then we need to regenerate the header as well.
|
105
|
+
self.refresh
|
106
|
+
(options['params'] ||= {})
|
107
|
+
|
108
|
+
if access_token
|
109
|
+
options['access_token'] = access_token
|
110
|
+
end
|
111
|
+
|
112
|
+
rsp = rest_client.send(action, url, options)
|
113
|
+
raise 'Unauthorized' if rsp.message == 'Unauthorized'
|
114
|
+
|
115
|
+
rsp
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,282 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2013 ExactTarget, Inc.
|
3
|
+
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
7
|
+
|
8
|
+
following conditions are met:
|
9
|
+
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
11
|
+
|
12
|
+
following disclaimer.
|
13
|
+
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
15
|
+
|
16
|
+
following disclaimer in the documentation and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
19
|
+
|
20
|
+
products derived from this software without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
23
|
+
|
24
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
|
26
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
27
|
+
|
28
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
29
|
+
|
30
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
31
|
+
|
32
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
33
|
+
|
34
|
+
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
=end
|
36
|
+
|
37
|
+
require 'savon'
|
38
|
+
require 'marketingcloudsdk/version'
|
39
|
+
|
40
|
+
module MarketingCloudSDK
|
41
|
+
|
42
|
+
class SoapResponse < MarketingCloudSDK::Response
|
43
|
+
|
44
|
+
def continue
|
45
|
+
rsp = nil
|
46
|
+
if more?
|
47
|
+
rsp = unpack @client.soap_client.call(:retrieve, :message => {'ContinueRequest' => request_id})
|
48
|
+
else
|
49
|
+
puts 'No more data'
|
50
|
+
end
|
51
|
+
|
52
|
+
rsp
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def unpack_body raw
|
57
|
+
@body = raw.body
|
58
|
+
@request_id = raw.body[raw.body.keys.first][:request_id]
|
59
|
+
unpack_msg raw
|
60
|
+
rescue
|
61
|
+
@message = raw.http.body
|
62
|
+
@body = raw.http.body unless @body
|
63
|
+
end
|
64
|
+
|
65
|
+
def unpack raw
|
66
|
+
@code = raw.http.code
|
67
|
+
unpack_body raw
|
68
|
+
@success = @message == 'OK'
|
69
|
+
@results += (unpack_rslts raw)
|
70
|
+
end
|
71
|
+
|
72
|
+
def unpack_msg raw
|
73
|
+
@message = raw.soap_fault? ? raw.body[:fault][:faultstring] : raw.body[raw.body.keys.first][:overall_status]
|
74
|
+
end
|
75
|
+
|
76
|
+
def unpack_rslts raw
|
77
|
+
@more = (raw.body[raw.body.keys.first][:overall_status] == 'MoreDataAvailable')
|
78
|
+
rslts = raw.body[raw.body.keys.first][:results] || []
|
79
|
+
rslts = [rslts] unless rslts.kind_of? Array
|
80
|
+
rslts
|
81
|
+
rescue
|
82
|
+
[]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
class DescribeResponse < SoapResponse
|
87
|
+
attr_reader :properties, :retrievable, :updatable, :required, :extended, :viewable, :editable
|
88
|
+
private
|
89
|
+
|
90
|
+
def unpack_rslts raw
|
91
|
+
@retrievable, @updatable, @required, @properties, @extended, @viewable, @editable = [], [], [], [], [], [], [], []
|
92
|
+
definition = raw.body[raw.body.keys.first][:object_definition]
|
93
|
+
_props = definition[:properties]
|
94
|
+
_props.each do |p|
|
95
|
+
@retrievable << p[:name] if p[:is_retrievable] and (p[:name] != 'DataRetentionPeriod')
|
96
|
+
@updatable << p[:name] if p[:is_updatable]
|
97
|
+
@required << p[:name] if p[:is_required]
|
98
|
+
@properties << p[:name]
|
99
|
+
end
|
100
|
+
# ugly, but a necessary evil
|
101
|
+
_exts = definition[:extended_properties].nil? ? {} : definition[:extended_properties] # if they have no extended properties nil is returned
|
102
|
+
_exts = _exts[:extended_property] || [] # if no properties nil and we need an array to iterate
|
103
|
+
_exts = [_exts] unless _exts.kind_of? Array # if they have only one extended property we need to wrap it in array to iterate
|
104
|
+
_exts.each do |p|
|
105
|
+
@viewable << p[:name] if p[:is_viewable]
|
106
|
+
@editable << p[:name] if p[:is_editable]
|
107
|
+
@extended << p[:name]
|
108
|
+
end
|
109
|
+
@success = true # overall_status is missing from definition response, so need to set here manually
|
110
|
+
_props + _exts
|
111
|
+
rescue
|
112
|
+
@message = "Unable to describe #{raw.locals[:message]['DescribeRequests']['ObjectDefinitionRequest']['ObjectType']}"
|
113
|
+
@success = false
|
114
|
+
[]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
module Soap
|
119
|
+
attr_accessor :wsdl, :debug#, :internal_token
|
120
|
+
|
121
|
+
include MarketingCloudSDK::Targeting
|
122
|
+
|
123
|
+
def header
|
124
|
+
raise 'Require legacy token for soap header' unless internal_token
|
125
|
+
{
|
126
|
+
'oAuth' => {'oAuthToken' => internal_token},
|
127
|
+
:attributes! => { 'oAuth' => { 'xmlns' => 'http://exacttarget.com' }}
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
def debug
|
132
|
+
@debug ||= false
|
133
|
+
end
|
134
|
+
|
135
|
+
def wsdl
|
136
|
+
@wsdl ||= 'https://webservice.exacttarget.com/etframework.wsdl'
|
137
|
+
end
|
138
|
+
|
139
|
+
def soap_client
|
140
|
+
self.refresh
|
141
|
+
@soap_client = Savon.client(
|
142
|
+
soap_header: header,
|
143
|
+
wsdl: wsdl,
|
144
|
+
endpoint: endpoint,
|
145
|
+
wsse_auth: ["*", "*"],
|
146
|
+
raise_errors: false,
|
147
|
+
log: debug,
|
148
|
+
open_timeout:180,
|
149
|
+
read_timeout: 180,
|
150
|
+
headers: {'User-Agent' => 'FuelSDK-Ruby-v' + MarketingCloudSDK::VERSION}
|
151
|
+
)
|
152
|
+
end
|
153
|
+
|
154
|
+
def soap_describe object_type
|
155
|
+
message = {
|
156
|
+
'DescribeRequests' => {
|
157
|
+
'ObjectDefinitionRequest' => {
|
158
|
+
'ObjectType' => object_type
|
159
|
+
}
|
160
|
+
}
|
161
|
+
}
|
162
|
+
soap_request :describe, message
|
163
|
+
end
|
164
|
+
|
165
|
+
def soap_perform object_type, action, properties
|
166
|
+
message = {}
|
167
|
+
message['Action'] = action
|
168
|
+
message['Definitions'] = {'Definition' => properties}
|
169
|
+
message['Definitions'][:attributes!] = { 'Definition' => { 'xsi:type' => ('tns:' + object_type) }}
|
170
|
+
|
171
|
+
soap_request :perform, message
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
def soap_configure object_type, action, properties
|
176
|
+
message = {}
|
177
|
+
message['Action'] = action
|
178
|
+
message['Configurations'] = {}
|
179
|
+
if properties.is_a? Array then
|
180
|
+
message['Configurations']['Configuration'] = []
|
181
|
+
properties.each do |configItem|
|
182
|
+
message['Configurations']['Configuration'] << configItem
|
183
|
+
end
|
184
|
+
else
|
185
|
+
message['Configurations'] = {'Configuration' => properties}
|
186
|
+
end
|
187
|
+
message['Configurations'][:attributes!] = { 'Configuration' => { 'xsi:type' => ('tns:' + object_type) }}
|
188
|
+
|
189
|
+
soap_request :configure, message
|
190
|
+
end
|
191
|
+
|
192
|
+
def soap_get object_type, properties=nil, filter=nil
|
193
|
+
if properties.nil? or properties.empty?
|
194
|
+
rsp = soap_describe object_type
|
195
|
+
if rsp.success?
|
196
|
+
properties = rsp.retrievable
|
197
|
+
else
|
198
|
+
rsp.instance_variable_set(:@message, "Unable to get #{object_type}") # back door update
|
199
|
+
return rsp
|
200
|
+
end
|
201
|
+
elsif properties.kind_of? Hash
|
202
|
+
properties = properties.keys
|
203
|
+
elsif properties.kind_of? String
|
204
|
+
properties = [properties]
|
205
|
+
end
|
206
|
+
|
207
|
+
message = {'ObjectType' => object_type, 'Properties' => properties}
|
208
|
+
|
209
|
+
if filter and filter.kind_of? Hash
|
210
|
+
message['Filter'] = filter
|
211
|
+
message[:attributes!] = { 'Filter' => { 'xsi:type' => 'tns:SimpleFilterPart' } }
|
212
|
+
|
213
|
+
if filter.has_key?('LogicalOperator')
|
214
|
+
message[:attributes!] = { 'Filter' => { 'xsi:type' => 'tns:ComplexFilterPart' }}
|
215
|
+
message['Filter'][:attributes!] = {
|
216
|
+
'LeftOperand' => { 'xsi:type' => 'tns:SimpleFilterPart' },
|
217
|
+
'RightOperand' => { 'xsi:type' => 'tns:SimpleFilterPart' }}
|
218
|
+
end
|
219
|
+
end
|
220
|
+
message = {'RetrieveRequest' => message}
|
221
|
+
|
222
|
+
soap_request :retrieve, message
|
223
|
+
end
|
224
|
+
|
225
|
+
def soap_post object_type, properties
|
226
|
+
soap_cud :create, object_type, properties
|
227
|
+
end
|
228
|
+
|
229
|
+
def soap_patch object_type, properties
|
230
|
+
soap_cud :update, object_type, properties
|
231
|
+
end
|
232
|
+
|
233
|
+
def soap_delete object_type, properties
|
234
|
+
soap_cud :delete, object_type, properties
|
235
|
+
end
|
236
|
+
|
237
|
+
def soap_put object_type, properties
|
238
|
+
soap_cud :update, object_type, properties, true
|
239
|
+
end
|
240
|
+
|
241
|
+
private
|
242
|
+
|
243
|
+
def soap_cud action, object_type, properties, upsert=nil
|
244
|
+
# get a list of attributes so we can seperate
|
245
|
+
# them from standard object properties
|
246
|
+
#type_attrs = soap_describe(object_type).editable
|
247
|
+
|
248
|
+
#
|
249
|
+
# properties = [properties] unless properties.kind_of? Array
|
250
|
+
# properties.each do |p|
|
251
|
+
# formated_attrs = []
|
252
|
+
# p.each do |k, v|
|
253
|
+
# if type_attrs.include? k
|
254
|
+
# p.delete k
|
255
|
+
# attrs = MarketingCloudSDK.format_name_value_pairs k => v
|
256
|
+
# formated_attrs.concat attrs
|
257
|
+
# end
|
258
|
+
# end
|
259
|
+
# (p['Attributes'] ||= []).concat formated_attrs unless formated_attrs.empty?
|
260
|
+
# end
|
261
|
+
#
|
262
|
+
|
263
|
+
message = {
|
264
|
+
'Objects' => properties,
|
265
|
+
:attributes! => { 'Objects' => { 'xsi:type' => ('tns:' + object_type) } }
|
266
|
+
}
|
267
|
+
|
268
|
+
if upsert
|
269
|
+
message['Options'] = {"SaveOptions" => {"SaveOption" => {"PropertyName"=> "*", "SaveAction" => "UpdateAdd"}}}
|
270
|
+
end
|
271
|
+
|
272
|
+
soap_request action, message
|
273
|
+
end
|
274
|
+
|
275
|
+
def soap_request action, message
|
276
|
+
response = action.eql?(:describe) ? DescribeResponse : SoapResponse
|
277
|
+
|
278
|
+
rsp = soap_client.call(action, :message => message)
|
279
|
+
response.new rsp, self
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2013 ExactTarget, Inc.
|
3
|
+
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
7
|
+
|
8
|
+
following conditions are met:
|
9
|
+
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
11
|
+
|
12
|
+
following disclaimer.
|
13
|
+
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
15
|
+
|
16
|
+
following disclaimer in the documentation and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
19
|
+
|
20
|
+
products derived from this software without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
23
|
+
|
24
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
|
26
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
27
|
+
|
28
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
29
|
+
|
30
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
31
|
+
|
32
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
33
|
+
|
34
|
+
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
=end
|
36
|
+
|
37
|
+
require 'json'
|
38
|
+
|
39
|
+
module MarketingCloudSDK::Targeting
|
40
|
+
attr_accessor :access_token
|
41
|
+
attr_reader :endpoint, :soap_endpoint
|
42
|
+
|
43
|
+
include MarketingCloudSDK::HTTPRequest
|
44
|
+
|
45
|
+
def cache_file
|
46
|
+
'soap_cache_file.json'
|
47
|
+
end
|
48
|
+
|
49
|
+
def endpoint
|
50
|
+
unless @endpoint
|
51
|
+
get_soap_endpoint
|
52
|
+
end
|
53
|
+
@endpoint
|
54
|
+
end
|
55
|
+
|
56
|
+
def get_soap_endpoint_from_file
|
57
|
+
data_hash = nil
|
58
|
+
|
59
|
+
if File.exist? cache_file
|
60
|
+
file = File.read(cache_file)
|
61
|
+
data_hash = JSON.parse(file)
|
62
|
+
end
|
63
|
+
|
64
|
+
data_hash
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_soap_endpoint_to_file url
|
68
|
+
data_hash = {
|
69
|
+
'url' => url,
|
70
|
+
'timestamp' => Time.new.to_f + (10 * 60)
|
71
|
+
}
|
72
|
+
|
73
|
+
File.open(cache_file, 'w') do |f|
|
74
|
+
f.write(JSON.generate(data_hash))
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
protected
|
79
|
+
def get_soap_endpoint
|
80
|
+
if self.soap_endpoint
|
81
|
+
@endpoint = self.soap_endpoint
|
82
|
+
return
|
83
|
+
end
|
84
|
+
|
85
|
+
cache_data = get_soap_endpoint_from_file
|
86
|
+
|
87
|
+
if cache_data.nil? === false and not cache_data['url'].nil? and cache_data['timestamp'].to_f > Time.new.to_f
|
88
|
+
@endpoint = cache_data['url']
|
89
|
+
return
|
90
|
+
end
|
91
|
+
|
92
|
+
options = {'access_token' => self.access_token}
|
93
|
+
response = get(self.base_api_url + "/platform/v1/endpoints/soap", options)
|
94
|
+
@endpoint = response['url']
|
95
|
+
set_soap_endpoint_to_file @endpoint
|
96
|
+
rescue => e
|
97
|
+
@endpoint = 'https://webservice.exacttarget.com/Service.asmx'
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2013 ExactTarget, Inc.
|
3
|
+
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
7
|
+
|
8
|
+
following conditions are met:
|
9
|
+
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
11
|
+
|
12
|
+
following disclaimer.
|
13
|
+
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
15
|
+
|
16
|
+
following disclaimer in the documentation and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
19
|
+
|
20
|
+
products derived from this software without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
23
|
+
|
24
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
|
26
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
27
|
+
|
28
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
29
|
+
|
30
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
31
|
+
|
32
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
33
|
+
|
34
|
+
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
=end
|
36
|
+
|
37
|
+
module MarketingCloudSDK
|
38
|
+
module_function
|
39
|
+
def format_name_value_pairs attributes
|
40
|
+
attrs = []
|
41
|
+
attributes.each do |name, value|
|
42
|
+
attrs.push 'Name' => name, 'Value' => value
|
43
|
+
end
|
44
|
+
|
45
|
+
attrs
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2013 ExactTarget, Inc.
|
3
|
+
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
7
|
+
|
8
|
+
following conditions are met:
|
9
|
+
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
11
|
+
|
12
|
+
following disclaimer.
|
13
|
+
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
15
|
+
|
16
|
+
following disclaimer in the documentation and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
19
|
+
|
20
|
+
products derived from this software without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
23
|
+
|
24
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
|
26
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
27
|
+
|
28
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
29
|
+
|
30
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
31
|
+
|
32
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
33
|
+
|
34
|
+
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
=end
|
36
|
+
|
37
|
+
module MarketingCloudSDK
|
38
|
+
VERSION = "1.1.0"
|
39
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (c) 2013 ExactTarget, Inc.
|
3
|
+
|
4
|
+
All rights reserved.
|
5
|
+
|
6
|
+
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
|
7
|
+
|
8
|
+
following conditions are met:
|
9
|
+
|
10
|
+
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
|
11
|
+
|
12
|
+
following disclaimer.
|
13
|
+
|
14
|
+
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
|
15
|
+
|
16
|
+
following disclaimer in the documentation and/or other materials provided with the distribution.
|
17
|
+
|
18
|
+
3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote
|
19
|
+
|
20
|
+
products derived from this software without specific prior written permission.
|
21
|
+
|
22
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
23
|
+
|
24
|
+
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
25
|
+
|
26
|
+
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
27
|
+
|
28
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
29
|
+
|
30
|
+
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
31
|
+
|
32
|
+
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
33
|
+
|
34
|
+
USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
35
|
+
=end
|
36
|
+
|
37
|
+
require "marketingcloudsdk/version"
|
38
|
+
|
39
|
+
require 'rubygems'
|
40
|
+
require 'date'
|
41
|
+
require 'jwt'
|
42
|
+
|
43
|
+
module MarketingCloudSDK
|
44
|
+
require 'marketingcloudsdk/utils'
|
45
|
+
autoload :HTTPRequest, 'marketingcloudsdk/http_request'
|
46
|
+
autoload :Targeting, 'marketingcloudsdk/targeting'
|
47
|
+
autoload :Soap, 'marketingcloudsdk/soap'
|
48
|
+
autoload :Rest, 'marketingcloudsdk/rest'
|
49
|
+
require 'marketingcloudsdk/client'
|
50
|
+
require 'marketingcloudsdk/objects'
|
51
|
+
end
|
52
|
+
|
53
|
+
# backwards compatability
|
54
|
+
ET_Client = MarketingCloudSDK::Client
|
55
|
+
ET_BounceEvent = MarketingCloudSDK::BounceEvent
|
56
|
+
ET_ClickEvent = MarketingCloudSDK::ClickEvent
|
57
|
+
ET_ContentArea = MarketingCloudSDK::ContentArea
|
58
|
+
ET_DataExtension = MarketingCloudSDK::DataExtension
|
59
|
+
ET_DataFolder = MarketingCloudSDK::DataFolder
|
60
|
+
ET_Folder = MarketingCloudSDK::Folder
|
61
|
+
ET_Email = MarketingCloudSDK::Email
|
62
|
+
ET_List = MarketingCloudSDK::List
|
63
|
+
ET_OpenEvent = MarketingCloudSDK::OpenEvent
|
64
|
+
ET_SentEvent = MarketingCloudSDK::SentEvent
|
65
|
+
ET_Subscriber = MarketingCloudSDK::Subscriber
|
66
|
+
ET_UnsubEvent = MarketingCloudSDK::UnsubEvent
|
67
|
+
ET_TriggeredSend = MarketingCloudSDK::TriggeredSend
|
68
|
+
ET_Campaign = MarketingCloudSDK::Campaign
|
69
|
+
ET_Get = MarketingCloudSDK::Get
|
70
|
+
ET_Post = MarketingCloudSDK::Post
|
71
|
+
ET_Delete = MarketingCloudSDK::Delete
|
72
|
+
ET_Patch = MarketingCloudSDK::Patch
|
73
|
+
ET_ProfileAttribute = MarketingCloudSDK::ProfileAttribute
|
74
|
+
ET_Import = MarketingCloudSDK::Import
|