Skip to content

Commit

Permalink
Fix: 他のサーバーの同じ絵文字を複数つけられる問題 (#141)
Browse files Browse the repository at this point in the history
* スタンプ機能のリファクタリング、投稿の反応者へも配送

* Fix: 他のサーバーの絵文字を複数つけられる問題
  • Loading branch information
kmycode authored Oct 18, 2023
1 parent b73eb1b commit 1d9c770
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 12 deletions.
6 changes: 3 additions & 3 deletions app/services/emoji_react_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ def call(account, status, name)
@status = status

with_redis_lock("emoji_reaction:#{status.id}") do
@emoji_reaction = EmojiReaction.find_by(account: account, status: status, name: name)
raise Mastodon::ValidationError, I18n.t('reactions.errors.duplication') unless @emoji_reaction.nil?

shortcode, domain = name.split('@')
domain = nil if TagManager.instance.local_domain?(domain)
custom_emoji = CustomEmoji.find_by(shortcode: shortcode, domain: domain)
return if domain.present? && !EmojiReaction.exists?(status: status, custom_emoji: custom_emoji)

@emoji_reaction = EmojiReaction.find_by(account: account, status: status, name: shortcode, custom_emoji: custom_emoji)
raise Mastodon::ValidationError, I18n.t('reactions.errors.duplication') unless @emoji_reaction.nil?

@emoji_reaction = EmojiReaction.create!(account: account, status: status, name: shortcode, custom_emoji: custom_emoji)

status.touch # rubocop:disable Rails/SkipsModelValidations
Expand Down
40 changes: 31 additions & 9 deletions spec/services/emoji_react_service_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,6 @@
expect(subject.first.custom_emoji_id).to be_nil
end

context 'with name duplication on same account' do
before { Fabricate(:emoji_reaction, status: status, name: '😀') }

it 'react with emoji' do
expect(subject.count).to eq 1
expect(subject.first.name).to eq '😀'
end
end

context 'when multiple reactions by same account' do
let(:name) { '😂' }

Expand Down Expand Up @@ -139,6 +130,37 @@
end
end

context 'with name duplication of unicode emoji on same account' do
before { Fabricate(:emoji_reaction, status: status, name: '😀') }

it 'react with emoji' do
expect(subject.count).to eq 1
expect(subject.first.name).to eq '😀'
end
end

context 'with name duplication of local cuetom emoji on same account' do
let(:name) { 'ohagi' }
let!(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'ohagi') }

before { Fabricate(:emoji_reaction, account: sender, status: status, name: 'ohagi', custom_emoji: custom_emoji) }

it 'react with emoji' do
expect { subject.count }.to raise_error Mastodon::ValidationError
end
end

context 'with name duplication of remote cuetom emoji on same account' do
let(:name) { '[email protected]' }
let!(:custom_emoji) { Fabricate(:custom_emoji, shortcode: 'ohagi', domain: 'foo.bar', uri: 'https://foo.bar/emoji/ohagi') }

before { Fabricate(:emoji_reaction, account: sender, status: status, name: 'ohagi', custom_emoji: custom_emoji) }

it 'react with emoji' do
expect { subject.count }.to raise_error Mastodon::ValidationError
end
end

context 'when has remote followers' do
let!(:bob) { Fabricate(:account, domain: 'foo.bar', uri: 'https://foo.bar/actor', inbox_url: 'https://foo.bar/inbox', protocol: 'activitypub') }

Expand Down

0 comments on commit 1d9c770

Please sign in to comment.