mirror of
https://github.com/mastodon/mastodon.git
synced 2024-08-20 21:08:15 -07:00
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:
parent
73a48318a1
commit
74ead7d106
10 changed files with 117 additions and 15 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -30,6 +30,10 @@ class FeaturedTag < ApplicationRecord
|
|||
|
||||
LIMIT = 10
|
||||
|
||||
def sign?
|
||||
true
|
||||
end
|
||||
|
||||
def name
|
||||
tag_id.present? ? tag.name : @name
|
||||
end
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::HashtagSerializer < ActivityPub::Serializer
|
||||
context_extensions :hashtag
|
||||
|
||||
include RoutingHelper
|
||||
|
||||
attributes :type, :href, :name
|
||||
|
|
|
@ -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
|
||||
|
|
21
app/services/create_featured_tag_service.rb
Normal file
21
app/services/create_featured_tag_service.rb
Normal 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
|
18
app/services/remove_featured_tag_service.rb
Normal file
18
app/services/remove_featured_tag_service.rb
Normal 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
|
|
@ -0,0 +1,9 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ActivityPub::AccountRawDistributionWorker < ActivityPub::RawDistributionWorker
|
||||
protected
|
||||
|
||||
def inboxes
|
||||
@inboxes ||= AccountReachFinder.new(@account).inboxes
|
||||
end
|
||||
end
|
11
app/workers/remove_featured_tag_worker.rb
Normal file
11
app/workers/remove_featured_tag_worker.rb
Normal 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
|
Loading…
Reference in a new issue