Class: PostRevisionSerializer

Inherits:
ApplicationSerializer show all
Defined in:
app/serializers/post_revision_serializer.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ApplicationSerializer

expire_cache_fragment!, fragment_cache

Methods inherited from ActiveModel::Serializer

#include!

Class Method Details

.add_compared_field(field) ⇒ Object

Creates a field called field_name_changes with previous and current members if a field has changed in this revision



33
34
35
36
37
38
39
40
# File 'app/serializers/post_revision_serializer.rb', line 33

def self.add_compared_field(field)
  changes_name = "#{field}_changes".to_sym

  self.attributes changes_name
  define_method(changes_name) { { previous: previous[field], current: current[field] } }

  define_method("include_#{changes_name}?") { previous[field] != current[field] }
end

Instance Method Details

#avatar_templateObject



98
99
100
# File 'app/serializers/post_revision_serializer.rb', line 98

def avatar_template
  user.avatar_template
end

#body_changesObject



117
118
119
120
121
122
123
124
125
126
# File 'app/serializers/post_revision_serializer.rb', line 117

def body_changes
  cooked_diff = DiscourseDiff.new(previous["cooked"], current["cooked"])
  raw_diff = DiscourseDiff.new(previous["raw"], current["raw"])

  {
    inline: cooked_diff.inline_html,
    side_by_side: cooked_diff.side_by_side_html,
    side_by_side_markdown: raw_diff.side_by_side_markdown,
  }
end

#can_editObject



106
107
108
# File 'app/serializers/post_revision_serializer.rb', line 106

def can_edit
  scope.can_edit?(object.post)
end

#current_hiddenObject



48
49
50
# File 'app/serializers/post_revision_serializer.rb', line 48

def current_hidden
  current["hidden"]
end

#current_revisionObject



65
66
67
# File 'app/serializers/post_revision_serializer.rb', line 65

def current_revision
  object.number
end

#current_versionObject



82
83
84
# File 'app/serializers/post_revision_serializer.rb', line 82

def current_version
  @current_version ||= revisions.select { |r| r["revision"] <= current_revision }.count + 1
end

#display_usernameObject



94
95
96
# File 'app/serializers/post_revision_serializer.rb', line 94

def display_username
  user.username
end

#edit_reasonObject



110
111
112
113
114
115
# File 'app/serializers/post_revision_serializer.rb', line 110

def edit_reason
  # only show 'edit_reason' when revisions are consecutive
  if scope.can_view_hidden_post_revisions? || current["revision"] == previous["revision"] + 1
    current["edit_reason"]
  end
end

#first_revisionObject



52
53
54
# File 'app/serializers/post_revision_serializer.rb', line 52

def first_revision
  revisions.first["revision"]
end

#include_tags_changes?Boolean

Returns:

  • (Boolean)


171
172
173
# File 'app/serializers/post_revision_serializer.rb', line 171

def include_tags_changes?
  scope.can_see_tags?(topic) && previous["tags"] != current["tags"]
end

#last_revisionObject



78
79
80
# File 'app/serializers/post_revision_serializer.rb', line 78

def last_revision
  @last_revision ||= revisions.select { |r| r["revision"] <= post.version }.last["revision"]
end

#next_revisionObject



69
70
71
72
73
74
75
76
# File 'app/serializers/post_revision_serializer.rb', line 69

def next_revision
  @next_revision ||=
    revisions
      .select { |r| r["revision"] <= last_revision }
      .select { |r| r["revision"] > current_revision }
      .first
      .try(:[], "revision")
end

#previous_hiddenObject



44
45
46
# File 'app/serializers/post_revision_serializer.rb', line 44

def previous_hidden
  previous["hidden"]
end

#previous_revisionObject



56
57
58
59
60
61
62
63
# File 'app/serializers/post_revision_serializer.rb', line 56

def previous_revision
  @previous_revision ||=
    revisions
      .select { |r| r["revision"] >= first_revision }
      .select { |r| r["revision"] < current_revision }
      .last
      .try(:[], "revision")
end

#tags_changesObject



163
164
165
166
167
168
169
# File 'app/serializers/post_revision_serializer.rb', line 163

def tags_changes
  changes = {
    previous: filter_visible_tags(previous["tags"]),
    current: filter_visible_tags(current["tags"]),
  }
  changes[:previous] == changes[:current] ? nil : changes
end

#title_changesObject



128
129
130
131
132
133
134
135
136
137
138
# File 'app/serializers/post_revision_serializer.rb', line 128

def title_changes
  prev = "<div>#{previous["title"] && CGI.escapeHTML(previous["title"])}</div>"
  cur = "<div>#{current["title"] && CGI.escapeHTML(current["title"])}</div>"

  # always show the title for post_number == 1
  return if object.post.post_number > 1 && prev == cur

  diff = DiscourseDiff.new(prev, cur)

  { inline: diff.inline_html, side_by_side: diff.side_by_side_html }
end

#user_changesObject



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'app/serializers/post_revision_serializer.rb', line 140

def user_changes
  prev = previous["user_id"]
  cur = current["user_id"]
  return if prev == cur

  # if stuff is messed up, default to system
  previous = User.find_by(id: prev) || Discourse.system_user
  current = User.find_by(id: cur) || Discourse.system_user

  {
    previous: {
      username: previous.username_lower,
      display_username: previous.username,
      avatar_template: previous.avatar_template,
    },
    current: {
      username: current.username_lower,
      display_username: current.username,
      avatar_template: current.avatar_template,
    },
  }
end

#usernameObject



90
91
92
# File 'app/serializers/post_revision_serializer.rb', line 90

def username
  user.username_lower
end

#version_countObject



86
87
88
# File 'app/serializers/post_revision_serializer.rb', line 86

def version_count
  revisions.count
end

#wikiObject



102
103
104
# File 'app/serializers/post_revision_serializer.rb', line 102

def wiki
  object.post.wiki
end