Class: Servitium::Service

Inherits:
Object
  • Object
show all
Includes:
ActiveSupport::Callbacks, CaptureExceptionsMixin, I18n, TransactionalMixin
Defined in:
lib/servitium/service.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from I18n

#t

Methods included from CaptureExceptionsMixin

included

Methods included from TransactionalMixin

included

Constructor Details

#initialize(*args) ⇒ Service

Returns a new instance of Service.



28
29
30
31
32
33
# File 'lib/servitium/service.rb', line 28

def initialize(*args)
  @raise_on_error = false
  @command = args.first.is_a?(Symbol) ? args.shift : :perform
  @context = context_class.new(*args)
  super()
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



13
14
15
# File 'lib/servitium/service.rb', line 13

def context
  @context
end

#raise_on_errorObject (readonly)

Returns the value of attribute raise_on_error.



13
14
15
# File 'lib/servitium/service.rb', line 13

def raise_on_error
  @raise_on_error
end

Class Method Details

.after_async_failure(*filters, &block) ⇒ Object



259
260
261
# File 'lib/servitium/service.rb', line 259

def after_async_failure(*filters, &block)
  set_callback(:async_failure, :after, *filters, &block)
end

.after_async_success(*filters, &block) ⇒ Object



255
256
257
# File 'lib/servitium/service.rb', line 255

def after_async_success(*filters, &block)
  set_callback(:async_success, :after, *filters, &block)
end

.after_commit(*filters, &block) ⇒ Object

Callbacks



227
228
229
# File 'lib/servitium/service.rb', line 227

def after_commit(*filters, &block)
  set_callback(:commit, :after, *filters, &block)
end

.after_failure(*filters, &block) ⇒ Object



243
244
245
# File 'lib/servitium/service.rb', line 243

def after_failure(*filters, &block)
  set_callback(:failure, :after, *filters, &block)
end

.after_perform(*filters, &block) ⇒ Object



239
240
241
# File 'lib/servitium/service.rb', line 239

def after_perform(*filters, &block)
  set_callback(:perform, :after, *filters, &block)
end

.around_async_failure(*filters, &block) ⇒ Object



251
252
253
# File 'lib/servitium/service.rb', line 251

def around_async_failure(*filters, &block)
  set_callback(:async_failure, :around, *filters, &block)
end

.around_async_success(*filters, &block) ⇒ Object



247
248
249
# File 'lib/servitium/service.rb', line 247

def around_async_success(*filters, &block)
  set_callback(:async_success, :around, *filters, &block)
end

.around_perform(*filters, &block) ⇒ Object



235
236
237
# File 'lib/servitium/service.rb', line 235

def around_perform(*filters, &block)
  set_callback(:perform, :around, *filters, &block)
end

.before_perform(*filters, &block) ⇒ Object



231
232
233
# File 'lib/servitium/service.rb', line 231

def before_perform(*filters, &block)
  set_callback(:perform, :before, *filters, &block)
end

.call(*args) ⇒ Object

Call the service returning the service instance



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/servitium/service.rb', line 156

def call(*args)
  inst = new(*args)
  valid_in = inst.context.valid?
  valid_in &&= inst.context.valid?(:in) if inst.context.class.inbound_scope_used
  if valid_in
    inst.context.instance_variable_set(:@called, true)
    inst.send(:call)
    inst.context.valid?(:out) if inst.context.errors.blank? && inst.context.class.inbound_scope_used
    inst.send(:after_commit) unless inst.context.failed?
  end

  inst.send(:failure) if inst.context.failed?

  inst
end

.context(*args, &block) ⇒ Object



295
296
297
298
299
300
301
302
303
304
# File 'lib/servitium/service.rb', line 295

def context(*args, &block)
  return initialized_context(*args) unless block_given?

  begin
    context_class!.new
  rescue StandardError
    nil
  end
  context_class!.class_eval(&block)
end

.context_base_class_nameObject

Get the base class for new contexts defined using context blocks Defaults to Servitium::Context



285
286
287
# File 'lib/servitium/service.rb', line 285

def context_base_class_name
  @@_context_base_class_name ||= 'Servitium::Context'
end

.context_base_class_name=(base_class) ⇒ Object

Override the base class for contexts defined using context blocks, you can use this to change the base class to your own ApplicationContext



291
292
293
# File 'lib/servitium/service.rb', line 291

def context_base_class_name=(base_class)
  @@_context_base_class_name = base_class
end

.context_classObject



263
264
265
# File 'lib/servitium/service.rb', line 263

def context_class
  context_class_name.safe_constantize
end

.context_class!Object



271
272
273
274
275
276
277
278
279
280
281
# File 'lib/servitium/service.rb', line 271

def context_class!
  return context_class if context_class

  context_class_parts = context_class_name.split('::')
  context_class_name_part = context_class_parts.pop
  context_module_name = context_class_parts.join('::')
  context_module = context_module_name.present? ? context_module_name.constantize : Object

  context_module.const_set(context_class_name_part, Class.new(context_base_class_name.constantize))
  context_class
end

.context_class_nameObject



267
268
269
# File 'lib/servitium/service.rb', line 267

def context_class_name
  name.gsub('Service', 'Context')
end

.format_args(hash) ⇒ Object



192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/servitium/service.rb', line 192

def format_args(hash)
  hash.transform_values! do |v|
    case v
    when ActiveRecord::Base
      v.id
    when Hash
      format_args(v)
    when Array
      format_array(v)
    else
      v
    end
  end
end

.format_array(array) ⇒ Object



207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/servitium/service.rb', line 207

def format_array(array)
  array.map do |ele|
    case ele
    when ActiveRecord::Base
      ele.id
    when Hash
      format_args(ele)
    when Array
      format_array(ele)
    else
      ele
    end
  end
end

.initialized_context(*args) ⇒ Object



306
307
308
# File 'lib/servitium/service.rb', line 306

def initialized_context(*args)
  context_class.new(*args)
end

.perform(*args) ⇒ Object

Main point of entry for services



151
152
153
# File 'lib/servitium/service.rb', line 151

def perform(*args)
  call(*args).context
end

.perform!(*args) ⇒ Object

Main point of entry for services, will raise in case of errors



133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/servitium/service.rb', line 133

def perform!(*args)
  inst = new(*args)

  begin
    inst.context.validate!(:in) if inst.context.class.inbound_scope_used
    inst.context.validate!
    inst.context.instance_variable_set(:@called, true)
    inst.send(:call!)
    inst.context.validate!(:out) if inst.context.errors.blank? && inst.context.class.inbound_scope_used
    inst.send(:after_commit) unless inst.context.failed?
  ensure
    inst.send(:failure) if inst.context.failed?
  end

  inst.context
end

.perform_async(*args) ⇒ Object



124
125
126
# File 'lib/servitium/service.rb', line 124

def perform_async(*args)
  perform_later(*args)
end

.perform_later(*args) ⇒ Object

Perform this service async



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/servitium/service.rb', line 173

def perform_later(*args)
  inst = new(*args)
  valid_in = inst.context.valid?
  valid_in &&= inst.context.valid?(:in) if inst.context.class.inbound_scope_used

  if valid_in
    inst.context.instance_variable_set(:@called, true)

    if Servitium.config.bg_jobs_platform == :sidekiq
      formatted_args = JSON.load(JSON.dump(format_args(inst.context.attributes_hash)))
      Servitium::ServiceSidekiqJob.set(queue: name.constantize.queue_name).perform_async(name, formatted_args)
    else
      Servitium::ServiceActiveJob.set(queue: name.constantize.queue_name).perform_later(name, inst.context.attributes_hash)
    end
  end

  inst.context
end

.perform_sync(*args) ⇒ Object



128
129
130
# File 'lib/servitium/service.rb', line 128

def perform_sync(*args)
  perform(*args)
end

.queue_nameObject



222
223
224
# File 'lib/servitium/service.rb', line 222

def queue_name
  'default'
end

Instance Method Details

#ctxObject

Returns the value of attribute context.



15
16
17
# File 'lib/servitium/service.rb', line 15

def context
  @context
end