1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- # frozen_string_literal: true
- class Vacuum::StatusesVacuum
- include Redisable
- def initialize(retention_period)
- @retention_period = retention_period
- end
- def perform
- vacuum_statuses! if @retention_period.present?
- end
- private
- def vacuum_statuses!
- statuses_scope.in_batches do |statuses|
- # Side-effects not covered by foreign keys, such
- # as the search index, must be handled first.
- statuses.direct_visibility
- .includes(mentions: :account)
- .find_each(&:unlink_from_conversations!)
- if Chewy.enabled?
- remove_from_index(statuses.ids, 'chewy:queue:StatusesIndex')
- remove_from_index(statuses.ids, 'chewy:queue:PublicStatusesIndex')
- end
- # Foreign keys take care of most associated records for us.
- # Media attachments will be orphaned.
- statuses.delete_all
- end
- end
- def statuses_scope
- Status.unscoped.kept
- .joins(:account).merge(Account.remote)
- .where(statuses: { id: ...retention_period_as_id })
- end
- def retention_period_as_id
- Mastodon::Snowflake.id_at(@retention_period.ago, with_random: false)
- end
- def remove_from_index(status_ids, index)
- with_redis { |redis| redis.sadd(index, status_ids) }
- end
- end
|