nifty_services 0.0.3 → 0.0.4

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.
data/daily_news.log ADDED
@@ -0,0 +1,7 @@
1
+ # Logfile created on 2016-07-15 17:46:01 -0300 by logger.rb/53141
2
+ I, [2016-07-15T17:46:01.453040 #30030] INFO -- : Routine Details: Send daily news email to user Rafael Fidelis(rafa_fidelis@yahoo.com.br)
3
+ I, [2016-07-15T17:46:01.453179 #30030] INFO -- : Routine started at: 2016-07-15 17:46:01 -0300
4
+ W, [2016-07-15T17:46:01.453464 #30030] WARN -- : Something went wrong
5
+ E, [2016-07-15T17:46:01.484243 #30030] ERROR -- : Error sending email to user. See details below :(
6
+ E, [2016-07-15T17:46:01.484330 #30030] ERROR -- : ["translation missing: en.nifty_services.errors.users.yet_received_daily_news_mail"]
7
+ I, [2016-07-15T17:46:01.484470 #30030] INFO -- : Routine ended at: 2016-07-15 17:46:01 -0300
@@ -7,20 +7,20 @@ module NiftyServices
7
7
  end
8
8
 
9
9
  def execute
10
- with_before_and_after_callbacks(:create) do
11
- if can_execute_action?
12
- @record = build_record
13
-
14
- if save_record
15
- after_execute_success_response
16
- else
17
- errors = create_error_response(@record)
18
- after_error_response(errors)
10
+ execute_action do
11
+ with_before_and_after_callbacks(:create) do
12
+ if can_execute_action?
13
+ @record = build_record
14
+
15
+ if save_record
16
+ after_execute_success_response
17
+ else
18
+ errors = create_error_response(@record)
19
+ after_error_response(errors)
20
+ end
19
21
  end
20
22
  end
21
23
  end
22
-
23
- success?
24
24
  end
25
25
 
26
26
  private
@@ -57,7 +57,7 @@ module NiftyServices
57
57
  record_type.send(:new, record_params)
58
58
  end
59
59
 
60
- def can_execute_action?
60
+ def can_execute?
61
61
  if validate_ip_on_create? && !can_create_with_ip?
62
62
  return forbidden_error!(%s(users.ip_temporarily_blocked))
63
63
  end
@@ -2,22 +2,22 @@ module NiftyServices
2
2
  class BaseDeleteService < BaseCrudService
3
3
 
4
4
  def execute
5
- with_before_and_after_callbacks(:delete) do
6
- if can_execute_action?
7
- if destroy_record
8
- success_response
9
- else
10
- bad_request_error(@record.errors)
5
+ execute_action do
6
+ with_before_and_after_callbacks(:delete) do
7
+ if can_execute_action?
8
+ if destroy_record
9
+ success_response
10
+ else
11
+ bad_request_error(@record.errors)
12
+ end
11
13
  end
12
14
  end
13
15
  end
14
-
15
- success?
16
16
  end
17
17
 
18
18
  private
19
19
  def destroy_record
20
- @record.destroy
20
+ @record.try(:destroy) || @record.try(:delete)
21
21
  end
22
22
 
23
23
  def can_execute_action?
@@ -1,47 +1,19 @@
1
1
  module NiftyServices
2
2
  class BaseService
3
3
 
4
- attr_reader :options, :response_status, :response_status_code, :errors
5
-
6
- CALLBACKS = [
7
- :after_initialize,
8
- :before_error,
9
- :after_error,
10
- :before_success,
11
- :after_success,
12
- :before_create,
13
- :after_create,
14
- :before_update,
15
- :after_update,
16
- :before_delete,
17
- :after_delete,
18
- :before_action,
19
- :after_action
20
- ].freeze
21
-
22
- @@registered_callbacks = Hash.new {|k,v| k[v] = Hash.new }
4
+ include Extensions::CallbacksInterface
23
5
 
24
- class << self
25
- def register_callback(callback_name, method_name, &block)
26
- method_name = "#{method_name.to_s.gsub(/\Z_callback/, '')}_callback"
27
-
28
- @@registered_callbacks[self.name.to_sym][callback_name] ||= []
29
- @@registered_callbacks[self.name.to_sym][callback_name] << method_name
30
-
31
- register_callback_action(method_name, &block)
32
- end
33
-
34
- def register_callback_action(callback_name, &block)
35
- define_method(callback_name, &block)
36
- end
6
+ attr_reader :response_status, :response_status_code
7
+ attr_reader :options, :errors, :logger
37
8
 
9
+ class << self
38
10
  def register_error_response_method(reason_string, status_code)
39
11
  NiftyServices::Configuration.add_response_error_method(reason_string, status_code)
40
12
  define_error_response_method(reason_string, status_code)
41
13
  end
42
14
 
43
15
  def define_error_response_method(reason_string, status_code)
44
- method_name = "#{reason_string.to_s.gsub(/\Z_error/, '')}_error"
16
+ method_name = Util.normalized_callback_name(reason_string, '_error')
45
17
 
46
18
  define_method method_name do |message_key, options = {}|
47
19
  error(status_code, message_key, options)
@@ -53,19 +25,15 @@ module NiftyServices
53
25
  end
54
26
  end
55
27
 
56
- CALLBACKS.each do |callback_name|
57
- # empty method call (just returns nil)
58
- define_method callback_name, -> {}
59
- end
60
-
61
28
  def initialize(options = {}, initial_response_status = 400)
62
29
  @options = options.to_options!
63
30
  @errors = []
31
+ @logger = options[:logger] || default_logger
32
+ @executed = false
64
33
 
65
- set_response_status(initial_response_status)
66
- initial_callbacks_setup
67
-
68
- call_callback(:after_initialize)
34
+ with_before_and_after_callbacks(:initialize) do
35
+ set_response_status(initial_response_status)
36
+ end
69
37
  end
70
38
 
71
39
  def valid?
@@ -84,6 +52,10 @@ module NiftyServices
84
52
  @response_status ||= :bad_request
85
53
  end
86
54
 
55
+ def changed_attributes
56
+ []
57
+ end
58
+
87
59
  def changed?
88
60
  changed_attributes.any?
89
61
  end
@@ -96,16 +68,6 @@ module NiftyServices
96
68
  valid_object?(@user, user_class)
97
69
  end
98
70
 
99
- def callback_fired?(callback_name)
100
- return (
101
- callback_fired_in?(@fired_callbacks, callback_name) ||
102
- callback_fired_in?(@custom_fired_callbacks, callback_name) ||
103
- callback_fired_in?(@custom_fired_callbacks, "#{callback_name}_callback")
104
- )
105
- end
106
-
107
- alias :callback_called? :callback_fired?
108
-
109
71
  def option_exists?(key)
110
72
  @options && @options.key?(key.to_sym)
111
73
  end
@@ -118,27 +80,40 @@ module NiftyServices
118
80
  !option_enabled?(key)
119
81
  end
120
82
 
121
- def register_callback(callback_name, method_name, &block)
122
- method_name = :"#{method_name.to_s.gsub(/\Z_callback/, '')}_callback"
123
-
124
- @registered_callbacks[callback_name.to_sym] << method_name
83
+ def add_error(error)
84
+ add_method = error.is_a?(Array) ? :concat : :push
85
+ @errors.send(add_method, error)
125
86
  end
126
87
 
127
- def register_callback_action(callback_name, &block)
128
- cb_name = :"#{callback_name.to_s.gsub(/\Z_callback/, '')}_callback"
129
- @callbacks_actions[cb_name] = block
88
+ def default_logger
89
+ NiftyServices.config.logger
130
90
  end
131
91
 
132
- def add_error(error)
133
- add_method = error.is_a?(Array) ? :concat : :push
134
- @errors.send(add_method, error)
92
+ alias :log :logger
93
+
94
+ def executed?
95
+ @executed == true
135
96
  end
136
97
 
98
+ alias :runned? :executed?
99
+
137
100
  private
138
- def initial_callbacks_setup
139
- @fired_callbacks, @custom_fired_callbacks = {}, {}
140
- @callbacks_actions = {}
141
- @registered_callbacks = Hash.new {|k,v| k[v] = [] }
101
+ def can_execute?
102
+ not_implemented_exception(__method__)
103
+ end
104
+
105
+ def execute_action(&block)
106
+ return nil if executed?
107
+
108
+ with_before_and_after_callbacks(:execute) do
109
+ if can_execute?
110
+ yield(block) if block_given?
111
+ end
112
+ end
113
+
114
+ @executed = true
115
+
116
+ self # allow chaining
142
117
  end
143
118
 
144
119
  def success_response(status = :ok)
@@ -187,10 +162,12 @@ module NiftyServices
187
162
  end
188
163
 
189
164
  def error(status, message_key, options = {})
165
+ @success = false
166
+
190
167
  with_before_and_after_callbacks(:error) do
191
168
  set_response_status(status)
192
- error_message = process_error_message_for_key(message_key, options)
193
169
 
170
+ error_message = process_error_message_for_key(message_key, options)
194
171
  add_error(error_message)
195
172
 
196
173
  error_message
@@ -206,20 +183,6 @@ module NiftyServices
206
183
  return false
207
184
  end
208
185
 
209
- def call_callback(callback_name)
210
- callback_name = callback_name.to_s.underscore.to_sym
211
-
212
- if self.respond_to?(callback_name, true) # include private methods
213
- @fired_callbacks[callback_name.to_sym] = true
214
-
215
- invoke_callback(method(callback_name))
216
- call_registered_callbacks_for(callback_name)
217
- end
218
-
219
- # allow chained methods
220
- self
221
- end
222
-
223
186
  def valid_object?(record, expected_class)
224
187
  record.present? && record.is_a?(expected_class)
225
188
  end
@@ -263,61 +226,6 @@ module NiftyServices
263
226
  message
264
227
  end
265
228
 
266
- def with_before_and_after_callbacks(callback_basename, &block)
267
- call_callback(:"before_#{callback_basename}")
268
-
269
- response = yield(block) if block_given?
270
-
271
- call_callback(:"after_#{callback_basename}")
272
-
273
- response
274
- end
275
-
276
- def call_registered_callbacks_for(callback_name)
277
- instance_call_all_custom_registered_callbacks_for(callback_name)
278
- class_call_all_custom_registered_callbacks_for(callback_name)
279
- end
280
-
281
- def instance_call_all_custom_registered_callbacks_for(callback_name)
282
- @fired_callbacks[callback_name] = true
283
-
284
- callbacks = @registered_callbacks[callback_name.to_sym]
285
-
286
- callbacks.each do |cb|
287
- if callback = @callbacks_actions[cb.to_sym]
288
- @custom_fired_callbacks[cb.to_sym] = true
289
- invoke_callback(callback)
290
- end
291
- end
292
- end
293
-
294
- def class_call_all_custom_registered_callbacks_for(callback_name)
295
- classes_chain = self.class.ancestors.map(&:to_s).grep /\ANiftyServices/
296
- klasses = @@registered_callbacks.keys.map(&:to_s) & classes_chain
297
-
298
- klasses.each do |klass|
299
- class_call_all_custom_registered_callbacks_for_class(klass, callback_name)
300
- end
301
- end
302
-
303
- def class_call_all_custom_registered_callbacks_for_class(class_name, callback_name)
304
- class_callbacks = @@registered_callbacks[class_name.to_sym]
305
- callbacks = class_callbacks[callback_name.to_sym] || []
306
-
307
- callbacks.each do |cb|
308
- @custom_fired_callbacks[cb.to_sym] = true
309
- invoke_callback(method(cb))
310
- end
311
- end
312
-
313
- def callback_fired_in?(callback_list, callback_name)
314
- return callback_list[callback_name.to_sym].present?
315
- end
316
-
317
- def invoke_callback(method)
318
- method.call
319
- end
320
-
321
229
  NiftyServices::Configuration.response_errors_list.each do |reason_string, status_code|
322
230
  define_error_response_method(reason_string, status_code)
323
231
  end
@@ -2,21 +2,21 @@ module NiftyServices
2
2
  class BaseUpdateService < BaseCrudService
3
3
 
4
4
  def execute
5
- with_before_and_after_callbacks(:update) do
6
- if can_execute_action?
7
- @updated_record = update_record
8
- @updated_record ||= @record
9
-
10
- if success_updated?
11
- success_response
12
- else
13
- errors = update_errors
14
- bad_request_error(errors) if errors.present?
5
+ execute_action do
6
+ with_before_and_after_callbacks(:update) do
7
+ if can_execute_action?
8
+ @updated_record = update_record
9
+ @updated_record ||= @record
10
+
11
+ if success_updated?
12
+ success_response
13
+ else
14
+ errors = update_errors
15
+ bad_request_error(errors) if errors.present?
16
+ end
15
17
  end
16
18
  end
17
19
  end
18
-
19
- success?
20
20
  end
21
21
 
22
22
  def changed_attributes
@@ -27,7 +27,7 @@ module NiftyServices
27
27
  private
28
28
 
29
29
  def changed_attributes_array
30
- record_params.keys
30
+ record_allowed_params.keys
31
31
  end
32
32
 
33
33
  def success_updated?
@@ -39,7 +39,7 @@ module NiftyServices
39
39
  end
40
40
 
41
41
  def update_record
42
- @record.class.send(:update, @record.id, record_params)
42
+ @record.class.send(:update, @record.id, record_allowed_params)
43
43
  end
44
44
 
45
45
  def can_execute_action?
@@ -72,7 +72,7 @@ module NiftyServices
72
72
 
73
73
  def after_success
74
74
  @old_record = @record.dup
75
- @record = @updated_record
75
+ @record = @updated_record
76
76
  end
77
77
  end
78
78
  end
@@ -31,7 +31,7 @@ module NiftyServices
31
31
  end
32
32
  end
33
33
 
34
- attr_reader :logger, :options
34
+ attr_reader :logger, :options, :i18n_namespace
35
35
 
36
36
  attr_accessor :user_class, :service_concerns_namespace
37
37
 
@@ -39,11 +39,12 @@ module NiftyServices
39
39
  @options = options
40
40
  @service_concerns_namespace = default_service_concerns_namespace
41
41
  @user_class = options[:user_class] || default_user_class
42
+ @i18n_namespace = @options[:i18n_namespace] || default_i18n_namespace
42
43
  @logger = options[:logger] || default_logger
43
44
  end
44
45
 
45
- def i18n_namespace
46
- @options[:i18n_namespace] || DEFAULT_I18N_NAMESPACE
46
+ def default_i18n_namespace
47
+ DEFAULT_I18N_NAMESPACE
47
48
  end
48
49
 
49
50
  private
@@ -0,0 +1,171 @@
1
+ require 'active_support/concern'
2
+
3
+ module NiftyServices
4
+ module Extensions::CallbacksInterface
5
+
6
+ extend ActiveSupport::Concern
7
+
8
+ CALLBACKS = [
9
+ :before_initialize,
10
+ :after_initialize,
11
+ :before_execute,
12
+ :after_execute,
13
+ :before_error,
14
+ :after_error,
15
+ :before_success,
16
+ :after_success,
17
+ :before_create,
18
+ :after_create,
19
+ :before_update,
20
+ :after_update,
21
+ :before_delete,
22
+ :after_delete,
23
+ :before_action,
24
+ :after_action
25
+ ].freeze
26
+
27
+ class_methods do
28
+ @@registered_callbacks = Hash.new {|k,v| k[v] = Hash.new }
29
+
30
+ def register_callback(callback_name, method_name, &block)
31
+ method_name = Util.normalized_callback_name(method_name)
32
+
33
+ @@registered_callbacks[self.name.to_sym][callback_name] ||= []
34
+ @@registered_callbacks[self.name.to_sym][callback_name] << method_name
35
+
36
+ register_callback_action(method_name, &block)
37
+ end
38
+
39
+ def register_callback_action(callback_name, &block)
40
+ define_method(callback_name, &block)
41
+ end
42
+
43
+ CALLBACKS.each do |callback_name|
44
+ define_method callback_name do |&block|
45
+ register_callback_action(callback_name, &block)
46
+ end
47
+ end
48
+ end
49
+
50
+ included do
51
+ CALLBACKS.each do |callback_name|
52
+ # empty method call (just returns nil)
53
+ define_method callback_name, -> {}
54
+ end
55
+
56
+ def callback_fired?(callback_name)
57
+ return (
58
+ callback_fired_in?(@fired_callbacks, callback_name) ||
59
+ callback_fired_in?(@custom_fired_callbacks, callback_name) ||
60
+ callback_fired_in?(@custom_fired_callbacks, "#{callback_name}_callback")
61
+ )
62
+ end
63
+
64
+ alias :callback_called? :callback_fired?
65
+
66
+ def register_callback(callback_name, method_name, &block)
67
+ method_name = normalized_callback_name(method_name).to_sym
68
+
69
+ @registered_callbacks[callback_name.to_sym] << method_name
70
+ register_callback_action(callback_name, &block)
71
+ end
72
+
73
+ def register_callback_action(callback_name, &block)
74
+ cb_name = normalized_callback_name(callback_name).to_sym
75
+ @callbacks_actions[cb_name.to_sym] = block
76
+ end
77
+
78
+ private
79
+ def callbacks_setup
80
+ return nil if @callbacks_setup
81
+
82
+ @fired_callbacks, @custom_fired_callbacks = {}, {}
83
+ @callbacks_actions = {}
84
+ @registered_callbacks = Hash.new {|k,v| k[v] = [] }
85
+
86
+ @callbacks_setup = true
87
+ end
88
+
89
+ def call_callback(callback_name)
90
+ callback_name = callback_name.to_s.underscore.to_sym
91
+
92
+ if has_callback?(callback_name)
93
+ @fired_callbacks[callback_name.to_sym] = true
94
+
95
+ invoke_callback(method(callback_name))
96
+ call_registered_callbacks_for(callback_name)
97
+ end
98
+
99
+ # allow chained methods
100
+ self
101
+ end
102
+
103
+ def has_callback?(callback_name)
104
+ _callback_name = normalized_callback_name(callback_name).to_sym
105
+ # include private methods
106
+ respond_to?(callback_name, true) || respond_to?(_callback_name, true)
107
+ end
108
+
109
+ def with_before_and_after_callbacks(callback_basename, &block)
110
+ callbacks_setup
111
+
112
+ call_callback(:"before_#{callback_basename}")
113
+
114
+ block_response = yield(block) if block_given?
115
+
116
+ call_callback(:"after_#{callback_basename}")
117
+
118
+ block_response
119
+ end
120
+
121
+ def call_registered_callbacks_for(callback_name)
122
+ instance_call_all_custom_registered_callbacks_for(callback_name)
123
+ class_call_all_custom_registered_callbacks_for(callback_name)
124
+ end
125
+
126
+ def instance_call_all_custom_registered_callbacks_for(callback_name)
127
+ @fired_callbacks[callback_name] = true
128
+
129
+ callbacks = @registered_callbacks[callback_name.to_sym]
130
+
131
+ callbacks.each do |cb|
132
+ if callback = @callbacks_actions[cb.to_sym]
133
+ @custom_fired_callbacks[cb.to_sym] = true
134
+ invoke_callback(callback)
135
+ end
136
+ end
137
+ end
138
+
139
+ def class_call_all_custom_registered_callbacks_for(callback_name)
140
+ classes_chain = self.class.ancestors.map(&:to_s).grep /\ANiftyServices/
141
+ klasses = @@registered_callbacks.keys.map(&:to_s) & classes_chain
142
+
143
+ klasses.each do |klass|
144
+ class_call_all_custom_registered_callbacks_for_class(klass, callback_name)
145
+ end
146
+ end
147
+
148
+ def class_call_all_custom_registered_callbacks_for_class(class_name, callback_name)
149
+ class_callbacks = @@registered_callbacks[class_name.to_sym]
150
+ callbacks = class_callbacks[callback_name.to_sym] || []
151
+
152
+ callbacks.each do |cb|
153
+ @custom_fired_callbacks[cb.to_sym] = true
154
+ invoke_callback(method(cb))
155
+ end
156
+ end
157
+
158
+ def callback_fired_in?(callback_list, callback_name)
159
+ return callback_list[callback_name.to_sym].present?
160
+ end
161
+
162
+ def normalized_callback_name(callback_name, prefix = '_callback')
163
+ Util.normalized_callback_name(callback_name, prefix)
164
+ end
165
+
166
+ def invoke_callback(method)
167
+ method.call
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,10 @@
1
+ module NiftyServices
2
+ module Util
3
+ module_function
4
+ def normalized_callback_name(callback_name, prefix = '_callback')
5
+ cb_name = callback_name.to_s.gsub(%r(\Z#{prefix}), '')
6
+
7
+ [cb_name, prefix].join
8
+ end
9
+ end
10
+ end
@@ -1,3 +1,3 @@
1
1
  module NiftyServices
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -14,6 +14,11 @@ module NiftyServices
14
14
  autoload :Configuration, 'nifty_services/configuration'
15
15
  autoload :Error, 'nifty_services/errors'
16
16
  autoload :Errors, 'nifty_services/errors'
17
+ autoload :Util, 'nifty_services/util'
18
+
19
+ module Extensions
20
+ autoload :CallbacksInterface, 'nifty_services/extensions/callbacks_interface'
21
+ end
17
22
 
18
23
  class << self
19
24
  def configuration(&block)