Class: PostSerializer

Inherits:
BasicPostSerializer show all
Defined in:
app/serializers/post_serializer.rb

Direct Known Subclasses

WebHookPostSerializer

Constant Summary collapse

INSTANCE_VARS =

To pass in additional information we might need

%i[
  parent_post
  add_raw
  add_title
  single_post_link_counts
  draft_sequence
  post_actions
  all_post_actions
  add_excerpt
]

Instance Attribute Summary

Attributes inherited from BasicPostSerializer

#topic_view

Instance Method Summary collapse

Methods inherited from BasicPostSerializer

#avatar_template, #cooked, #cooked_hidden, #include_cooked_hidden?, #include_name?, #name, #post_custom_fields, #username

Methods inherited from ApplicationSerializer

expire_cache_fragment!, fragment_cache

Methods inherited from ActiveModel::Serializer

#include!

Constructor Details

#initialize(object, opts) ⇒ PostSerializer

Returns a new instance of PostSerializer.



94
95
96
97
98
99
100
# File 'app/serializers/post_serializer.rb', line 94

def initialize(object, opts)
  super(object, opts)

  PostSerializer::INSTANCE_VARS.each do |name|
    self.public_send("#{name}=", opts[name]) if opts.include? name
  end
end

Instance Method Details

#action_codeObject



477
478
479
480
# File 'app/serializers/post_serializer.rb', line 477

def action_code
  return "open_topic" if object.action_code == "public_topic" && SiteSetting.
  object.action_code
end

#action_code_pathObject



494
495
496
# File 'app/serializers/post_serializer.rb', line 494

def action_code_path
  post_custom_fields["action_code_path"]
end

#action_code_whoObject



486
487
488
# File 'app/serializers/post_serializer.rb', line 486

def action_code_who
  post_custom_fields["action_code_who"]
end

#actionsObject

Helper function to decide between #post_actions and @all_post_actions



295
296
297
298
299
# File 'app/serializers/post_serializer.rb', line 295

def actions
  return post_actions if post_actions.present?
  return all_post_actions[object.id] if all_post_actions.present?
  nil
end

#actions_summaryObject

Summary of the actions taken on this post



302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
# File 'app/serializers/post_serializer.rb', line 302

def actions_summary
  result = []
  can_see_post = scope.can_see_post?(object)

  @post_action_type_view =
    @topic_view ? @topic_view.post_action_type_view : PostActionTypeView.new

  public_flag_types = @post_action_type_view.public_types

  @post_action_type_view.types.each do |sym, id|
    count_col = "#{sym}_count".to_sym

    count = object.public_send(count_col) if object.respond_to?(count_col)
    summary = { id: id, count: count }

    if scope.post_can_act?(
         object,
         sym,
         opts: {
           taken_actions: actions,
           notify_flag_types: @post_action_type_view.notify_flag_types,
           additional_message_types: @post_action_type_view.additional_message_types,
           post_action_type_view: @post_action_type_view,
         },
         can_see_post: can_see_post,
       )
      summary[:can_act] = true
    end

    if sym == :notify_user &&
         (
           (scope.current_user.present? && scope.current_user == object.user) ||
             (object.user && object.user.bot?)
         )
      summary.delete(:can_act)
    end

    if actions.present? && SiteSetting.allow_anonymous_likes && sym == :like &&
         !scope.can_delete_post_action?(actions[id])
      summary.delete(:can_act)
    end

    if actions.present? && actions.has_key?(id)
      summary[:acted] = true

      summary[:can_undo] = true if scope.can_delete?(actions[id])
    end

    # only show public data
    unless scope.is_staff? || public_flag_types.values.include?(id)
      summary[:count] = summary[:acted] ? 1 : 0
    end

    summary.delete(:count) if summary[:count].to_i.zero?

    # Only include it if the user can do it or it has a count
    result << summary if summary[:can_act] || summary[:count]
  end

  result
end

#admin?Boolean

Returns:

  • (Boolean)


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

def admin?
  !!(object&.user&.admin?)
end

#badges_grantedObject



227
228
229
230
231
232
233
234
235
236
237
# File 'app/serializers/post_serializer.rb', line 227

def badges_granted
  return [] unless SiteSetting.enable_badges && SiteSetting.show_badges_in_post_header

  if @topic_view
    user_badges = @topic_view.post_user_badges[object.id] || []
  else
    user_badges = UserBadge.for_post_header_badges([object])
  end

  user_badges.map { |user_badge| BasicUserBadgeSerializer.new(user_badge, scope: scope).as_json }
end

#bookmark_auto_delete_preferenceObject



427
428
429
# File 'app/serializers/post_serializer.rb', line 427

def bookmark_auto_delete_preference
  post_bookmark&.auto_delete_preference
end

#bookmark_idObject



431
432
433
# File 'app/serializers/post_serializer.rb', line 431

def bookmark_id
  post_bookmark&.id
end

#bookmark_nameObject



423
424
425
# File 'app/serializers/post_serializer.rb', line 423

def bookmark_name
  post_bookmark&.name
end

#bookmark_reminder_atObject



419
420
421
# File 'app/serializers/post_serializer.rb', line 419

def bookmark_reminder_at
  post_bookmark&.reminder_at
end

#bookmarkedObject



391
392
393
# File 'app/serializers/post_serializer.rb', line 391

def bookmarked
  @bookmarked ||= post_bookmark.present?
end

#can_deleteObject



169
170
171
# File 'app/serializers/post_serializer.rb', line 169

def can_delete
  scope.can_delete?(object)
end

#can_editObject



165
166
167
# File 'app/serializers/post_serializer.rb', line 165

def can_edit
  scope.can_edit?(object)
end

#can_permanently_deleteObject



173
174
175
# File 'app/serializers/post_serializer.rb', line 173

def can_permanently_delete
  true
end

#can_recoverObject



181
182
183
# File 'app/serializers/post_serializer.rb', line 181

def can_recover
  scope.can_recover_post?(object)
end

#can_see_hidden_postObject



185
186
187
# File 'app/serializers/post_serializer.rb', line 185

def can_see_hidden_post
  scope.can_see_hidden_post?(object)
end

#can_view_edit_historyObject



439
440
441
# File 'app/serializers/post_serializer.rb', line 439

def can_view_edit_history
  scope.can_view_edit_history?(object)
end

#can_wikiObject



189
190
191
# File 'app/serializers/post_serializer.rb', line 189

def can_wiki
  scope.can_wiki?(object)
end

#category_idObject



130
131
132
# File 'app/serializers/post_serializer.rb', line 130

def category_id
  topic&.category_id
end

#deleted_byObject



286
287
288
# File 'app/serializers/post_serializer.rb', line 286

def deleted_by
  BasicUserSerializer.new(object.deleted_by, root: false).as_json
end

#display_usernameObject



193
194
195
# File 'app/serializers/post_serializer.rb', line 193

def display_username
  object.user&.name
end

#flair_bg_colorObject



215
216
217
# File 'app/serializers/post_serializer.rb', line 215

def flair_bg_color
  object.user&.flair_group&.flair_bg_color
end

#flair_colorObject



219
220
221
# File 'app/serializers/post_serializer.rb', line 219

def flair_color
  object.user&.flair_group&.flair_color
end

#flair_group_idObject



223
224
225
# File 'app/serializers/post_serializer.rb', line 223

def flair_group_id
  object.user&.flair_group_id
end

#flair_nameObject



207
208
209
# File 'app/serializers/post_serializer.rb', line 207

def flair_name
  object.user&.flair_group&.name
end

#flair_urlObject



211
212
213
# File 'app/serializers/post_serializer.rb', line 211

def flair_url
  object.user&.flair_group&.flair_url
end

#group_moderatorObject



146
147
148
# File 'app/serializers/post_serializer.rb', line 146

def group_moderator
  !!@group_moderator
end

#include_action_code?Boolean

Returns:

  • (Boolean)


482
483
484
# File 'app/serializers/post_serializer.rb', line 482

def include_action_code?
  object.action_code.present?
end

#include_action_code_path?Boolean

Returns:

  • (Boolean)


498
499
500
# File 'app/serializers/post_serializer.rb', line 498

def include_action_code_path?
  include_action_code? && action_code_path.present?
end

#include_action_code_who?Boolean

Returns:

  • (Boolean)


490
491
492
# File 'app/serializers/post_serializer.rb', line 490

def include_action_code_who?
  include_action_code? && action_code_who.present?
end

#include_bookmark_auto_delete_preference?Boolean

Returns:

  • (Boolean)


403
404
405
# File 'app/serializers/post_serializer.rb', line 403

def include_bookmark_auto_delete_preference?
  bookmarked
end

#include_bookmark_id?Boolean

Returns:

  • (Boolean)


407
408
409
# File 'app/serializers/post_serializer.rb', line 407

def include_bookmark_id?
  bookmarked
end

#include_bookmark_name?Boolean

Returns:

  • (Boolean)


399
400
401
# File 'app/serializers/post_serializer.rb', line 399

def include_bookmark_name?
  bookmarked
end

#include_bookmark_reminder_at?Boolean

Returns:

  • (Boolean)


395
396
397
# File 'app/serializers/post_serializer.rb', line 395

def include_bookmark_reminder_at?
  bookmarked
end

#include_can_permanently_delete?Boolean

Returns:

  • (Boolean)


177
178
179
# File 'app/serializers/post_serializer.rb', line 177

def include_can_permanently_delete?
  SiteSetting.can_permanently_delete && scope.is_admin? && object.deleted_at
end

#include_category_id?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'app/serializers/post_serializer.rb', line 114

def include_category_id?
  @add_title
end

#include_deleted_by?Boolean

Returns:

  • (Boolean)


290
291
292
# File 'app/serializers/post_serializer.rb', line 290

def include_deleted_by?
  scope.is_staff? && object.deleted_by.present?
end

#include_display_username?Boolean

Returns:

  • (Boolean)


435
436
437
# File 'app/serializers/post_serializer.rb', line 435

def include_display_username?
  SiteSetting.enable_names?
end

#include_draft_sequence?Boolean

Returns:

  • (Boolean)


364
365
366
# File 'app/serializers/post_serializer.rb', line 364

def include_draft_sequence?
  @draft_sequence.present?
end

#include_excerpt?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'app/serializers/post_serializer.rb', line 118

def include_excerpt?
  @add_excerpt
end

#include_group_moderator?Boolean

Returns:

  • (Boolean)


150
151
152
153
154
155
156
157
158
159
# File 'app/serializers/post_serializer.rb', line 150

def include_group_moderator?
  @group_moderator ||=
    begin
      if @topic_view
        @topic_view.category_group_moderator_user_ids.include?(object.user_id)
      else
        object&.user&.guardian&.is_category_group_moderator?(object&.topic&.category)
      end
    end
end

#include_hidden_reason_id?Boolean

Returns:

  • (Boolean)


540
541
542
# File 'app/serializers/post_serializer.rb', line 540

def include_hidden_reason_id?
  object.hidden
end

#include_is_auto_generated?Boolean

Returns:

  • (Boolean)


467
468
469
# File 'app/serializers/post_serializer.rb', line 467

def include_is_auto_generated?
  object.via_email? && is_auto_generated
end

#include_last_wiki_edit?Boolean

Returns:

  • (Boolean)


536
537
538
# File 'app/serializers/post_serializer.rb', line 536

def include_last_wiki_edit?
  object.wiki && object.post_number == 1 && object.revisions.size > 0
end

Returns:

  • (Boolean)


376
377
378
379
380
381
# File 'app/serializers/post_serializer.rb', line 376

def include_link_counts?
  return true if @single_post_link_counts.present?

  @topic_view.present? && @topic_view.link_counts.present? &&
    @topic_view.link_counts[object.id].present?
end

#include_locked?Boolean

Only show locked posts to the users who made the post and staff

Returns:

  • (Boolean)


528
529
530
# File 'app/serializers/post_serializer.rb', line 528

def include_locked?
  object.locked? && (yours || scope.is_staff?)
end

#include_mentioned_users?Boolean

Returns:

  • (Boolean)


613
614
615
# File 'app/serializers/post_serializer.rb', line 613

def include_mentioned_users?
  SiteSetting.enable_user_status
end

#include_notice?Boolean

Returns:

  • (Boolean)


506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
# File 'app/serializers/post_serializer.rb', line 506

def include_notice?
  return false if notice.blank?

  case notice["type"]
  when Post.notices[:custom]
    return true
  when Post.notices[:new_user]
    min_trust_level = SiteSetting.new_user_notice_tl
  when Post.notices[:returning_user]
    min_trust_level = SiteSetting.returning_user_notice_tl
  else
    return false
  end

  scope.user && scope.user.id != object.user_id && scope.user.has_trust_level?(min_trust_level)
end

#include_raw?Boolean

Returns:

  • (Boolean)


372
373
374
# File 'app/serializers/post_serializer.rb', line 372

def include_raw?
  @add_raw.present? && (!object.hidden || scope.user&.staff? || yours)
end

#include_read?Boolean

Returns:

  • (Boolean)


383
384
385
# File 'app/serializers/post_serializer.rb', line 383

def include_read?
  @topic_view.present?
end

#include_reply_to_user?Boolean

Returns:

  • (Boolean)


387
388
389
# File 'app/serializers/post_serializer.rb', line 387

def include_reply_to_user?
  !(SiteSetting.suppress_reply_when_quoting && object.reply_quoted?) && object.reply_to_user
end

#include_reviewable_id?Boolean

Returns:

  • (Boolean)


554
555
556
# File 'app/serializers/post_serializer.rb', line 554

def include_reviewable_id?
  can_review_topic?
end

#include_reviewable_score_count?Boolean

Returns:

  • (Boolean)


567
568
569
# File 'app/serializers/post_serializer.rb', line 567

def include_reviewable_score_count?
  can_review_topic?
end

#include_reviewable_score_pending_count?Boolean

Returns:

  • (Boolean)


580
581
582
# File 'app/serializers/post_serializer.rb', line 580

def include_reviewable_score_pending_count?
  can_review_topic?
end

#include_slug_title?Boolean

Returns:

  • (Boolean)


368
369
370
# File 'app/serializers/post_serializer.rb', line 368

def include_slug_title?
  @topic_slug.present?
end

#include_static_doc?Boolean

Returns:

  • (Boolean)


455
456
457
# File 'app/serializers/post_serializer.rb', line 455

def include_static_doc?
  object.is_first_post? && Discourse.static_doc_topic_ids.include?(object.topic_id)
end

#include_title_is_group?Boolean

Returns:

  • (Boolean)


270
271
272
# File 'app/serializers/post_serializer.rb', line 270

def include_title_is_group?
  object&.user&.title.present?
end

#include_topic_html_title?Boolean

Returns:

  • (Boolean)


110
111
112
# File 'app/serializers/post_serializer.rb', line 110

def include_topic_html_title?
  @add_title
end

#include_topic_title?Boolean

Returns:

  • (Boolean)


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

def include_topic_title?
  @add_title
end

#include_user_custom_fields?Boolean

Returns:

  • (Boolean)


447
448
449
# File 'app/serializers/post_serializer.rb', line 447

def include_user_custom_fields?
  user_custom_fields_object[object.user_id]
end

#include_user_status?Boolean

Returns:

  • (Boolean)


592
593
594
# File 'app/serializers/post_serializer.rb', line 592

def include_user_status?
  SiteSetting.enable_user_status && object.user&.has_status?
end

#include_user_suspended?Boolean

Returns:

  • (Boolean)


588
589
590
# File 'app/serializers/post_serializer.rb', line 588

def include_user_suspended?
  object.user&.suspended?
end

#include_via_email?Boolean

Returns:

  • (Boolean)


459
460
461
# File 'app/serializers/post_serializer.rb', line 459

def include_via_email?
  object.via_email?
end

#is_auto_generatedObject



463
464
465
# File 'app/serializers/post_serializer.rb', line 463

def is_auto_generated
  object.incoming_email&.is_auto_generated
end

#last_wiki_editObject



532
533
534
# File 'app/serializers/post_serializer.rb', line 532

def last_wiki_edit
  object.revisions.last.updated_at
end


239
240
241
242
243
244
245
246
247
248
249
250
251
252
# File 'app/serializers/post_serializer.rb', line 239

def link_counts
  return @single_post_link_counts if @single_post_link_counts.present?

  # TODO: This could be better, just porting the old one over
  @topic_view.link_counts[object.id].map do |link|
    result = {}
    result[:url] = link[:url]
    result[:internal] = link[:internal]
    result[:reflection] = link[:reflection]
    result[:title] = link[:title] if link[:title].present?
    result[:clicks] = link[:clicks] || 0
    result
  end
end

#lockedObject



523
524
525
# File 'app/serializers/post_serializer.rb', line 523

def locked
  true
end

#mentioned_usersObject



600
601
602
603
604
605
606
607
608
609
610
611
# File 'app/serializers/post_serializer.rb', line 600

def mentioned_users
  users =
    if @topic_view && (mentioned_users = @topic_view.mentioned_users[object.id])
      mentioned_users
    else
      query = User.includes(:user_option)
      query = query.includes(:user_status) if SiteSetting.enable_user_status
      query = query.where(username_lower: object.mentions)
    end

  users.map { |user| BasicUserSerializer.new(user, root: false, include_status: true).as_json }
end

#moderator?Boolean

Returns:

  • (Boolean)


134
135
136
# File 'app/serializers/post_serializer.rb', line 134

def moderator?
  !!(object&.user&.moderator?)
end

#noticeObject



502
503
504
# File 'app/serializers/post_serializer.rb', line 502

def notice
  post_custom_fields[Post::NOTICE]
end

#post_bookmarkObject



411
412
413
414
415
416
417
# File 'app/serializers/post_serializer.rb', line 411

def post_bookmark
  if @topic_view.present?
    @post_bookmark ||= @topic_view.bookmarks.find { |bookmark| bookmark.bookmarkable == object }
  else
    @post_bookmark ||= Bookmark.find_by(user: scope.user, bookmarkable: object)
  end
end

#primary_group_nameObject



197
198
199
200
201
202
203
204
205
# File 'app/serializers/post_serializer.rb', line 197

def primary_group_name
  return nil unless object.user && object.user.primary_group_id

  if @topic_view
    @topic_view.primary_group_names[object.user.primary_group_id]
  else
    object.user.primary_group.name if object.user.primary_group
  end
end

#readObject



254
255
256
# File 'app/serializers/post_serializer.rb', line 254

def read
  @topic_view.read?(object.post_number)
end

#reply_to_userObject



278
279
280
281
282
283
284
# File 'app/serializers/post_serializer.rb', line 278

def reply_to_user
  {
    username: object.reply_to_user.username,
    name: object.reply_to_user.name,
    avatar_template: object.reply_to_user.avatar_template,
  }
end

#reviewable_idObject

If we have a topic view, it has bulk values for the reviewable content we can use



545
546
547
548
549
550
551
552
# File 'app/serializers/post_serializer.rb', line 545

def reviewable_id
  if @topic_view.present?
    for_post = @topic_view.reviewable_counts[object.id]
    return for_post ? for_post[:reviewable_id] : 0
  end

  reviewable&.id
end

#reviewable_score_countObject



558
559
560
561
562
563
564
565
# File 'app/serializers/post_serializer.rb', line 558

def reviewable_score_count
  if @topic_view.present?
    for_post = @topic_view.reviewable_counts[object.id]
    return for_post ? for_post[:total] : 0
  end

  reviewable_scores.size
end

#reviewable_score_pending_countObject



571
572
573
574
575
576
577
578
# File 'app/serializers/post_serializer.rb', line 571

def reviewable_score_pending_count
  if @topic_view.present?
    for_post = @topic_view.reviewable_counts[object.id]
    return for_post ? for_post[:pending] : 0
  end

  reviewable_scores.count { |rs| rs.pending? }
end

#scoreObject



258
259
260
# File 'app/serializers/post_serializer.rb', line 258

def score
  object.score || 0
end

#staff?Boolean

Returns:

  • (Boolean)


142
143
144
# File 'app/serializers/post_serializer.rb', line 142

def staff?
  !!(object&.user&.staff?)
end

#static_docObject



451
452
453
# File 'app/serializers/post_serializer.rb', line 451

def static_doc
  true
end

#title_is_groupObject



266
267
268
# File 'app/serializers/post_serializer.rb', line 266

def title_is_group
  object&.user&.title == object.user&.primary_group&.title
end

#topic_html_titleObject



126
127
128
# File 'app/serializers/post_serializer.rb', line 126

def topic_html_title
  topic&.fancy_title
end

#topic_slugObject



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

def topic_slug
  topic&.slug
end

#topic_titleObject



122
123
124
# File 'app/serializers/post_serializer.rb', line 122

def topic_title
  topic&.title
end

#trust_levelObject



274
275
276
# File 'app/serializers/post_serializer.rb', line 274

def trust_level
  object&.user&.trust_level
end

#user_custom_fieldsObject



443
444
445
# File 'app/serializers/post_serializer.rb', line 443

def user_custom_fields
  user_custom_fields_object[object.user_id]
end

#user_statusObject



596
597
598
# File 'app/serializers/post_serializer.rb', line 596

def user_status
  UserStatusSerializer.new(object.user&.user_status, root: false)
end

#user_suspendedObject



584
585
586
# File 'app/serializers/post_serializer.rb', line 584

def user_suspended
  true
end

#user_titleObject



262
263
264
# File 'app/serializers/post_serializer.rb', line 262

def user_title
  object&.user&.title
end

#versionObject



471
472
473
474
475
# File 'app/serializers/post_serializer.rb', line 471

def version
  return 1 if object.hidden && !scope.can_view_hidden_post_revisions?

  scope.is_staff? ? object.version : object.public_version
end

#yoursObject



161
162
163
# File 'app/serializers/post_serializer.rb', line 161

def yours
  scope.user == object.user
end