Merge branch 'main' into glitch-soc/merge-upstream

Conflicts:
- `app/controllers/home_controller.rb`:
  Upstream made it so `/web` is available to non-logged-in users
  and `/` redirects to `/web` instead of `/about`.
  Kept our version since glitch-soc's WebUI doesn't have what's
  needed yet and I think /about is still a much better landing
  page anyway.
- `app/models/form/admin_settings.rb`:
  Upstream added new settings, and glitch-soc had an extra setting.
  Not really a conflict.
  Added upstream's new settings.
- `app/serializers/initial_state_serializer.rb`:
  Upstream added a new `server` initial state object.
  Not really a conflict.
  Merged upstream's changes.
- `app/views/admin/settings/edit.html.haml`:
  Upstream added new settings.
  Not really a conflict.
  Merged upstream's changes.
- `app/workers/scheduler/feed_cleanup_scheduler.rb`:
  Upstream refactored that part and removed the file.
  Ported our relevant changes into `app/lib/vacuum/feeds_vacuum.rb`
- `config/settings.yml`:
  Upstream added new settings.
  Not a real conflict.
  Added upstream's new settings.
This commit is contained in:
Claire
2022-10-02 17:33:37 +02:00
390 changed files with 6881 additions and 4298 deletions

View File

@@ -0,0 +1,18 @@
# frozen_string_literal: true
class Vacuum::AccessTokensVacuum
def perform
vacuum_revoked_access_tokens!
vacuum_revoked_access_grants!
end
private
def vacuum_revoked_access_tokens!
Doorkeeper::AccessToken.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
end
def vacuum_revoked_access_grants!
Doorkeeper::AccessGrant.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
end
end

View File

@@ -0,0 +1,25 @@
# frozen_string_literal: true
class Vacuum::BackupsVacuum
def initialize(retention_period)
@retention_period = retention_period
end
def perform
vacuum_expired_backups! if retention_period?
end
private
def vacuum_expired_backups!
backups_past_retention_period.in_batches.destroy_all
end
def backups_past_retention_period
Backup.unscoped.where(Backup.arel_table[:created_at].lt(@retention_period.ago))
end
def retention_period?
@retention_period.present?
end
end

View File

@@ -0,0 +1,41 @@
# frozen_string_literal: true
class Vacuum::FeedsVacuum
def perform
vacuum_inactive_home_feeds!
vacuum_inactive_list_feeds!
vacuum_inactive_direct_feeds!
end
private
def vacuum_inactive_home_feeds!
inactive_users.select(:id, :account_id).find_in_batches do |users|
feed_manager.clean_feeds!(:home, users.map(&:account_id))
end
end
def vacuum_inactive_list_feeds!
inactive_users_lists.select(:id).find_in_batches do |lists|
feed_manager.clean_feeds!(:list, lists.map(&:id))
end
end
def vacuum_inactive_direct_feeds!
inactive_users_lists.select(:id).find_in_batches do |lists|
feed_manager.clean_feeds!(:direct, lists.map(&:id))
end
end
def inactive_users
User.confirmed.inactive
end
def inactive_users_lists
List.where(account_id: inactive_users.select(:account_id))
end
def feed_manager
FeedManager.instance
end
end

View File

@@ -0,0 +1,40 @@
# frozen_string_literal: true
class Vacuum::MediaAttachmentsVacuum
TTL = 1.day.freeze
def initialize(retention_period)
@retention_period = retention_period
end
def perform
vacuum_cached_files! if retention_period?
vacuum_orphaned_records!
end
private
def vacuum_cached_files!
media_attachments_past_retention_period.find_each do |media_attachment|
media_attachment.file.destroy
media_attachment.thumbnail.destroy
media_attachment.save
end
end
def vacuum_orphaned_records!
orphaned_media_attachments.in_batches.destroy_all
end
def media_attachments_past_retention_period
MediaAttachment.unscoped.remote.cached.where(MediaAttachment.arel_table[:created_at].lt(@retention_period.ago)).where(MediaAttachment.arel_table[:updated_at].lt(@retention_period.ago))
end
def orphaned_media_attachments
MediaAttachment.unscoped.unattached.where(MediaAttachment.arel_table[:created_at].lt(TTL.ago))
end
def retention_period?
@retention_period.present?
end
end

View File

@@ -0,0 +1,39 @@
# frozen_string_literal: true
class Vacuum::PreviewCardsVacuum
TTL = 1.day.freeze
def initialize(retention_period)
@retention_period = retention_period
end
def perform
vacuum_cached_images! if retention_period?
vacuum_orphaned_records!
end
private
def vacuum_cached_images!
preview_cards_past_retention_period.find_each do |preview_card|
preview_card.image.destroy
preview_card.save
end
end
def vacuum_orphaned_records!
orphaned_preview_cards.in_batches.destroy_all
end
def preview_cards_past_retention_period
PreviewCard.cached.where(PreviewCard.arel_table[:updated_at].lt(@retention_period.ago))
end
def orphaned_preview_cards
PreviewCard.where('NOT EXISTS (SELECT 1 FROM preview_cards_statuses WHERE preview_cards_statuses.preview_card_id = preview_cards.id)').where(PreviewCard.arel_table[:created_at].lt(TTL.ago))
end
def retention_period?
@retention_period.present?
end
end

View File

@@ -0,0 +1,54 @@
# 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?
end
private
def vacuum_statuses!
statuses_scope.find_in_batches do |statuses|
# Side-effects not covered by foreign keys, such
# as the search index, must be handled first.
remove_from_account_conversations(statuses)
remove_from_search_index(statuses)
# Foreign keys take care of most associated records
# for us. Media attachments will be orphaned.
Status.where(id: statuses.map(&:id)).delete_all
end
end
def statuses_scope
Status.unscoped.kept.where(account: Account.remote).where(Status.arel_table[:id].lt(retention_period_as_id)).select(:id, :visibility)
end
def retention_period_as_id
Mastodon::Snowflake.id_at(@retention_period.ago, with_random: false)
end
def analyze_statuses!
ActiveRecord::Base.connection.execute('ANALYZE statuses')
end
def remove_from_account_conversations(statuses)
Status.where(id: statuses.select(&:direct_visibility?).map(&:id)).includes(:account, mentions: :account).each(&:unlink_from_conversations)
end
def remove_from_search_index(statuses)
with_redis { |redis| redis.sadd('chewy:queue:StatusesIndex', statuses.map(&:id)) } if Chewy.enabled?
end
def retention_period?
@retention_period.present?
end
end

View File

@@ -0,0 +1,13 @@
# frozen_string_literal: true
class Vacuum::SystemKeysVacuum
def perform
vacuum_expired_system_keys!
end
private
def vacuum_expired_system_keys!
SystemKey.expired.delete_all
end
end