facebookbusiness 0.8.0.2 → 0.9.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/lib/facebook_ads/ad_objects/ad.rb +3 -0
  3. data/lib/facebook_ads/ad_objects/ad_account.rb +21 -13
  4. data/lib/facebook_ads/ad_objects/ad_account_ad_volume.rb +1 -0
  5. data/lib/facebook_ads/ad_objects/ad_account_delivery_estimate.rb +1 -0
  6. data/lib/facebook_ads/ad_objects/ad_account_matched_search_applications_edge_data.rb +1 -0
  7. data/lib/facebook_ads/ad_objects/ad_account_targeting_unified.rb +23 -5
  8. data/lib/facebook_ads/ad_objects/ad_activity.rb +0 -1
  9. data/lib/facebook_ads/ad_objects/ad_asset_feed_spec.rb +5 -0
  10. data/lib/facebook_ads/ad_objects/ad_async_request.rb +2 -0
  11. data/lib/facebook_ads/ad_objects/ad_campaign_activity.rb +6 -2
  12. data/lib/facebook_ads/ad_objects/ad_campaign_delivery_estimate.rb +1 -0
  13. data/lib/facebook_ads/ad_objects/ad_creative.rb +7 -0
  14. data/lib/facebook_ads/ad_objects/ad_creative_link_data_call_to_action.rb +5 -0
  15. data/lib/facebook_ads/ad_objects/{ad_creative_instagram_branded_content.rb → ad_creative_omnichannel_link_spec.rb} +3 -1
  16. data/lib/facebook_ads/ad_objects/ad_preview.rb +1 -0
  17. data/lib/facebook_ads/ad_objects/ad_report_run.rb +1 -0
  18. data/lib/facebook_ads/ad_objects/ad_rule_execution_spec.rb +4 -0
  19. data/lib/facebook_ads/ad_objects/ad_set.rb +3 -1
  20. data/lib/facebook_ads/ad_objects/ad_study.rb +0 -1
  21. data/lib/facebook_ads/ad_objects/ad_study_objective.rb +0 -4
  22. data/lib/facebook_ads/ad_objects/ad_video.rb +5 -10
  23. data/lib/facebook_ads/ad_objects/adgroup_activity.rb +2 -0
  24. data/lib/facebook_ads/ad_objects/adoptable_pet.rb +7 -0
  25. data/lib/facebook_ads/ad_objects/ads_insights.rb +1 -0
  26. data/lib/facebook_ads/ad_objects/ads_pixel.rb +1 -0
  27. data/lib/facebook_ads/ad_objects/album.rb +0 -10
  28. data/lib/facebook_ads/ad_objects/application.rb +2 -10
  29. data/lib/facebook_ads/ad_objects/business.rb +15 -12
  30. data/lib/facebook_ads/ad_objects/business_asset_group.rb +1 -1
  31. data/lib/facebook_ads/ad_objects/business_role_request.rb +4 -4
  32. data/lib/facebook_ads/ad_objects/business_unit.rb +0 -1
  33. data/lib/facebook_ads/ad_objects/business_user.rb +4 -4
  34. data/lib/facebook_ads/ad_objects/campaign.rb +11 -1
  35. data/lib/facebook_ads/ad_objects/{friend_list.rb → catalog_item_channels_to_integrity_status.rb} +5 -5
  36. data/lib/facebook_ads/ad_objects/commerce_merchant_settings.rb +2 -24
  37. data/lib/facebook_ads/ad_objects/commerce_merchant_settings_setup_status.rb +1 -0
  38. data/lib/facebook_ads/ad_objects/custom_audience.rb +8 -0
  39. data/lib/facebook_ads/ad_objects/extended_credit.rb +0 -1
  40. data/lib/facebook_ads/ad_objects/group.rb +26 -10
  41. data/lib/facebook_ads/ad_objects/hotel_room.rb +1 -0
  42. data/lib/facebook_ads/ad_objects/ig_media.rb +0 -1
  43. data/lib/facebook_ads/ad_objects/ig_user.rb +0 -1
  44. data/lib/facebook_ads/ad_objects/link.rb +0 -4
  45. data/lib/facebook_ads/ad_objects/live_video.rb +12 -12
  46. data/lib/facebook_ads/ad_objects/messenger_profile.rb +1 -0
  47. data/lib/facebook_ads/ad_objects/page.rb +23 -15
  48. data/lib/facebook_ads/ad_objects/page_post.rb +0 -10
  49. data/lib/facebook_ads/ad_objects/{event_tour.rb → payment_engine_payment.rb} +35 -18
  50. data/lib/facebook_ads/ad_objects/payment_subscription.rb +3 -3
  51. data/lib/facebook_ads/ad_objects/photo.rb +0 -10
  52. data/lib/facebook_ads/ad_objects/playable_content.rb +1 -0
  53. data/lib/facebook_ads/ad_objects/post.rb +46 -29
  54. data/lib/facebook_ads/ad_objects/product_catalog.rb +3 -7
  55. data/lib/facebook_ads/ad_objects/product_feed.rb +1 -0
  56. data/lib/facebook_ads/ad_objects/product_feed_schedule.rb +2 -0
  57. data/lib/facebook_ads/ad_objects/product_group.rb +8 -0
  58. data/lib/facebook_ads/ad_objects/product_item.rb +15 -0
  59. data/lib/facebook_ads/ad_objects/referral.rb +2 -0
  60. data/lib/facebook_ads/ad_objects/server_side/action_source.rb +48 -0
  61. data/lib/facebook_ads/ad_objects/server_side/batch_processor.rb +73 -0
  62. data/lib/facebook_ads/ad_objects/server_side/content.rb +23 -4
  63. data/lib/facebook_ads/ad_objects/server_side/event.rb +32 -6
  64. data/lib/facebook_ads/ad_objects/server_side/event_request.rb +60 -13
  65. data/lib/facebook_ads/ad_objects/server_side/event_request_async.rb +12 -0
  66. data/lib/facebook_ads/ad_objects/{user_payment_modules_options.rb → server_side/http_method.rb} +7 -19
  67. data/lib/facebook_ads/ad_objects/server_side/http_service_interface.rb +33 -0
  68. data/lib/facebook_ads/ad_objects/server_side/http_util.rb +31 -0
  69. data/lib/facebook_ads/ad_objects/server_side/util.rb +13 -0
  70. data/lib/facebook_ads/ad_objects/system_user.rb +0 -20
  71. data/lib/facebook_ads/ad_objects/targeting.rb +0 -2
  72. data/lib/facebook_ads/ad_objects/third_party_measurement_report_dataset.rb +0 -1
  73. data/lib/facebook_ads/ad_objects/unified_thread.rb +0 -1
  74. data/lib/facebook_ads/ad_objects/user.rb +31 -26
  75. data/lib/facebook_ads/ad_objects/vehicle.rb +1 -0
  76. data/lib/facebook_ads/ad_objects/whats_app_business_account.rb +3 -0
  77. data/lib/facebook_ads/ad_objects/{offline_terms_of_service.rb → whats_app_business_profile.rb} +2 -4
  78. data/lib/facebook_ads/session.rb +1 -1
  79. data/lib/facebook_ads/version.rb +2 -2
  80. metadata +13 -10
  81. data/lib/facebook_ads/ad_objects/ad_account_creation_request.rb +0 -71
  82. data/lib/facebook_ads/ad_objects/user_payment_methods_info.rb +0 -43
@@ -28,7 +28,8 @@ module FacebookAds
28
28
  :title,
29
29
  :description,
30
30
  :brand,
31
- :category
31
+ :category,
32
+ :delivery_category
32
33
 
33
34
  # Initializes the object
34
35
  # @param [String] product_id
@@ -38,7 +39,8 @@ module FacebookAds
38
39
  # @param [String] description
39
40
  # @param [String] brand
40
41
  # @param [String] category
41
- def initialize(product_id: nil, quantity: nil, item_price: nil, title: nil, description: nil, brand: nil, category: nil)
42
+ # @param [String] delivery_category
43
+ def initialize(product_id: nil, quantity: nil, item_price: nil, title: nil, description: nil, brand: nil, category: nil, delivery_category: nil)
42
44
  unless product_id.nil?
43
45
  self.product_id = String(product_id)
44
46
  end
@@ -60,6 +62,9 @@ module FacebookAds
60
62
  unless category.nil?
61
63
  self.category = String(category)
62
64
  end
65
+ unless delivery_category.nil?
66
+ self.delivery_category = String(delivery_category)
67
+ end
63
68
  end
64
69
 
65
70
  # build the object using the input hash
@@ -97,6 +102,10 @@ module FacebookAds
97
102
  if attributes.has_key?(:'category')
98
103
  self.category = attributes[:'category']
99
104
  end
105
+
106
+ if attributes.has_key?(:'delivery_category')
107
+ self.delivery_category = attributes[:'delivery_category']
108
+ end
100
109
  end
101
110
 
102
111
  # Checks equality by comparing each attribute.
@@ -108,7 +117,8 @@ module FacebookAds
108
117
  title == o.title &&
109
118
  description == o.description &&
110
119
  brand == o.brand &&
111
- category == o.category
120
+ category == o.category &&
121
+ delivery_category == o.delivery_category
112
122
  end
113
123
 
114
124
  # @see the `==` method
@@ -126,7 +136,8 @@ module FacebookAds
126
136
  title,
127
137
  description,
128
138
  brand,
129
- category
139
+ category,
140
+ delivery_category
130
141
  ].hash
131
142
  end
132
143
 
@@ -156,6 +167,9 @@ module FacebookAds
156
167
  unless category.nil?
157
168
  hash['category'] = category
158
169
  end
170
+ unless delivery_category.nil?
171
+ hash['delivery_category'] = delivery_category
172
+ end
159
173
  hash.to_s
160
174
  end
161
175
 
@@ -183,6 +197,11 @@ module FacebookAds
183
197
  unless category.nil?
184
198
  hash['category'] = category
185
199
  end
200
+ unless delivery_category.nil?
201
+ hash['delivery_category'] = FacebookAds::ServerSide::Util.normalize_delivery_category(
202
+ delivery_category
203
+ )
204
+ end
186
205
  hash
187
206
  end
188
207
  end
@@ -64,6 +64,9 @@ module FacebookAds
64
64
  # For more details see https://developers.facebook.com/docs/marketing-apis/data-processing-options
65
65
  attr_accessor :data_processing_options_state
66
66
 
67
+ # Where the conversion occurred.
68
+ attr_accessor :action_source
69
+
67
70
  # @param [String] event_name
68
71
  # @param [int] event_time
69
72
  # @param [String] event_source_url
@@ -74,6 +77,7 @@ module FacebookAds
74
77
  # @param [Array<String>] data_processing_options
75
78
  # @param [int] data_processing_options_country
76
79
  # @param [int] data_processing_options_state
80
+ # @param String action_source
77
81
  def initialize(event_name: nil,
78
82
  event_time: nil,
79
83
  event_source_url: nil,
@@ -83,7 +87,8 @@ module FacebookAds
83
87
  custom_data: nil,
84
88
  data_processing_options: nil,
85
89
  data_processing_options_country: nil,
86
- data_processing_options_state: nil)
90
+ data_processing_options_state: nil,
91
+ action_source: nil)
87
92
 
88
93
  unless event_name.nil?
89
94
  self.event_name = event_name
@@ -115,6 +120,9 @@ module FacebookAds
115
120
  unless data_processing_options_state.nil?
116
121
  self.data_processing_options_state = data_processing_options_state
117
122
  end
123
+ unless action_source.nil?
124
+ self.action_source = action_source
125
+ end
118
126
  end
119
127
 
120
128
  # build the object using the input hash
@@ -154,15 +162,19 @@ module FacebookAds
154
162
  end
155
163
 
156
164
  if attributes.has_key?(:'data_processing_options')
157
- self.custom_data = attributes[:'data_processing_options']
165
+ self.data_processing_options = attributes[:'data_processing_options']
158
166
  end
159
167
 
160
168
  if attributes.has_key?(:'data_processing_options_country')
161
- self.custom_data = attributes[:'data_processing_options_country']
169
+ self.data_processing_options_country = attributes[:'data_processing_options_country']
162
170
  end
163
171
 
164
172
  if attributes.has_key?(:'data_processing_options_state')
165
- self.custom_data = attributes[:'data_processing_options_state']
173
+ self.data_processing_options_state = attributes[:'data_processing_options_state']
174
+ end
175
+
176
+ if attributes.has_key?(:'action_source')
177
+ self.action_source = attributes[:'action_source']
166
178
  end
167
179
  end
168
180
 
@@ -207,7 +219,8 @@ module FacebookAds
207
219
  custom_data == o.custom_data &&
208
220
  data_processing_options == o.data_processing_options &&
209
221
  data_processing_options_country == o.data_processing_options_country &&
210
- data_processing_options_state == o.data_processing_options_state
222
+ data_processing_options_state == o.data_processing_options_state &&
223
+ action_source == o.action_source
211
224
  end
212
225
 
213
226
  # @see the `==` method
@@ -218,7 +231,11 @@ module FacebookAds
218
231
  # Calculates hash code according to all attributes.
219
232
  # @return [Fixnum] Hash code
220
233
  def hash
221
- [event_name, event_time, event_source_url, opt_out, event_id, user_data, custom_data, data_processing_options, data_processing_options_country, data_processing_options_state].hash
234
+ [
235
+ event_name, event_time, event_source_url, opt_out, event_id, user_data, custom_data,
236
+ data_processing_options, data_processing_options_country, data_processing_options_state,
237
+ action_source,
238
+ ].hash
222
239
  end
223
240
 
224
241
  def to_s
@@ -253,6 +270,9 @@ module FacebookAds
253
270
  unless data_processing_options_state.nil?
254
271
  hash['data_processing_options_state'] = data_processing_options_state.to_s
255
272
  end
273
+ unless action_source.nil?
274
+ hash['action_source'] = action_source
275
+ end
256
276
  hash.to_s
257
277
  end
258
278
 
@@ -290,6 +310,12 @@ module FacebookAds
290
310
  unless data_processing_options_state.nil?
291
311
  hash['data_processing_options_state'] = data_processing_options_state
292
312
  end
313
+ unless action_source.nil?
314
+ hash['action_source'] = FacebookAds::ServerSide::Util.normalize(
315
+ action_source,
316
+ 'action_source'
317
+ )
318
+ end
293
319
  hash
294
320
  end
295
321
 
@@ -51,6 +51,9 @@ module FacebookAds
51
51
  # The origin/source of data for the dataset to be uploaded.
52
52
  attr_accessor :upload_source
53
53
 
54
+ # The HttpServiceInterface client to use for executing the request.
55
+ attr_accessor :http_service_client
56
+
54
57
  # @param [String] pixel_id
55
58
  # @param [Array(FacebookAds::ServerSide::Event)] events
56
59
  # @param [String] test_event_code
@@ -59,8 +62,10 @@ module FacebookAds
59
62
  # @param [String] upload_id
60
63
  # @param [String] upload_tag
61
64
  # @param [String] upload_source
65
+ # @param [HttpServiceInterface] http_service_client
62
66
  def initialize(pixel_id: nil, events: nil, test_event_code: nil, partner_agent: nil,
63
- namespace_id: nil, upload_id: nil, upload_tag: nil, upload_source: nil)
67
+ namespace_id: nil, upload_id: nil, upload_tag: nil, upload_source: nil,
68
+ http_service_client: nil)
64
69
  unless pixel_id.nil?
65
70
  self.pixel_id = pixel_id
66
71
  end
@@ -85,6 +90,9 @@ module FacebookAds
85
90
  unless upload_source.nil?
86
91
  self.upload_source = upload_source
87
92
  end
93
+ unless http_service_client.nil?
94
+ self.http_service_client = http_service_client
95
+ end
88
96
  end
89
97
 
90
98
  # build the object using the input hash
@@ -128,6 +136,10 @@ module FacebookAds
128
136
  if attributes.has_key?(:'upload_source')
129
137
  self.upload_source = attributes[:'upload_source']
130
138
  end
139
+
140
+ if attributes.has_key?(:'http_service_client')
141
+ self.http_service_client = attributes[:'http_service_client']
142
+ end
131
143
  end
132
144
 
133
145
  # Execute request
@@ -135,18 +147,13 @@ module FacebookAds
135
147
  unless valid?
136
148
  raise list_invalid_properties
137
149
  end
138
- normalized_events = normalize
139
- ads_pixel = FacebookAds::AdsPixel.get(pixel_id)
140
- params = {
141
- data: normalized_events
142
- }
143
- params[:test_event_code] = test_event_code unless test_event_code.nil?
144
- params[:partner_agent] = partner_agent unless partner_agent.nil?
145
- params[:namespace_id] = namespace_id unless namespace_id.nil?
146
- params[:upload_id] = upload_id unless upload_id.nil?
147
- params[:upload_tag] = upload_tag unless upload_tag.nil?
148
- params[:upload_source] = upload_source unless upload_source.nil?
149
150
 
151
+ if http_service_client
152
+ return execute_with_client(http_service_client)
153
+ end
154
+ params = get_params()
155
+ params[:data] = normalize
156
+ ads_pixel = FacebookAds::AdsPixel.get(pixel_id)
150
157
  response = ads_pixel.events.create(params)
151
158
  json_response_object = JSON.parse(JSON.generate(response), object_class: OpenStruct)
152
159
  FacebookAds::ServerSide::EventResponse.new(
@@ -164,6 +171,44 @@ module FacebookAds
164
171
  normalized_events
165
172
  end
166
173
 
174
+ def get_params
175
+ params = {}
176
+ params[:test_event_code] = test_event_code unless test_event_code.nil?
177
+ params[:partner_agent] = partner_agent unless partner_agent.nil?
178
+ params[:namespace_id] = namespace_id unless namespace_id.nil?
179
+ params[:upload_id] = upload_id unless upload_id.nil?
180
+ params[:upload_tag] = upload_tag unless upload_tag.nil?
181
+ params[:upload_source] = upload_source unless upload_source.nil?
182
+ params
183
+ end
184
+
185
+ def execute_with_client http_client
186
+ url = [
187
+ "https://#{FacebookAds::DEFAULT_HOST}",
188
+ FacebookAds::DEFAULT_API_VERSION,
189
+ pixel_id,
190
+ 'events',
191
+ ].join('/')
192
+ headers = {
193
+ 'User-Agent' => "fbbizsdk-ruby-v#{FacebookAds::VERSION}"
194
+ }
195
+ params = get_params
196
+ params[:data] = events.map(&:normalize)
197
+ appsecret = FacebookAds.config.app_secret
198
+ access_token = FacebookAds.config.access_token
199
+ params[:access_token] = access_token
200
+ if appsecret
201
+ params[:appsecret_proof] = FacebookAds::ServerSide::HttpUtil.appsecret_proof(appsecret, access_token)
202
+ end
203
+
204
+ http_client.execute(
205
+ url,
206
+ FacebookAds::ServerSide::HttpMethod::POST,
207
+ headers,
208
+ params
209
+ )
210
+ end
211
+
167
212
  # Show invalid properties with the reasons. Usually used together with valid?
168
213
  # @return Array for valid properties with the reasons
169
214
  def list_invalid_properties
@@ -193,7 +238,8 @@ module FacebookAds
193
238
  namespace_id == o.namespace_id &&
194
239
  upload_id == o.upload_id &&
195
240
  upload_tag == o.upload_tag &&
196
- upload_source == o.upload_source
241
+ upload_source == o.upload_source &&
242
+ http_service_client == o.http_service_client
197
243
  end
198
244
 
199
245
  # @see the `==` method
@@ -213,6 +259,7 @@ module FacebookAds
213
259
  upload_id,
214
260
  upload_tag,
215
261
  upload_source,
262
+ http_service_client,
216
263
  ].hash
217
264
  end
218
265
 
@@ -26,6 +26,18 @@ module FacebookAds
26
26
  super
27
27
  end
28
28
  end
29
+
30
+ def clone_without_events
31
+ FacebookAds::ServerSide::EventRequestAsync.new(
32
+ pixel_id: pixel_id,
33
+ test_event_code: test_event_code,
34
+ partner_agent: partner_agent,
35
+ namespace_id: namespace_id,
36
+ upload_id: upload_id,
37
+ upload_tag: upload_tag,
38
+ upload_source: upload_source,
39
+ )
40
+ end
29
41
  end
30
42
  end
31
43
  end
@@ -16,25 +16,13 @@
16
16
  # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
17
17
  # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18
18
 
19
- # FB:AUTOGEN
20
-
21
19
  module FacebookAds
22
- # This class is auto-generated.
23
-
24
- # For any issues or feature requests related to this class, please let us know
25
- # on github and we'll fix in our codegen framework. We'll not be able to accept
26
- # pull request for this class.
27
-
28
- class UserPaymentModulesOptions < AdObject
29
-
30
- field :account_id, 'string'
31
- field :available_payment_options, { list: 'object' }
32
- field :country, 'string'
33
- field :currency, 'string'
34
- has_no_id
35
- has_no_get
36
- has_no_post
37
- has_no_delete
38
-
20
+ module ServerSide
21
+ class HttpMethod
22
+ POST = 'POST'
23
+ PUT = 'PUT'
24
+ GET = 'GET'
25
+ DELETE = 'DELETE'
26
+ end
39
27
  end
40
28
  end
@@ -0,0 +1,33 @@
1
+ # Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
2
+ #
3
+ # You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
4
+ # copy, modify, and distribute this software in source code or binary form for use
5
+ # in connection with the web services and APIs provided by Facebook.
6
+ #
7
+ # As with any software that integrates with the Facebook platform, your use of
8
+ # this software is subject to the Facebook Platform Policy
9
+ # [http://developers.facebook.com/policy/]. This copyright notice shall be
10
+ # included in all copies or substantial portions of the software.
11
+ #
12
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
14
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
17
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18
+
19
+
20
+ module FacebookAds
21
+ module ServerSide
22
+ class HttpServiceInterface
23
+
24
+ # String url | The graph API endpoint that will be requested
25
+ # String request_method | The HTTP request method
26
+ # Hash headers | Contains HTTP request headers including User-Agent and Accept-Encoding
27
+ # Hash params | Contains request parameters including access_token, data, test_event_code, etc.
28
+ def execute(url, request_method, headers, params)
29
+ raise Exception.new("Method 'execute' not implemented")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,31 @@
1
+ # Copyright (c) 2017-present, Facebook, Inc. All rights reserved.
2
+ #
3
+ # You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
4
+ # copy, modify, and distribute this software in source code or binary form for use
5
+ # in connection with the web services and APIs provided by Facebook.
6
+ #
7
+ # As with any software that integrates with the Facebook platform, your use of
8
+ # this software is subject to the Facebook Platform Policy
9
+ # [http://developers.facebook.com/policy/]. This copyright notice shall be
10
+ # included in all copies or substantial portions of the software.
11
+ #
12
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
14
+ # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
15
+ # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
16
+ # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
17
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
18
+
19
+ module FacebookAds
20
+ module ServerSide
21
+ class HttpUtil
22
+ def self.appsecret_proof(app_secret, access_token)
23
+ OpenSSL::HMAC.hexdigest(
24
+ OpenSSL::Digest.new('sha256'),
25
+ app_secret,
26
+ access_token
27
+ )
28
+ end
29
+ end
30
+ end
31
+ end
@@ -52,6 +52,8 @@ module FacebookAds
52
52
  normalized_input = input;
53
53
 
54
54
  case field_type
55
+ when 'action_source'
56
+ return normalize_action_source input
55
57
  when 'country'
56
58
  normalized_input = normalize_country input
57
59
  when 'ct'
@@ -290,6 +292,17 @@ module FacebookAds
290
292
  delivery_category;
291
293
  end
292
294
 
295
+ # Normalizes the input action_source and returns valid value (or throw exception if invalid).
296
+ def self.normalize_action_source(action_source)
297
+ unless FacebookAds::ServerSide::ActionSource.include?(action_source)
298
+ values = FacebookAds::ServerSide::ActionSource.to_a.join(',')
299
+ raise ArgumentError.new(
300
+ "Invalid action_source passed: #{action_source}. Please use one of the defined values: #{values}"
301
+ )
302
+ end
303
+
304
+ action_source
305
+ end
293
306
  end
294
307
  end
295
308
  end