nifty_services 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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)