about summary refs log tree commit diff
path: root/app/serializers/activitypub/note_serializer.rb
blob: 15031dfdc44767091977eff722b4a1bc451d3793 (plain) (blame)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# frozen_string_literal: true

class ActivityPub::NoteSerializer < ActiveModel::Serializer
  attributes :id, :type, :summary, :content,
             :in_reply_to, :published, :url,
             :attributed_to, :to, :cc, :sensitive

  has_many :media_attachments, key: :attachment
  has_many :virtual_tags, key: :tag

  attribute :atom_uri, key: '_:atomUri', if: :local?
  attribute :in_reply_to_atom_uri, key: '_:inReplyToAtomUri'

  def id
    ActivityPub::TagManager.instance.uri_for(object)
  end

  def type
    'Note'
  end

  def summary
    object.spoiler_text.presence
  end

  def content
    Formatter.instance.format(object)
  end

  def in_reply_to
    return unless object.reply?

    if object.thread.uri.nil? || object.thread.uri.start_with?('http')
      ActivityPub::TagManager.instance.uri_for(object.thread)
    else
      object.thread.url
    end
  end

  def published
    object.created_at.iso8601
  end

  def url
    ActivityPub::TagManager.instance.url_for(object)
  end

  def attributed_to
    ActivityPub::TagManager.instance.uri_for(object.account)
  end

  def to
    ActivityPub::TagManager.instance.to(object)
  end

  def cc
    ActivityPub::TagManager.instance.cc(object)
  end

  def virtual_tags
    object.mentions + object.tags
  end

  def atom_uri
    ::TagManager.instance.uri_for(object)
  end

  def in_reply_to_atom_uri
    return unless object.reply?

    ::TagManager.instance.uri_for(object.thread)
  end

  def local?
    object.account.local?
  end

  class MediaAttachmentSerializer < ActiveModel::Serializer
    include RoutingHelper

    attributes :type, :media_type, :url

    def type
      'Document'
    end

    def media_type
      object.file_content_type
    end

    def url
      object.local? ? full_asset_url(object.file.url(:original, false)) : object.remote_url
    end
  end

  class MentionSerializer < ActiveModel::Serializer
    attributes :type, :href, :name

    def type
      'Mention'
    end

    def href
      ActivityPub::TagManager.instance.uri_for(object.account)
    end

    def name
      "@#{object.account.acct}"
    end
  end

  class TagSerializer < ActiveModel::Serializer
    include RoutingHelper

    attributes :type, :href, :name

    def type
      'Hashtag'
    end

    def href
      tag_url(object)
    end

    def name
      "##{object.name}"
    end
  end
end