maintux/activeaudit

View on GitHub
lib/active_audit/logger.rb

Summary

Maintainability
B
4 hrs
Test Coverage
require 'active_support/concern'

module ActiveAudit
  module Logger

    extend ActiveSupport::Concern

    included do

      has_many :audits, class_name: "ActiveAudit::Audit", as: :obj

      after_create :log_activity_on_create
      after_update :log_activity_on_update
      before_destroy :log_activity_on_destroy

      attr_accessible :audit_user_id
      attr_accessible :audit_extras
      attr_accessor :audit_user_id
      attr_accessor :audit_extras

      cattr_accessor :loggable_events do
        {}
      end

      def self.loggable_event(event)
        self.loggable_events.merge! event
      end

      def log_event(activity)
        ActiveAudit::Audit.create obj_id: id, obj_type: self.class.to_s, user_id: audit_user_id, activity: activity, extras: audit_extras
      end
      private :log_event

      def log_activity_on_create
        self.class.loggable_events.each do |k,v|
          next unless k.eql?(:create)
          if v.eql?(true)
            log_event k.to_s
          elsif v.is_a?(Array)
            v.each do |field|
              if field.is_a?(Hash) and self.send(field.keys.first).eql?(field.values.first)
                log_event(k.to_s) and break
              elsif field.is_a?(Symbol) and self.send(field.to_s)
                log_event(k.to_s) and break
              end
            end
          end
        end
      end

      def log_activity_on_update
        self.class.loggable_events.each do |k,v|
          next if [:create,:destroy].include?(k)
          if k.eql?(:update) and v.eql?(true)
            log_event k.to_s
          elsif v.is_a?(Array)
            v.each do |field|
              if field.is_a?(Hash) and self.send("#{field.keys.first}_changed?") and self.send(field.keys.first).eql?(field.values.first)
                log_event(k.to_s) and break
              elsif field.is_a?(Symbol) and self.send("#{field}_changed?")
                log_event(k.to_s) and break
              end
            end
          end
        end
      end

      def log_activity_on_destroy
        self.class.loggable_events.each do |k,v|
          next unless k.eql?(:destroy)
          log_event k.to_s
        end
      end

    end

  end
end