Fix duplicate `orderedItems` in user archive's `outbox.json` (#31099)

pull/2788/head^2
Claire 2024-07-22 10:56:05 +02:00 committed by GitHub
parent 6e4305de69
commit ced5e853c7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 10 additions and 9 deletions

View File

@ -20,6 +20,6 @@ class ActivityPub::Adapter < ActiveModelSerializers::Adapter::Base
serialized_hash = serialized_hash.select { |k, _| options[:fields].include?(k) } if options[:fields] serialized_hash = serialized_hash.select { |k, _| options[:fields].include?(k) } if options[:fields]
serialized_hash = self.class.transform_key_casing!(serialized_hash, instance_options) serialized_hash = self.class.transform_key_casing!(serialized_hash, instance_options)
{ '@context' => serialized_context(named_contexts, context_extensions) }.merge(serialized_hash) { '@context': serialized_context(named_contexts, context_extensions) }.merge(serialized_hash)
end end
end end

View File

@ -19,8 +19,8 @@ class BackupService < BaseService
def build_outbox_json!(file) def build_outbox_json!(file)
skeleton = serialize(collection_presenter, ActivityPub::CollectionSerializer) skeleton = serialize(collection_presenter, ActivityPub::CollectionSerializer)
skeleton['@context'] = full_context skeleton[:@context] = full_context
skeleton['orderedItems'] = ['!PLACEHOLDER!'] skeleton[:orderedItems] = ['!PLACEHOLDER!']
skeleton = Oj.dump(skeleton) skeleton = Oj.dump(skeleton)
prepend, append = skeleton.split('"!PLACEHOLDER!"') prepend, append = skeleton.split('"!PLACEHOLDER!"')
add_comma = false add_comma = false
@ -33,7 +33,7 @@ class BackupService < BaseService
file.write(statuses.map do |status| file.write(statuses.map do |status|
item = serialize_payload(ActivityPub::ActivityPresenter.from_status(status), ActivityPub::ActivitySerializer) item = serialize_payload(ActivityPub::ActivityPresenter.from_status(status), ActivityPub::ActivitySerializer)
item.delete('@context') item.delete(:@context)
unless item[:type] == 'Announce' || item[:object][:attachment].blank? unless item[:type] == 'Announce' || item[:object][:attachment].blank?
item[:object][:attachment].each do |attachment| item[:object][:attachment].each do |attachment|

View File

@ -59,7 +59,7 @@ RSpec.describe ActivityPub::Adapter do
let(:serializer_class) { TestWithBasicContextSerializer } let(:serializer_class) { TestWithBasicContextSerializer }
it 'renders a basic @context' do it 'renders a basic @context' do
expect(subject).to include({ '@context' => 'https://www.w3.org/ns/activitystreams' }) expect(subject).to include({ '@context': 'https://www.w3.org/ns/activitystreams' })
end end
end end
@ -67,7 +67,7 @@ RSpec.describe ActivityPub::Adapter do
let(:serializer_class) { TestWithNamedContextSerializer } let(:serializer_class) { TestWithNamedContextSerializer }
it 'renders a @context with both items' do it 'renders a @context with both items' do
expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }) expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })
end end
end end
@ -75,7 +75,7 @@ RSpec.describe ActivityPub::Adapter do
let(:serializer_class) { TestWithNestedNamedContextSerializer } let(:serializer_class) { TestWithNestedNamedContextSerializer }
it 'renders a @context with both items' do it 'renders a @context with both items' do
expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] }) expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', 'https://w3id.org/security/v1'] })
end end
end end
@ -83,7 +83,7 @@ RSpec.describe ActivityPub::Adapter do
let(:serializer_class) { TestWithContextExtensionSerializer } let(:serializer_class) { TestWithContextExtensionSerializer }
it 'renders a @context with the extension' do it 'renders a @context with the extension' do
expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', { 'sensitive' => 'as:sensitive' }] }) expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', { 'sensitive' => 'as:sensitive' }] })
end end
end end
@ -91,7 +91,7 @@ RSpec.describe ActivityPub::Adapter do
let(:serializer_class) { TestWithNestedContextExtensionSerializer } let(:serializer_class) { TestWithNestedContextExtensionSerializer }
it 'renders a @context with both extensions' do it 'renders a @context with both extensions' do
expect(subject).to include({ '@context' => ['https://www.w3.org/ns/activitystreams', { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers', 'sensitive' => 'as:sensitive' }] }) expect(subject).to include({ '@context': ['https://www.w3.org/ns/activitystreams', { 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers', 'sensitive' => 'as:sensitive' }] })
end end
end end
end end

View File

@ -60,6 +60,7 @@ RSpec.describe BackupService do
aggregate_failures do aggregate_failures do
expect(body.scan('@context').count).to eq 1 expect(body.scan('@context').count).to eq 1
expect(body.scan('orderedItems').count).to eq 1
expect(json['@context']).to_not be_nil expect(json['@context']).to_not be_nil
expect(json['type']).to eq 'OrderedCollection' expect(json['type']).to eq 'OrderedCollection'
expect(json['totalItems']).to eq 2 expect(json['totalItems']).to eq 2