nas/lib/mastodon/cli/feeds.rb
KMY 06123147d5 Fix: アンテナに登録された投稿がアンテナ削除時Redisから削除されない問題 (#417)
* Fix: アンテナに登録された投稿がRedisから削除されない問題

* Fix test

* Tootctlに変更

* 処理を共通化
2024-01-04 15:32:58 +09:00

82 lines
2.3 KiB
Ruby

# frozen_string_literal: true
require_relative 'base'
module Mastodon::CLI
class Feeds < Base
include Redisable
option :all, type: :boolean, default: false
option :concurrency, type: :numeric, default: 5, aliases: [:c]
option :verbose, type: :boolean, aliases: [:v]
option :dry_run, type: :boolean, default: false
desc 'build [USERNAME]', 'Build home and list feeds for one or all users'
long_desc <<-LONG_DESC
Build home and list feeds that are stored in Redis from the database.
With the --all option, all active users will be processed.
Otherwise, a single user specified by USERNAME.
LONG_DESC
def build(username = nil)
if options[:all] || username.nil?
processed, = parallelize_with_progress(active_user_accounts) do |account|
PrecomputeFeedService.new.call(account) unless dry_run?
end
say("Regenerated feeds for #{processed} accounts #{dry_run_mode_suffix}", :green, true)
elsif username.present?
account = Account.find_local(username)
if account.nil?
say('No such account', :red)
exit(1)
end
PrecomputeFeedService.new.call(account) unless dry_run?
say("OK #{dry_run_mode_suffix}", :green, true)
else
say('No account(s) given', :red)
exit(1)
end
end
desc 'clear', 'Remove all home and list feeds from Redis'
def clear
keys = redis.keys('feed:*')
redis.del(keys)
say('OK', :green)
end
desc 'remove_legacy', 'Remove old list and antenna feeds from Redis'
def remove_legacy
current_id = 1
List.reorder(:id).select(:id).find_in_batches do |lists|
current_id = remove_legacy_feeds(:list, lists, current_id)
end
current_id = 1
Antenna.reorder(:id).select(:id).find_in_batches do |antennas|
current_id = remove_legacy_feeds(:antenna, antennas, current_id)
end
say('OK', :green)
end
private
def active_user_accounts
Account.joins(:user).merge(User.active)
end
def remove_legacy_feeds(type, items, current_id)
exist_ids = items.pluck(:id)
last_id = exist_ids.max
ids = Range.new(current_id, last_id).to_a - exist_ids
FeedManager.instance.clean_feeds!(type, ids)
last_id + 1
end
end
end