class ApplicationService

Attributes

bm[R]
cmd[R]
result[R]
usecase[R]

Public Class Methods

call(cmd) click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 7
def call(cmd)
  @cmd = cmd
  @bm = Benchmark.measure do
    raise Errors::InvalidCommand if cmd.invalid?

    @usecase = usecase_class.new(cmd)

    raise Errors::NotAuthorizedError unless usecase.allowed?

    @result = ServiceResult.new { usecase.call }

    rollback if result.error.present?
    usecase.broadcast if result.ok?
  end

  log_command
  result
rescue StandardError => e
  ServiceResult.new { raise e }
end
rollback() click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 28
def rollback
  usecase.rollback_micros
  usecase.rollback
end

Private Class Methods

failure_log() click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 60
def failure_log
  {
    usecase: "#{service_name}::#{usecase_name}",
    status: 'faild',
    body: {
      cmd: cmd.as_json,
      error: result.error.to_s,
      benchmark: bm.as_json
    }
  }.as_json
end
log_command() click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 35
def log_command
  FileUtils.mkdir_p 'log/services'
  service_logger = ActiveSupport::Logger.new(
    Rails.root.join('log', 'services', "#{service_name.underscore}.log").to_s, 'daily'
  )
  service_logger.formatter = proc do |_severity, datetime, _progname, msg|
    "[#{msg['usecase']}] [#{msg['status']}] [#{datetime.to_s(:db)} ##{Process.pid}] -- #{msg['body']}\n"
  end
  log_body = result.ok? ? success_log : failure_log

  service_logger.info(log_body)
end
service_name() click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 76
def service_name
  cmd.class.name.split('::').first
end
success_log() click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 48
def success_log
  {
    usecase: "#{service_name}::#{usecase_name}",
    status: 'success',
    body: {
      cmd: cmd.as_json,
      result: result.value!.as_json,
      benchmark: bm.as_json
    }
  }.as_json
end
usecase_class() click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 72
def usecase_class
  cmd.class.name.gsub('Commands', 'Usecases').constantize
end
usecase_name() click to toggle source
# File lib/generators/service/install/templates/services/application_service.rb, line 80
def usecase_name
  cmd.class.name.split('::').last
end