From 377952703cf70f14008cc7938479558d8cca9903 Mon Sep 17 00:00:00 2001 From: David Roetzel Date: Thu, 12 Mar 2026 16:46:36 +0100 Subject: [PATCH] Add serializers for `Accept`+`Reject` of feature requests (#38177) --- .../accept_feature_request_serializer.rb | 33 +++++++++++++++++++ .../reject_feature_request_serializer.rb | 29 ++++++++++++++++ .../accept_feature_request_serializer_spec.rb | 33 +++++++++++++++++++ .../reject_feature_request_serializer_spec.rb | 32 ++++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 app/serializers/activitypub/accept_feature_request_serializer.rb create mode 100644 app/serializers/activitypub/reject_feature_request_serializer.rb create mode 100644 spec/serializers/activitypub/accept_feature_request_serializer_spec.rb create mode 100644 spec/serializers/activitypub/reject_feature_request_serializer_spec.rb diff --git a/app/serializers/activitypub/accept_feature_request_serializer.rb b/app/serializers/activitypub/accept_feature_request_serializer.rb new file mode 100644 index 00000000000..99393dac912 --- /dev/null +++ b/app/serializers/activitypub/accept_feature_request_serializer.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +class ActivityPub::AcceptFeatureRequestSerializer < ActivityPub::Serializer + include RoutingHelper + + attributes :id, :type, :actor, :to, :result + + has_one :virtual_object, key: :object + + def id + [ActivityPub::TagManager.instance.uri_for(object.account), '#accepts/feature_requests/', object.id].join + end + + def type + 'Accept' + end + + def actor + ActivityPub::TagManager.instance.uri_for(object.account) + end + + def to + ActivityPub::TagManager.instance.uri_for(object.collection.account) + end + + def virtual_object + object.activity_uri + end + + def result + ap_account_feature_authorization_url(object.account_id, object) + end +end diff --git a/app/serializers/activitypub/reject_feature_request_serializer.rb b/app/serializers/activitypub/reject_feature_request_serializer.rb new file mode 100644 index 00000000000..4dbc2cdf11b --- /dev/null +++ b/app/serializers/activitypub/reject_feature_request_serializer.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +class ActivityPub::RejectFeatureRequestSerializer < ActivityPub::Serializer + include RoutingHelper + + attributes :id, :type, :actor, :to + + has_one :virtual_object, key: :object + + def id + [ActivityPub::TagManager.instance.uri_for(object.account), '#rejects/feature_requests/', object.id].join + end + + def type + 'Reject' + end + + def actor + ActivityPub::TagManager.instance.uri_for(object.account) + end + + def to + ActivityPub::TagManager.instance.uri_for(object.collection.account) + end + + def virtual_object + object.activity_uri + end +end diff --git a/spec/serializers/activitypub/accept_feature_request_serializer_spec.rb b/spec/serializers/activitypub/accept_feature_request_serializer_spec.rb new file mode 100644 index 00000000000..6fc277f2734 --- /dev/null +++ b/spec/serializers/activitypub/accept_feature_request_serializer_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::AcceptFeatureRequestSerializer do + include RoutingHelper + + subject { serialized_record_json(record, described_class, adapter: ActivityPub::Adapter) } + + describe 'serializing an object' do + let(:collection) { Fabricate(:remote_collection) } + let(:record) do + Fabricate(:collection_item, + collection:, + uri: 'https://example.com/featured_items/1', + activity_uri: 'https://example.com/feature_requests/1', + state: :accepted) + end + let(:tag_manager) { ActivityPub::TagManager.instance } + + it 'returns expected attributes' do + expect(subject) + .to include( + 'id' => match("#accepts/feature_requests/#{record.id}"), + 'type' => 'Accept', + 'actor' => tag_manager.uri_for(record.account), + 'to' => tag_manager.uri_for(collection.account), + 'object' => 'https://example.com/feature_requests/1', + 'result' => ap_account_feature_authorization_url(record.account_id, record) + ) + end + end +end diff --git a/spec/serializers/activitypub/reject_feature_request_serializer_spec.rb b/spec/serializers/activitypub/reject_feature_request_serializer_spec.rb new file mode 100644 index 00000000000..1e7aa0bcded --- /dev/null +++ b/spec/serializers/activitypub/reject_feature_request_serializer_spec.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::RejectFeatureRequestSerializer do + include RoutingHelper + + subject { serialized_record_json(record, described_class, adapter: ActivityPub::Adapter) } + + describe 'serializing an object' do + let(:collection) { Fabricate(:remote_collection) } + let(:record) do + Fabricate(:collection_item, + collection:, + uri: 'https://example.com/featured_items/1', + activity_uri: 'https://example.com/feature_requests/1', + state: :rejected) + end + let(:tag_manager) { ActivityPub::TagManager.instance } + + it 'returns expected attributes' do + expect(subject) + .to include( + 'id' => match("#rejects/feature_requests/#{record.id}"), + 'type' => 'Reject', + 'actor' => tag_manager.uri_for(record.account), + 'to' => tag_manager.uri_for(collection.account), + 'object' => 'https://example.com/feature_requests/1' + ) + end + end +end