summaryrefslogtreecommitdiff
path: root/app/presenters/mod_log_presenter.rb
blob: 58a2b54145c9b04721cfcdcf4fb8f49220c000f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# frozen_string_literal: true
class ModLogPresenter
  EMPTY_VERSION = Hashie::Mash.new.freeze

  ModLogEntry = Struct.new(:audit, :action, :target, :old_version, :new_version)

  attr_reader :raw_entries

  def initialize(page, per_page = 15)
    # the only 'creations' in the audit log should be UserBans
    @raw_entries = Audited::Audit.where("action != 'created' OR auditable_type = 'UserBan'")
                                .order(created_at: :desc).page(page).per(per_page)
  end

  def entries
    @entries ||= @raw_entries.map { |audit| ModLogPresenter.transform_audit(audit) }
  end

  def self.transform_audit(audit)
    created = audit.action == 'create'

    old_version = created ? EMPTY_VERSION : audit.old_attributes
    new_version = audit.new_attributes

    remove_redundant_attributes!(old_version, new_version) unless created

    action = if old_version[:hidden_from_users] != new_version[:hidden_from_users]
               new_version[:hidden_from_users] ? 'deleted' : 'restored'
             else
               audit.auditable.mod_log_action
             end

    ModLogEntry.new(
      audit,
      action,
      audit.auditable.mod_log_target,
      old_version,
      new_version
    )
  end

  private

  def self.remove_redundant_attributes!(old_version, new_version)
    new_version.each do |k, v|
      # if the old version has the same key and it didn't change, delete it.
      if old_version.include?(k) && old_version[k] == v
        new_version.delete(k)
        old_version.delete(k)
      end
    end
  end
end