riaction 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG.md +7 -0
  3. data/Gemfile.lock +47 -26
  4. data/README.md +101 -52
  5. data/db/riaction.db +0 -0
  6. data/lib/riaction.rb +1 -1
  7. data/lib/riaction/constants.rb +10 -0
  8. data/lib/riaction/crud_event_callback.rb +3 -3
  9. data/lib/riaction/event_performer.rb +11 -16
  10. data/lib/riaction/profile_creation_callback.rb +1 -1
  11. data/lib/riaction/profile_creator.rb +13 -6
  12. data/lib/riaction/railtie.rb +4 -0
  13. data/lib/riaction/riaction.rb +302 -282
  14. data/lib/riaction/version.rb +1 -1
  15. data/lib/tasks/riaction.rake +16 -14
  16. data/riaction.gemspec +3 -2
  17. data/spec/event_performer_spec.rb +233 -0
  18. data/spec/profile_creation_spec.rb +135 -0
  19. data/spec/riaction_spec.rb +820 -253
  20. data/spec/spec_helper.rb +8 -1
  21. metadata +38 -71
  22. data/lib/riaction/iactionable/api.rb +0 -170
  23. data/lib/riaction/iactionable/connection.rb +0 -114
  24. data/lib/riaction/iactionable/error.rb +0 -17
  25. data/lib/riaction/iactionable/objects.rb +0 -27
  26. data/lib/riaction/iactionable/objects/achievement.rb +0 -29
  27. data/lib/riaction/iactionable/objects/awardable.rb +0 -50
  28. data/lib/riaction/iactionable/objects/challenge.rb +0 -27
  29. data/lib/riaction/iactionable/objects/goal.rb +0 -30
  30. data/lib/riaction/iactionable/objects/i_actionable_object.rb +0 -36
  31. data/lib/riaction/iactionable/objects/identifier.rb +0 -17
  32. data/lib/riaction/iactionable/objects/leaderboard.rb +0 -15
  33. data/lib/riaction/iactionable/objects/leaderboard_report.rb +0 -30
  34. data/lib/riaction/iactionable/objects/level.rb +0 -24
  35. data/lib/riaction/iactionable/objects/level_type.rb +0 -15
  36. data/lib/riaction/iactionable/objects/point_type.rb +0 -15
  37. data/lib/riaction/iactionable/objects/profile_achievements.rb +0 -20
  38. data/lib/riaction/iactionable/objects/profile_challenges.rb +0 -20
  39. data/lib/riaction/iactionable/objects/profile_goals.rb +0 -20
  40. data/lib/riaction/iactionable/objects/profile_level.rb +0 -20
  41. data/lib/riaction/iactionable/objects/profile_notifications.rb +0 -29
  42. data/lib/riaction/iactionable/objects/profile_points.rb +0 -29
  43. data/lib/riaction/iactionable/objects/profile_summary.rb +0 -37
  44. data/lib/riaction/iactionable/objects/progress.rb +0 -46
  45. data/lib/riaction/iactionable/settings.rb +0 -30
  46. data/spec/api_spec.rb +0 -314
  47. data/spec/connection_spec.rb +0 -111
  48. data/spec/get_achievements_api_response_spec.rb +0 -46
  49. data/spec/get_challenges_api_response_spec.rb +0 -42
  50. data/spec/get_goals_api_response_spec.rb +0 -46
  51. data/spec/get_leaderboard_api_response_spec.rb +0 -76
  52. data/spec/get_profile_achievements_api_response_spec.rb +0 -99
  53. data/spec/get_profile_api_response_spec.rb +0 -103
  54. data/spec/get_profile_challenges_api_response_spec.rb +0 -85
  55. data/spec/get_profile_goals_api_response_spec.rb +0 -89
  56. data/spec/get_profile_notifications_api_response_spec.rb +0 -75
  57. data/spec/get_profile_points_api_response_spec.rb +0 -67
  58. data/spec/settings_spec.rb +0 -52
@@ -19,5 +19,9 @@ module Riaction
19
19
  # warn of malformed credentials file
20
20
  end
21
21
  end
22
+
23
+ initializer "riaction_railtie.extend.active_record" do |app|
24
+ ActiveRecord::Base.extend(::Riaction::Riaction::ClassMethods) if defined?(ActiveRecord)
25
+ end
22
26
  end
23
27
  end
@@ -1,4 +1,3 @@
1
- require 'riaction/iactionable/api'
2
1
  require "active_support"
3
2
  require "active_record"
4
3
  require 'riaction/event_performer'
@@ -7,337 +6,358 @@ require 'riaction/profile_creation_callback'
7
6
  require 'riaction/crud_event_callback'
8
7
 
9
8
  module Riaction
10
-
9
+ class RuntimeError < StandardError; end
10
+ class ConfigurationError < StandardError; end
11
11
  class NoEventDefined < StandardError; end
12
12
  class NoProfileDefined < StandardError; end
13
-
13
+
14
14
  module Riaction
15
15
  PROFILE_CLASSES = []
16
- EVENT_LOGGING_CLASSES = []
16
+ EVENT_CLASSES = []
17
17
 
18
- def riaction(object_type, opts)
19
- if object_type == :profile
20
- unless riaction_profile?
21
- (PROFILE_CLASSES << self.to_s).uniq!
22
- define_profile(opts.delete(:type), opts)
23
- include Riaction::ProfileInstanceMethods
24
- send :after_create, ::Riaction::ProfileCreationCallback.new
25
- end
26
- elsif object_type == :event
27
- unless riaction_defines_events?
28
- make_events_definable
29
- end
30
- unless riaction_defines_event?(opts[:name])
31
- (EVENT_LOGGING_CLASSES << self.to_s).uniq!
32
- define_event(opts[:name], opts[:trigger], opts[:profile], opts[:params], opts[:if])
33
- include Riaction::EventInstanceMethods
18
+ module ClassMethods
19
+ def riaction(type, opts)
20
+ establish_riactionary_class unless riactionary?
21
+ if type == :profile
22
+ establish_riactionary_profile_class unless riaction_profile?
23
+ add_or_update_riaction_profile(opts.delete(:type), opts)
24
+ elsif type == :event
25
+ establish_riactionary_event_class unless riaction_events?
26
+ add_or_update_riaction_event(opts.delete(:name), opts)
27
+ elsif type == :option || type == :options
28
+ opts.each_pair do |option, value|
29
+ riaction_options[option] = value if ::Riaction::Constants.riaction_options.has_key?(option)
30
+ end
34
31
  end
35
32
  end
36
- end
37
-
38
- def make_events_definable
39
- class << self
40
- def riaction_events
41
- @riaction_events ||= {}
33
+
34
+ def establish_riactionary_class
35
+ class << self
36
+ def riactionary?
37
+ true
38
+ end
39
+
40
+ def riactionless?
41
+ @riactionless ||= false
42
+ end
43
+
44
+ def riaction_profile_keys
45
+ @riaction_profile_keys ||= {}
46
+ end
47
+
48
+ def riaction_events
49
+ @riaction_events ||= {}
50
+ end
51
+
52
+ def riaction_options
53
+ @riaction_options ||= ::Riaction::Constants.riaction_options
54
+ end
55
+
56
+ def riaction_use_profile
57
+ @riaction_use_profile ||= nil
58
+ end
59
+
60
+ def riactionless(&block)
61
+ if block_given?
62
+ @riactionless = true
63
+ begin
64
+ block_value = yield
65
+ ensure
66
+ @riactionless = false
67
+ end
68
+ end
69
+ end
70
+
71
+ def reset_riaction
72
+ riaction_profile_keys.clear
73
+ riaction_events.clear
74
+ riaction_options.merge!(::Riaction::Constants.riaction_options)
75
+ @riaction_use_profile = nil
76
+ end
77
+
78
+ def add_or_update_riaction_profile(type, opts)
79
+ display_name = opts.delete(:display_name) || nil
80
+ riaction_check_type(:display_name, display_name, [Symbol, Proc, NilClass])
81
+ unless opts.keys.any?{|type| ::Riaction::Constants.supported_identifier_types.include?(type)}
82
+ raise ConfigurationError.new("#{self.to_s} defining a riaction profile must use supported IActionable types: #{::Riaction::Constants.supported_identifier_types.map(&:to_s).join(", ")}")
83
+ end
84
+ riaction_profile_keys.store(type, {
85
+ :display_name => display_name,
86
+ :identifiers => opts
87
+ })
88
+ @riaction_use_profile ||= type
89
+ end
90
+
91
+ def add_or_update_riaction_event(name, opts)
92
+ # set values
93
+ trigger = opts.delete(:trigger) || :create
94
+ profile = opts.delete(:profile)
95
+ profile_type = opts.delete(:profile_type)
96
+ params = opts.delete(:params) || {}
97
+ guard = opts.delete(:if) || opts.delete(:guard) || true
98
+ # check for required types and presence
99
+ if profile.nil?
100
+ raise ConfigurationError.new("#{self.to_s} defining a riaction event must provide a profile")
101
+ end
102
+ riaction_check_type(:trigger, trigger, [Symbol])
103
+ riaction_check_type(:profile, profile, [Symbol, Proc])
104
+ riaction_check_type(:profile_type, profile_type, [Symbol, NilClass])
105
+ riaction_check_type(:params, params, [Symbol, Proc, Hash])
106
+ riaction_check_type(:guard, guard, [Symbol, Proc, TrueClass])
107
+ # store our event data
108
+ riaction_events.store(name, {
109
+ :trigger => trigger,
110
+ :profile => profile,
111
+ :profile_type => profile_type,
112
+ :params => params,
113
+ :guard => guard
114
+ })
115
+ # create necessary callbacks and instance methods for triggers
116
+ if ::Riaction::Constants.crud_actions.include? trigger
117
+ send "after_#{trigger}".to_sym, ::Riaction::CrudEventCallback.new(name)
118
+ else
119
+ define_method("trigger_#{trigger}!") do
120
+ if self.riaction_log_event?(name) && !self.class.riactionless?
121
+ Resque.enqueue(::Riaction::EventPerformer, name, self.class.base_class.to_s, self.id)
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ def riaction_profile_types_defined
128
+ riaction_profile_keys.size
129
+ end
130
+
131
+ def riaction_events_defined
132
+ riaction_events.size
133
+ end
134
+
135
+ def riaction_check_type(name, value, allowed_types)
136
+ unless allowed_types.any?{|type| value.is_a?(type)}
137
+ raise ConfigurationError.new("value given for #{name} must be of types: #{allowed_types.map(&:to_s).join(', ')}")
138
+ end
139
+ end
42
140
  end
43
-
44
- def riaction_defines_events?
45
- true
141
+
142
+ include ::Riaction::Riaction::InstanceMethods
143
+ end
144
+
145
+ def establish_riactionary_profile_class
146
+ (::Riaction::Riaction::PROFILE_CLASSES << self.to_s).uniq!
147
+
148
+ class << self
149
+ def riaction_profile?
150
+ true
151
+ end
46
152
  end
153
+
154
+ include ::Riaction::Riaction::Profile::InstanceMethods
155
+
156
+ after_create ::Riaction::ProfileCreationCallback.new({})
47
157
  end
48
- end
49
-
50
- def define_event(name, trigger, profile, params = {}, guard = nil)
51
- trigger = name unless trigger
52
-
53
- # store the event
54
- riaction_events.store(name, {:trigger => trigger, :profile => profile, :params => params, :guard => guard})
55
-
56
- # Create the callback or the means to trigger it
57
- if ::Riaction::Constants.crud_actions.include? trigger
58
- send "after_#{trigger}".to_sym, ::Riaction::CrudEventCallback.new(name)
59
158
 
60
- define_method("trigger_#{name}!") do
61
- if self.riaction_log_event?(name)
62
- Resque.enqueue(::Riaction::EventPerformer, name, self.class.base_class.to_s, self.id)
159
+ def establish_riactionary_event_class
160
+ (::Riaction::Riaction::EVENT_CLASSES << self.to_s).uniq!
161
+
162
+ class << self
163
+ def riaction_events?
164
+ true
63
165
  end
64
- end
65
- else
66
- define_method("trigger_#{trigger}!") do
67
- if self.riaction_log_event?(name)
68
- Resque.enqueue(::Riaction::EventPerformer, name, self.class.base_class.to_s, self.id)
166
+
167
+ def riaction_defines_event?(event_name)
168
+ riaction_events.has_key? event_name
69
169
  end
70
170
  end
171
+
172
+ include ::Riaction::Riaction::Event::InstanceMethods
71
173
  end
72
- end
73
-
74
- def define_profile(type, fields)
75
- class << self
76
- def riaction_profiles
77
- @riaction_profiles ||= {}
78
- end
79
-
80
- def riaction_profile?
81
- true
82
- end
174
+
175
+ def riactionary?
176
+ false
83
177
  end
84
178
 
85
- # store the profile
86
- riaction_profiles.store(type, {:display_name_method => fields.delete(:display_name), :identifiers => fields})
87
- end
88
-
89
- def riaction_profile?
90
- false
91
- end
92
-
93
- def riaction_defines_events?
94
- false
95
- end
96
-
97
- def riaction_defines_event?(event_name)
98
- if riaction_defines_events?
99
- riaction_events[event_name].present?
100
- else
179
+ def riaction_profile?
101
180
  false
102
181
  end
103
- end
104
- # end
105
-
106
- module EventInstanceMethods
107
- def riaction_event(event_name)
108
- event = self.class.riaction_events.fetch(event_name.to_sym)
109
- profile = riaction_event_profile(event[:profile])
110
-
111
- unless profile.class.respond_to?(:riaction_profile?) && profile.class.riaction_profile?
112
- raise TypeError.new("Object defined for #{self.class} on event #{event_name} as a profile must itself declare riaction(:profile ...)")
113
- end
114
-
115
- params = riaction_event_params(event[:params])
116
-
117
- raise TypeError.new("Params defined for #{self.class} on event #{event_name} must be a hash") unless params.kind_of? Hash
118
182
 
119
- {
120
- :key => event_name.to_sym,
121
- :profile => profile,
122
- :params => params
123
- }
124
- rescue KeyError => e
125
- raise NoEventDefined.new("no such event #{event_name} defined on #{self.class}")
183
+ def riaction_events?
184
+ false
126
185
  end
186
+ end
127
187
 
128
- def riaction_log_event?(event_name)
129
- event = self.class.riaction_events.fetch(event_name.to_sym)
130
- guard = event[:guard]
131
-
132
- case guard
133
- when NilClass
134
- true
188
+ module InstanceMethods
189
+ def riaction_resolve_param(poly)
190
+ case poly
135
191
  when Symbol
136
- self.send guard
192
+ if poly == :self
193
+ self
194
+ else
195
+ self.send poly
196
+ end
137
197
  when Proc
138
- guard.call self
198
+ poly.yield self
199
+ when Hash
200
+ resolved_hash = {}
201
+ poly.each_pair do |key, value|
202
+ resolved_hash[key] = self.respond_to?(value) ? self.send(value) : value
203
+ end
204
+ resolved_hash
139
205
  else
140
- true
206
+ poly
141
207
  end
142
- rescue KeyError => e
143
- raise NoEventDefined.new("no such event #{event_name} defined on #{self.class}")
144
208
  end
209
+ end
145
210
 
146
- private
147
-
148
- def riaction_event_profile(profile)
149
- if profile == :self
211
+ module Profile
212
+ module InstanceMethods
213
+ def riaction_profile_keys
214
+ resolved_hash = {}
215
+ self.class.riaction_profile_keys.each_pair do |profile_type, opts|
216
+ resolved_hash[profile_type] = {}
217
+ opts.fetch(:identifiers, {}).each_pair do |identifier_type, value|
218
+ resolved_hash[profile_type][identifier_type] = riaction_resolve_param(value)
219
+ end
220
+ end
221
+ resolved_hash
222
+ end
223
+
224
+ def riaction_set_profile(type)
225
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{type}") unless riaction_profile_keys.has_key?(type)
226
+ @riaction_use_profile = type
150
227
  self
151
- elsif profile.kind_of? Symbol
152
- self.send(profile)
153
- elsif profile.kind_of? Proc
154
- profile.call
155
- else
156
- nil
157
228
  end
158
- rescue Exception => e
159
- raise
160
- end
161
-
162
- def riaction_event_params(params)
163
- if params.kind_of? Symbol
164
- self.send(params)
165
- elsif params.kind_of? Proc
166
- params.call
167
- elsif params.kind_of? Hash
168
- resolved_params = {}
169
- params.each_pair do |key, value|
170
- resolved_params[key] = self.respond_to?(value) ? self.send(value) : value
171
- end
172
- resolved_params
173
- else
174
- {}
229
+
230
+ def riaction_profile_display_name
231
+ riaction_resolve_param self.class.riaction_profile_keys.fetch(@riaction_use_profile)[:display_name]
232
+ rescue KeyError => e
233
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
175
234
  end
176
- rescue Exception => e
177
- raise
178
- end
179
- end
235
+
236
+ #################
237
+ # API wrappers #
238
+ #################
180
239
 
181
- module ProfileInstanceMethods
182
- def riaction_profile_keys(profile_type=nil, id_type=nil)
183
- if self.class.riaction_profiles.size > 0
184
- if profile_type && self.class.riaction_profiles.has_key?(profile_type)
185
- ids = self.class.riaction_profiles.fetch(profile_type)[:identifiers]
186
- else
187
- profile_type = self.class.riaction_profiles.first[0]
188
- ids = self.class.riaction_profiles.first[1][:identifiers]
189
- end
190
-
191
- if id_type && ids.has_key?(id_type)
192
- {:profile_type => profile_type.to_s, :id_type => id_type.to_s, :id => self.send(ids.fetch(id_type)).to_s}
193
- else
194
- {:profile_type => profile_type.to_s, :id_type => ids.first[0].to_s, :id => self.send(ids.first[1]).to_s}
195
- end
196
- else
197
- {}
198
- end
199
- rescue KeyError, NoMethodError => e
200
- {}
201
- end
202
-
203
- def riaction_profile_display_name(profile_type=nil)
204
- if self.class.riaction_profiles.size > 0
205
- if profile_type && self.class.riaction_profiles.has_key?(profile_type)
206
- method = self.class.riaction_profiles.fetch(profile_type)[:display_name_method]
207
- else
208
- method = self.class.riaction_profiles.first[1][:display_name_method]
209
- end
210
-
211
- if method
212
- if method.kind_of? Symbol
213
- begin
214
- self.send(method)
215
- rescue NoMethodError => e
216
- nil
217
- end
218
- else
219
- nil
220
- end
221
- else
222
- nil
223
- end
224
- else
240
+ def riaction_profile_summary(achievement_count=nil)
241
+ @iactionable_api ||= IActionable::Api.new
242
+ keys = riaction_profile_keys.fetch(riaction_use_profile)
243
+ @iactionable_api.get_profile_summary(riaction_use_profile.to_s, keys.first[0].to_s, keys.first[1].to_s, achievement_count)
244
+ rescue KeyError => e
245
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
246
+ rescue IActionable::Error::BadRequest => e
225
247
  nil
226
248
  end
227
- rescue KeyError, NoMethodError => e
228
- nil
229
- end
230
-
231
- #################
232
- # API wrappers #
233
- #################
234
-
235
- def riaction_profile_summary(achievement_count=nil)
236
- keys = riaction_profile_keys
237
- unless keys.empty?
249
+
250
+ def riaction_profile_achievements(filter_type=nil)
238
251
  @iactionable_api ||= IActionable::Api.new
239
- @iactionable_api.get_profile_summary(keys[:profile_type], keys[:id_type], keys[:id], achievement_count)
240
- else
241
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
252
+ keys = riaction_profile_keys.fetch(riaction_use_profile)
253
+ @iactionable_api.get_profile_achievements(riaction_use_profile.to_s, keys.first[0].to_s, keys.first[1].to_s, filter_type)
254
+ rescue KeyError => e
255
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
256
+ rescue IActionable::Error::BadRequest => e
257
+ nil
242
258
  end
243
- rescue IActionable::Error::BadRequest => e
244
- nil
245
- end
246
-
247
- def riaction_create_profile
248
- keys = riaction_profile_keys
249
- unless keys.empty?
259
+
260
+ def riaction_profile_challenges(filter_type=nil)
250
261
  @iactionable_api ||= IActionable::Api.new
251
- @iactionable_api.create_profile(keys[:profile_type], keys[:id_type], keys[:id], riaction_profile_display_name)
252
- else
253
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
262
+ keys = riaction_profile_keys.fetch(riaction_use_profile)
263
+ @iactionable_api.get_profile_challenges(riaction_use_profile.to_s, keys.first[0].to_s, keys.first[1].to_s, filter_type)
264
+ rescue KeyError => e
265
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
266
+ rescue IActionable::Error::BadRequest => e
267
+ nil
254
268
  end
255
- end
256
-
257
- def riaction_update_profile(new_id_type)
258
- old_keys = riaction_profile_keys
259
- new_keys = riaction_profile_keys(old_keys[:profile_type], new_id_type)
260
- unless old_keys.empty? || new_keys.empty?
269
+
270
+ def riaction_profile_goals(filter_type=nil)
261
271
  @iactionable_api ||= IActionable::Api.new
262
- @iactionable_api.add_profile_identifier(old_keys[:profile_type], old_keys[:id_type], old_keys[:id], new_keys[:id_type], new_keys[:id])
263
- else
264
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
272
+ keys = riaction_profile_keys.fetch(riaction_use_profile)
273
+ @iactionable_api.get_profile_goals(riaction_use_profile.to_s, keys.first[0].to_s, keys.first[1].to_s, filter_type)
274
+ rescue KeyError => e
275
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
276
+ rescue IActionable::Error::BadRequest => e
277
+ nil
265
278
  end
266
- end
267
-
268
- def riaction_profile_achievements(filter_type=nil)
269
- keys = riaction_profile_keys
270
- unless keys.empty?
279
+
280
+ def riaction_profile_notifications
271
281
  @iactionable_api ||= IActionable::Api.new
272
- @iactionable_api.get_profile_achievements(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
273
- else
274
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
282
+ keys = riaction_profile_keys.fetch(riaction_use_profile)
283
+ @iactionable_api.get_profile_notifications(riaction_use_profile.to_s, keys.first[0].to_s, keys.first[1].to_s)
284
+ rescue KeyError => e
285
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
286
+ rescue IActionable::Error::BadRequest => e
287
+ nil
275
288
  end
276
- rescue IActionable::Error::BadRequest => e
277
- nil
278
- end
279
-
280
- def riaction_profile_challenges(filter_type=nil)
281
- keys = riaction_profile_keys
282
- unless keys.empty?
289
+
290
+ def riaction_profile_points(point_type)
283
291
  @iactionable_api ||= IActionable::Api.new
284
- @iactionable_api.get_profile_challenges(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
285
- else
286
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
292
+ keys = riaction_profile_keys.fetch(riaction_use_profile)
293
+ @iactionable_api.get_profile_points(riaction_use_profile.to_s, keys.first[0].to_s, keys.first[1].to_s, point_type)
294
+ rescue KeyError => e
295
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
296
+ rescue IActionable::Error::BadRequest => e
297
+ nil
287
298
  end
288
- rescue IActionable::Error::BadRequest => e
289
- nil
290
- end
291
-
292
- def riaction_profile_goals(filter_type=nil)
293
- keys = riaction_profile_keys
294
- unless keys.empty?
299
+
300
+ def riaction_update_profile_points(point_type, amount, reason="")
295
301
  @iactionable_api ||= IActionable::Api.new
296
- @iactionable_api.get_profile_goals(keys[:profile_type], keys[:id_type], keys[:id], filter_type)
297
- else
298
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
302
+ keys = riaction_profile_keys.fetch(riaction_use_profile)
303
+ @iactionable_api.update_profile_points(riaction_use_profile.to_s, keys.first[0].to_s, keys.first[1].to_s, point_type, amount, reason)
304
+ rescue KeyError => e
305
+ raise RuntimeError.new("#{self.to_s} does not define a profile type #{riaction_use_profile}")
306
+ rescue IActionable::Error::BadRequest => e
307
+ nil
299
308
  end
300
- rescue IActionable::Error::BadRequest => e
301
- nil
302
- end
303
-
304
- def riaction_profile_notifications
305
- keys = riaction_profile_keys
306
- unless keys.empty?
307
- @iactionable_api ||= IActionable::Api.new
308
- @iactionable_api.get_profile_notifications(keys[:profile_type], keys[:id_type], keys[:id])
309
- else
310
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
309
+
310
+ private
311
+
312
+ def riaction_use_profile
313
+ @riaction_use_profile || self.class.riaction_use_profile
311
314
  end
312
- rescue IActionable::Error::BadRequest => e
313
- nil
314
315
  end
315
-
316
- def riaction_profile_points(point_type)
317
- keys = riaction_profile_keys
318
- unless keys.empty?
319
- @iactionable_api ||= IActionable::Api.new
320
- @iactionable_api.get_profile_points(keys[:profile_type], keys[:id_type], keys[:id], point_type)
321
- else
322
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
316
+ end
317
+
318
+ module Event
319
+ module InstanceMethods
320
+ def riaction_event_params
321
+ resolved_hash = {}
322
+ self.class.riaction_events.each_pair do |event_name, args|
323
+ resolved_hash[event_name] = {}
324
+ resolved_profile = riaction_resolve_param(args[:profile])
325
+ raise RuntimeError.new("riaction profile missing for instance #{self}") if resolved_profile.nil?
326
+ unless resolved_profile.kind_of?(ActiveRecord::Base) &&
327
+ resolved_profile.class.riactionary? &&
328
+ resolved_profile.class.riaction_profile? &&
329
+ resolved_profile.class.riaction_profile_types_defined > 0
330
+ raise ConfigurationError.new("#{self.class} must provide a riaction profile object for event #{event_name}")
331
+ end
332
+ profile_keys = resolved_profile.riaction_profile_keys
333
+ unless args[:profile_type].nil?
334
+ if profile_keys[args[:profile_type]].nil?
335
+ raise ConfigurationError.new("#{resolved_profile.class} does not define profile type #{args[:profile_type]} (see event #{event_name} on #{self.class})")
336
+ else
337
+ resolved_hash[event_name][:profile] = {
338
+ :type => args[:profile_type],
339
+ :id_type => profile_keys[args[:profile_type]].first.first,
340
+ :id => profile_keys[args[:profile_type]].first.last
341
+ }
342
+ end
343
+ else
344
+ resolved_hash[event_name][:profile] = {
345
+ :type => profile_keys.first.first,
346
+ :id_type => profile_keys.first.last.first.first,
347
+ :id => profile_keys.first.last.first.last
348
+ }
349
+ end
350
+ resolved_hash[event_name][:params] = riaction_resolve_param(args[:params]).merge(self.class.riaction_options[:default_event_params])
351
+ end
352
+ resolved_hash
323
353
  end
324
- rescue IActionable::Error::BadRequest => e
325
- nil
326
- end
327
-
328
- def riaction_update_profile_points(point_type, amount, reason="")
329
- keys = riaction_profile_keys
330
- unless keys.empty?
331
- @iactionable_api ||= IActionable::Api.new
332
- @iactionable_api.update_profile_points(keys[:profile_type], keys[:id_type], keys[:id], point_type, amount, reason)
333
- else
334
- raise NoProfileDefined.new("Class #{self.class} does not adequately define itself as an IActionable profile")
354
+
355
+ def riaction_log_event?(name)
356
+ riaction_resolve_param self.class.riaction_events.fetch(name)[:guard]
357
+ rescue KeyError
358
+ raise ConfigurationError.new("#{self.class} does not define an event named '#{name}'")
335
359
  end
336
- rescue IActionable::Error::BadRequest => e
337
- nil
338
360
  end
339
361
  end
340
362
  end
341
- end
342
-
343
- ActiveRecord::Base.extend ::Riaction::Riaction
363
+ end