diff --git a/app/helpers/context_helper.rb b/app/helpers/context_helper.rb index 03ca88670f..077c5272a5 100644 --- a/app/helpers/context_helper.rb +++ b/app/helpers/context_helper.rb @@ -34,6 +34,7 @@ module ContextHelper license: { 'schema' => 'http://schema.org#', 'license' => 'schema:license' }, suspended: { 'toot' => 'http://joinmastodon.org/ns#', 'suspended' => 'toot:suspended' }, attribution_domains: { 'toot' => 'http://joinmastodon.org/ns#', 'attributionDomains' => { '@id' => 'toot:attributionDomains', '@type' => '@id' } }, + misskey_license: { 'misskey' => 'https://misskey-hub.net/ns#', '_misskey_license' => 'misskey:_misskey_license' }, }.freeze def full_context diff --git a/app/lib/activitypub/case_transform.rb b/app/lib/activitypub/case_transform.rb index 5f2430600e..33e3ef6fac 100644 --- a/app/lib/activitypub/case_transform.rb +++ b/app/lib/activitypub/case_transform.rb @@ -4,6 +4,7 @@ module ActivityPub::CaseTransform class << self NO_CONVERT_VALUES = %w( _misskey_content + _misskey_license _misskey_quote ).freeze diff --git a/app/lib/activitypub/parser/custom_emoji_parser.rb b/app/lib/activitypub/parser/custom_emoji_parser.rb index 0c38f55168..fcd36b0395 100644 --- a/app/lib/activitypub/parser/custom_emoji_parser.rb +++ b/app/lib/activitypub/parser/custom_emoji_parser.rb @@ -34,6 +34,6 @@ class ActivityPub::Parser::CustomEmojiParser end def license - @json['license'] || @json['licence'] + @json.dig('_misskey_license', 'freeText') || @json['license'] || @json['licence'] end end diff --git a/app/presenters/activitypub/misskey_emoji_license_presenter.rb b/app/presenters/activitypub/misskey_emoji_license_presenter.rb new file mode 100644 index 0000000000..db8de36171 --- /dev/null +++ b/app/presenters/activitypub/misskey_emoji_license_presenter.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class ActivityPub::MisskeyEmojiLicensePresenter < ActiveModelSerializers::Model + attributes :free_text +end diff --git a/app/serializers/activitypub/emoji_serializer.rb b/app/serializers/activitypub/emoji_serializer.rb index 24c21c3ccf..443edd7e53 100644 --- a/app/serializers/activitypub/emoji_serializer.rb +++ b/app/serializers/activitypub/emoji_serializer.rb @@ -3,11 +3,12 @@ class ActivityPub::EmojiSerializer < ActivityPub::Serializer include RoutingHelper - context_extensions :emoji, :license, :keywords + context_extensions :emoji, :license, :keywords, :misskey_license attributes :id, :type, :name, :keywords, :is_sensitive, :updated - attribute :license, if: -> { object.license.present? } + attribute :license, if: :license? + has_one :misskey_license, key: :_misskey_license, if: :license?, serializer: ActivityPub::MisskeyEmojiLicenseSerializer has_one :icon, serializer: ActivityPub::ImageSerializer @@ -34,4 +35,12 @@ class ActivityPub::EmojiSerializer < ActivityPub::Serializer def name ":#{object.shortcode}:" end + + def misskey_license + ActivityPub::MisskeyEmojiLicensePresenter.new(free_text: object.license) + end + + def license? + object.license.present? + end end diff --git a/app/serializers/activitypub/misskey_emoji_license_serializer.rb b/app/serializers/activitypub/misskey_emoji_license_serializer.rb new file mode 100644 index 0000000000..fcaf37aff4 --- /dev/null +++ b/app/serializers/activitypub/misskey_emoji_license_serializer.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +class ActivityPub::MisskeyEmojiLicenseSerializer < ActivityPub::Serializer + attribute :free_text, key: :freeText +end diff --git a/spec/lib/activitypub/parser/custom_emoji_parser_spec.rb b/spec/lib/activitypub/parser/custom_emoji_parser_spec.rb new file mode 100644 index 0000000000..89421b6d6d --- /dev/null +++ b/spec/lib/activitypub/parser/custom_emoji_parser_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::Parser::CustomEmojiParser do + subject { described_class.new(json) } + + context 'with fedibird license' do + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: ['https://example.com/#foo'].join, + name: 'ohagi', + license: 'Ohagi is ohagi', + }.with_indifferent_access + end + + it 'load license' do + expect(subject.license).to eq 'Ohagi is ohagi' + end + end + + context 'with misskey license' do + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: ['https://example.com/#foo'].join, + name: 'ohagi', + _misskey_license: { + freeText: 'Ohagi is ohagi', + }, + }.with_indifferent_access + end + + it 'load license' do + expect(subject.license).to eq 'Ohagi is ohagi' + end + end + + context 'without license' do + let(:json) do + { + '@context': 'https://www.w3.org/ns/activitystreams', + id: ['https://example.com/#foo'].join, + name: 'ohagi', + }.with_indifferent_access + end + + it 'do not load license' do + expect(subject.license).to be_nil + end + end +end diff --git a/spec/serializers/activitypub/emoji_serializer_spec.rb b/spec/serializers/activitypub/emoji_serializer_spec.rb new file mode 100644 index 0000000000..4384ae4b13 --- /dev/null +++ b/spec/serializers/activitypub/emoji_serializer_spec.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe ActivityPub::EmojiSerializer do + describe '.serializer_for' do + subject { serialized_record_json(model, described_class, adapter: ActivityPub::Adapter) } + + let(:model) { Fabricate(:custom_emoji) } + + context 'without license' do + it 'does not have information' do + expect(subject).to_not include({ + '_misskey_license' => { 'freeText' => 'Ohagi' }, + }) + expect(subject).to_not include({ + 'license' => 'Ohagi', + }) + end + end + + context 'with license' do + let(:model) { Fabricate(:custom_emoji, license: 'Ohagi') } + + it 'has information' do + expect(subject).to include({ + 'license' => 'Ohagi', + '_misskey_license' => { 'freeText' => 'Ohagi' }, + }) + end + end + end +end