class Ditty::Listener

Constants

EVENTS

Public Class Methods

new() click to toggle source
# File lib/ditty/listener.rb, line 15
def initialize
  @mutex = Mutex.new
end

Public Instance Methods

action_from(target, method) click to toggle source
# File lib/ditty/listener.rb, line 66
def action_from(target, method)
  return method unless method.to_s.start_with? 'component_'

  "#{target.class.to_s.demodulize.underscore}_#{method.to_s.gsub(/^component_/, '')}"
end
log_action(values) click to toggle source
# File lib/ditty/listener.rb, line 72
def log_action(values)
  values[:user] ||= values[:target].current_user if values[:target]
  @mutex.synchronize { ::Ditty::AuditLog.create values }
end
method_missing(method, *args) click to toggle source
# File lib/ditty/listener.rb, line 19
def method_missing(method, *args)
  unless args[0].is_a?(Hash) && args[0][:target].is_a?(Sinatra::Base) && args[0][:target].settings.track_actions
    return
  end

  log_action(
    user_traits(args[0][:target]).merge(
      action: action_from(args[0][:target], method),
      details: args[0][:details]
    ).merge(args[0][:values] || {})
  )
end
respond_to_missing?(method, _include_private = false) click to toggle source
# File lib/ditty/listener.rb, line 32
def respond_to_missing?(method, _include_private = false)
  EVENTS.include? method
end
user_login(event) click to toggle source
# File lib/ditty/listener.rb, line 36
def user_login(event)
  log_action(
    user_traits(event[:target]).merge(
      action: action_from(event[:target], :user_login),
      details: event[:details]
    ).merge(event[:values] || {})
  )

  @mutex.synchronize do
    UserLoginTrait.update_or_create(user_traits(event[:target]), updated_at: Time.now)
  end
end
user_register(event) click to toggle source
# File lib/ditty/listener.rb, line 49
def user_register(event)
  user = event[:values][:user]
  log_action(
    user_traits(event[:target]).merge(
      user_id: user.id,
      action: action_from(event[:target], :user_register),
      details: event[:details]
    ).merge(event[:values] || {})
  )

  # Create the SA user if none is present
  sa = Role.find_or_create(name: 'super_admin')
  return if User.where(roles: sa).count.positive?

  user.add_role sa
end
user_traits(target) click to toggle source
# File lib/ditty/listener.rb, line 77
def user_traits(target)
  {
    user_id: target.current_user&.id,
    platform: target.browser.platform.name,
    device: target.browser.device.name,
    browser: target.browser.name,
    ip_address: target.request.ip
  }
end