Allow private posts with references

This commit is contained in:
KMY 2023-09-19 18:50:16 +09:00
parent 818bcc0277
commit 11300d7550
2 changed files with 41 additions and 8 deletions

View file

@ -11,8 +11,6 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
:atom_uri, :in_reply_to_atom_uri, :atom_uri, :in_reply_to_atom_uri,
:conversation, :searchable_by, :limited_scope :conversation, :searchable_by, :limited_scope
attribute :references, if: :not_private_post?
attribute :content attribute :content
attribute :content_map, if: :language? attribute :content_map, if: :language?
attribute :updated, if: :edited? attribute :updated, if: :edited?
@ -25,6 +23,7 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
has_many :virtual_tags, key: :tag has_many :virtual_tags, key: :tag
has_one :replies, serializer: ActivityPub::CollectionSerializer, if: :local? has_one :replies, serializer: ActivityPub::CollectionSerializer, if: :local?
has_one :references, serializer: ActivityPub::CollectionSerializer
has_many :poll_options, key: :one_of, if: :poll_and_not_multiple? has_many :poll_options, key: :one_of, if: :poll_and_not_multiple?
has_many :poll_options, key: :any_of, if: :poll_and_multiple? has_many :poll_options, key: :any_of, if: :poll_and_multiple?
@ -71,7 +70,19 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
end end
def references def references
ActivityPub::TagManager.instance.references_uri_for(object) refs = object.references.reorder(id: :asc).take(5).pluck(:id, :uri)
last_id = refs.last&.first
ActivityPub::CollectionPresenter.new(
type: :unordered,
id: ActivityPub::TagManager.instance.references_uri_for(object),
first: ActivityPub::CollectionPresenter.new(
type: :unordered,
part_of: ActivityPub::TagManager.instance.references_uri_for(object),
items: refs.map(&:second),
next: last_id ? ActivityPub::TagManager.instance.references_uri_for(object, page: true, min_id: last_id) : ActivityPub::TagManager.instance.references_uri_for(object, page: true, only_other_accounts: true)
)
)
end end
def language? def language?
@ -160,10 +171,6 @@ class ActivityPub::NoteSerializer < ActivityPub::Serializer
object.account.local? object.account.local?
end end
def not_private_post?
!object.private_visibility? && !object.direct_visibility? && !object.limited_visibility?
end
def quote? def quote?
object.references.count == 1 && object.account.user&.settings&.[]('single_ref_to_quote') object.references.count == 1 && object.account.user&.settings&.[]('single_ref_to_quote')
end end

View file

@ -14,10 +14,12 @@ describe ActivityPub::NoteSerializer do
let!(:reply_by_account_third) { Fabricate(:status, account: account, thread: parent, visibility: :public) } let!(:reply_by_account_third) { Fabricate(:status, account: account, thread: parent, visibility: :public) }
let!(:reply_by_account_visibility_direct) { Fabricate(:status, account: account, thread: parent, visibility: :direct) } let!(:reply_by_account_visibility_direct) { Fabricate(:status, account: account, thread: parent, visibility: :direct) }
let!(:referred) { nil } let!(:referred) { nil }
let!(:referred2) { nil }
let(:convert_to_quote) { false } let(:convert_to_quote) { false }
before(:each) do before(:each) do
parent.references << referred if referred.present? parent.references << referred if referred.present?
parent.references << referred2 if referred2.present?
account.user&.settings&.[]=('single_ref_to_quote', true) if convert_to_quote account.user&.settings&.[]=('single_ref_to_quote', true) if convert_to_quote
@serialization = ActiveModelSerializers::SerializableResource.new(parent, serializer: described_class, adapter: ActivityPub::Adapter) @serialization = ActiveModelSerializers::SerializableResource.new(parent, serializer: described_class, adapter: ActivityPub::Adapter)
end end
@ -49,8 +51,17 @@ describe ActivityPub::NoteSerializer do
context 'when has quote but no_convert setting' do context 'when has quote but no_convert setting' do
let(:referred) { Fabricate(:status) } let(:referred) { Fabricate(:status) }
it 'has a references collection' do
expect(subject['references']['type']).to eql('Collection')
end
it 'has a references collection with a first Page' do
expect(subject['references']['first']['type']).to eql('CollectionPage')
end
it 'has as reference' do it 'has as reference' do
expect(subject['quoteUri']).to be_nil expect(subject['quoteUri']).to be_nil
expect(subject['references']['first']['items']).to include referred.uri
end end
end end
@ -60,7 +71,22 @@ describe ActivityPub::NoteSerializer do
it 'has as quote' do it 'has as quote' do
expect(subject['quoteUri']).to_not be_nil expect(subject['quoteUri']).to_not be_nil
expect(subject['_misskey_quote'] == subject['quoteUri']).to be true expect(subject['quoteUri']).to eq referred.uri
expect(subject['_misskey_quote']).to eq referred.uri
expect(subject['_misskey_content']).to eq referred.text
expect(subject['references']['first']['items']).to include referred.uri
end
end
context 'when has multiple references and convert setting' do
let(:referred) { Fabricate(:status) }
let(:referred2) { Fabricate(:status) }
let(:convert_to_quote) { true }
it 'has as quote' do
expect(subject['quoteUri']).to be_nil
expect(subject['references']['first']['items']).to include referred.uri
expect(subject['references']['first']['items']).to include referred2.uri
end end
end end
end end