status_serializer.rb 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # frozen_string_literal: true
  2. class REST::StatusSerializer < ActiveModel::Serializer
  3. attributes :id, :created_at, :in_reply_to_id, :in_reply_to_account_id,
  4. :sensitive, :spoiler_text, :visibility, :language,
  5. :uri, :url, :replies_count, :reblogs_count,
  6. :favourites_count
  7. attribute :favourited, if: :current_user?
  8. attribute :reblogged, if: :current_user?
  9. attribute :muted, if: :current_user?
  10. attribute :pinned, if: :pinnable?
  11. attribute :content, unless: :source_requested?
  12. attribute :text, if: :source_requested?
  13. belongs_to :reblog, serializer: REST::StatusSerializer
  14. belongs_to :application, if: :show_application?
  15. belongs_to :account, serializer: REST::AccountSerializer
  16. has_many :media_attachments, serializer: REST::MediaAttachmentSerializer
  17. has_many :ordered_mentions, key: :mentions
  18. has_many :tags
  19. has_many :emojis, serializer: REST::CustomEmojiSerializer
  20. has_one :preview_card, key: :card, serializer: REST::PreviewCardSerializer
  21. has_one :preloadable_poll, key: :poll, serializer: REST::PollSerializer
  22. def id
  23. object.id.to_s
  24. end
  25. def in_reply_to_id
  26. object.in_reply_to_id&.to_s
  27. end
  28. def in_reply_to_account_id
  29. object.in_reply_to_account_id&.to_s
  30. end
  31. def current_user?
  32. !current_user.nil?
  33. end
  34. def show_application?
  35. object.account.user_shows_application? || (current_user? && current_user.account_id == object.account_id)
  36. end
  37. def visibility
  38. # This visibility is masked behind "private"
  39. # to avoid API changes because there are no
  40. # UX differences
  41. if object.limited_visibility?
  42. 'private'
  43. else
  44. object.visibility
  45. end
  46. end
  47. def uri
  48. ActivityPub::TagManager.instance.uri_for(object)
  49. end
  50. def content
  51. Formatter.instance.format(object)
  52. end
  53. def url
  54. ActivityPub::TagManager.instance.url_for(object)
  55. end
  56. def favourited
  57. if instance_options && instance_options[:relationships]
  58. instance_options[:relationships].favourites_map[object.id] || false
  59. else
  60. current_user.account.favourited?(object)
  61. end
  62. end
  63. def reblogged
  64. if instance_options && instance_options[:relationships]
  65. instance_options[:relationships].reblogs_map[object.id] || false
  66. else
  67. current_user.account.reblogged?(object)
  68. end
  69. end
  70. def muted
  71. if instance_options && instance_options[:relationships]
  72. instance_options[:relationships].mutes_map[object.conversation_id] || false
  73. else
  74. current_user.account.muting_conversation?(object.conversation)
  75. end
  76. end
  77. def pinned
  78. if instance_options && instance_options[:relationships]
  79. instance_options[:relationships].pins_map[object.id] || false
  80. else
  81. current_user.account.pinned?(object)
  82. end
  83. end
  84. def pinnable?
  85. current_user? &&
  86. current_user.account_id == object.account_id &&
  87. !object.reblog? &&
  88. %w(public unlisted).include?(object.visibility)
  89. end
  90. def source_requested?
  91. instance_options[:source_requested]
  92. end
  93. def ordered_mentions
  94. object.active_mentions.to_a.sort_by(&:id)
  95. end
  96. class ApplicationSerializer < ActiveModel::Serializer
  97. attributes :name, :website
  98. end
  99. class MentionSerializer < ActiveModel::Serializer
  100. attributes :id, :username, :url, :acct
  101. def id
  102. object.account_id.to_s
  103. end
  104. def username
  105. object.account_username
  106. end
  107. def url
  108. ActivityPub::TagManager.instance.url_for(object.account)
  109. end
  110. def acct
  111. object.account_acct
  112. end
  113. end
  114. class TagSerializer < ActiveModel::Serializer
  115. include RoutingHelper
  116. attributes :name, :url
  117. def url
  118. tag_url(object)
  119. end
  120. end
  121. end