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



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

def avatar_template
  user.avatar_template
end

#body_changesObject



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

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



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

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

#category_id_changesObject



179
180
181
182
183
184
# File 'app/serializers/post_revision_serializer.rb', line 179

def category_id_changes
  pre = filter_category_id previous["category_id"]
  cur = filter_category_id current["category_id"]

  pre == cur ? nil : { previous: pre, current: cur }
end

#current_hiddenObject



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

def current_hidden
  current["hidden"]
end

#current_revisionObject



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

def current_revision
  object.number
end

#current_versionObject



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

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

#display_usernameObject



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

def display_username
  user.username
end

#edit_reasonObject



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

def edit_reason
  current["edit_reason"]
end

#first_revisionObject



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

def first_revision
  revisions.first["revision"]
end

#include_category_id_changes?Boolean

Returns:

  • (Boolean)


186
187
188
# File 'app/serializers/post_revision_serializer.rb', line 186

def include_category_id_changes?
  previous["category_id"] != current["category_id"]
end

#include_edit_reason?Boolean

Returns:

  • (Boolean)


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

def include_edit_reason?
  scope.can_view_hidden_post_revisions? || current["revision"] == previous["revision"] + 1
end

#include_tags_changes?Boolean

Returns:

  • (Boolean)


175
176
177
# File 'app/serializers/post_revision_serializer.rb', line 175

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

#include_title_changes?Boolean

Returns:

  • (Boolean)


138
139
140
# File 'app/serializers/post_revision_serializer.rb', line 138

def include_title_changes?
  object.post.post_number == 1
end

#include_user_changes?Boolean

Returns:

  • (Boolean)


164
165
166
# File 'app/serializers/post_revision_serializer.rb', line 164

def include_user_changes?
  previous["user_id"] != current["user_id"]
end

#last_revisionObject



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

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

#next_revisionObject



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

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

#previous_hiddenObject



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

def previous_hidden
  previous["hidden"]
end

#previous_revisionObject



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

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

#tags_changesObject



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

def tags_changes
  pre = filter_tags previous["tags"]
  cur = filter_tags current["tags"]

  pre == cur ? nil : { previous: pre, current: cur }
end

#title_changesObject



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

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



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

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

  # 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



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

def username
  user.username_lower
end

#version_countObject



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

def version_count
  revisions.count
end