Change featured tag updates to add/remove activity (#19409)

* Change featured tag updates to add/remove activity

* Fix to check for the existence of feature tag

* Rename service and worker

* Merge AddHashtagSerializer with AddSerializer

* Undo removal of sidekiq_options
This commit is contained in:
Takeshi Umeda 2022-10-23 01:30:55 +09:00 committed by GitHub
parent a041d3cb27
commit 64b46b9ae5
10 changed files with 117 additions and 15 deletions

View file

@ -13,14 +13,12 @@ class Api::V1::FeaturedTagsController < Api::BaseController
end
def create
@featured_tag = current_account.featured_tags.create!(featured_tag_params)
ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
render json: @featured_tag, serializer: REST::FeaturedTagSerializer
featured_tag = CreateFeaturedTagService.new.call(current_account, featured_tag_params[:name])
render json: featured_tag, serializer: REST::FeaturedTagSerializer
end
def destroy
@featured_tag.destroy!
ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
RemoveFeaturedTagWorker.perform_async(current_account.id, @featured_tag.id)
render_empty
end

View file

@ -10,10 +10,8 @@ class Settings::FeaturedTagsController < Settings::BaseController
end
def create
@featured_tag = current_account.featured_tags.new(featured_tag_params)
if @featured_tag.save
ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
if !featured_tag_exists?
CreateFeaturedTagService.new.call(current_account, featured_tag_params[:name])
redirect_to settings_featured_tags_path
else
set_featured_tags
@ -24,13 +22,16 @@ class Settings::FeaturedTagsController < Settings::BaseController
end
def destroy
@featured_tag.destroy!
ActivityPub::UpdateDistributionWorker.perform_in(3.minutes, current_account.id)
RemoveFeaturedTagWorker.perform_async(current_account.id, @featured_tag.id)
redirect_to settings_featured_tags_path
end
private
def featured_tag_exists?
current_account.featured_tags.by_name(featured_tag_params[:name]).exists?
end
def set_featured_tag
@featured_tag = current_account.featured_tags.find(params[:id])
end

View file

@ -30,6 +30,10 @@ class FeaturedTag < ApplicationRecord
LIMIT = 10
def sign?
true
end
def name
tag_id.present? ? tag.name : @name
end

View file

@ -1,10 +1,29 @@
# frozen_string_literal: true
class ActivityPub::AddSerializer < ActivityPub::Serializer
class UriSerializer < ActiveModel::Serializer
include RoutingHelper
def serializable_hash(*_args)
ActivityPub::TagManager.instance.uri_for(object)
end
end
def self.serializer_for(model, options)
case model.class.name
when 'Status'
UriSerializer
when 'FeaturedTag'
ActivityPub::HashtagSerializer
else
super
end
end
include RoutingHelper
attributes :type, :actor, :target
attribute :proper_object, key: :object
has_one :proper_object, key: :object
def type
'Add'
@ -15,7 +34,7 @@ class ActivityPub::AddSerializer < ActivityPub::Serializer
end
def proper_object
ActivityPub::TagManager.instance.uri_for(object)
object
end
def target

View file

@ -1,6 +1,8 @@
# frozen_string_literal: true
class ActivityPub::HashtagSerializer < ActivityPub::Serializer
context_extensions :hashtag
include RoutingHelper
attributes :type, :href, :name

View file

@ -1,10 +1,29 @@
# frozen_string_literal: true
class ActivityPub::RemoveSerializer < ActivityPub::Serializer
class UriSerializer < ActiveModel::Serializer
include RoutingHelper
def serializable_hash(*_args)
ActivityPub::TagManager.instance.uri_for(object)
end
end
def self.serializer_for(model, options)
case model.class.name
when 'Status'
UriSerializer
when 'FeaturedTag'
ActivityPub::HashtagSerializer
else
super
end
end
include RoutingHelper
attributes :type, :actor, :target
attribute :proper_object, key: :object
has_one :proper_object, key: :object
def type
'Remove'
@ -15,7 +34,7 @@ class ActivityPub::RemoveSerializer < ActivityPub::Serializer
end
def proper_object
ActivityPub::TagManager.instance.uri_for(object)
object
end
def target

View file

@ -0,0 +1,21 @@
# frozen_string_literal: true
class CreateFeaturedTagService < BaseService
include Payloadable
def call(account, name)
@account = account
FeaturedTag.create!(account: account, name: name).tap do |featured_tag|
ActivityPub::AccountRawDistributionWorker.perform_async(build_json(featured_tag), account.id) if @account.local?
end
rescue ActiveRecord::RecordNotUnique
FeaturedTag.by_name(name).find_by!(account: account)
end
private
def build_json(featured_tag)
Oj.dump(serialize_payload(featured_tag, ActivityPub::AddSerializer, signer: @account))
end
end

View file

@ -0,0 +1,18 @@
# frozen_string_literal: true
class RemoveFeaturedTagService < BaseService
include Payloadable
def call(account, featured_tag)
@account = account
featured_tag.destroy!
ActivityPub::AccountRawDistributionWorker.perform_async(build_json(featured_tag), account.id) if @account.local?
end
private
def build_json(featured_tag)
Oj.dump(serialize_payload(featured_tag, ActivityPub::RemoveSerializer, signer: @account))
end
end

View file

@ -0,0 +1,9 @@
# frozen_string_literal: true
class ActivityPub::AccountRawDistributionWorker < ActivityPub::RawDistributionWorker
protected
def inboxes
@inboxes ||= AccountReachFinder.new(@account).inboxes
end
end

View file

@ -0,0 +1,11 @@
# frozen_string_literal: true
class RemoveFeaturedTagWorker
include Sidekiq::Worker
def perform(account_id, featured_tag_id)
RemoveFeaturedTagService.new.call(Account.find(account_id), FeaturedTag.find(featured_tag_id))
rescue ActiveRecord::RecordNotFound
true
end
end