diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index 67484fc6393..34d52a7d226 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -89,6 +89,7 @@ const keyMap = {
goToProfile: 'g u',
goToBlocked: 'g b',
goToMuted: 'g m',
+ goToRequests: 'g r',
toggleHidden: 'x',
};
@@ -427,6 +428,10 @@ export default class UI extends React.PureComponent {
this.context.router.history.push('/mutes');
}
+ handleHotkeyGoToRequests = () => {
+ this.context.router.history.push('/follow_requests');
+ }
+
render () {
const { draggingOver } = this.state;
const { children, isComposing, location, dropdownMenuIsOpen } = this.props;
@@ -449,6 +454,7 @@ export default class UI extends React.PureComponent {
goToProfile: this.handleHotkeyGoToProfile,
goToBlocked: this.handleHotkeyGoToBlocked,
goToMuted: this.handleHotkeyGoToMuted,
+ goToRequests: this.handleHotkeyGoToRequests,
};
return (
diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js
index 106198f7449..70f08a8eb5e 100644
--- a/app/javascript/mastodon/selectors/index.js
+++ b/app/javascript/mastodon/selectors/index.js
@@ -1,5 +1,6 @@
import { createSelector } from 'reselect';
import { List as ImmutableList } from 'immutable';
+import { me } from '../initial_state';
const getAccountBase = (state, id) => state.getIn(['accounts', id], null);
const getAccountCounters = (state, id) => state.getIn(['accounts_counters', id], null);
@@ -83,7 +84,7 @@ export const makeGetStatus = () => {
statusReblog = null;
}
- const regex = regexFromFilters(filters);
+ const regex = (accountReblog || accountBase).get('id') !== me && regexFromFilters(filters);
const filtered = regex && regex.test(statusBase.get('reblog') ? statusReblog.get('search_index') : statusBase.get('search_index'));
return statusBase.withMutations(map => {
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 64a00c2c392..6073f9c0e5b 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -230,7 +230,6 @@
.dropdown-menu {
position: absolute;
- transform-origin: 50% 0;
}
.invisible {
@@ -1634,6 +1633,22 @@ a.account__display-name {
ul {
list-style: none;
}
+
+ &.left {
+ transform-origin: 100% 50%;
+ }
+
+ &.top {
+ transform-origin: 50% 100%;
+ }
+
+ &.bottom {
+ transform-origin: 50% 0;
+ }
+
+ &.right {
+ transform-origin: 0 50%;
+ }
}
.dropdown-menu__arrow {
@@ -3300,7 +3315,14 @@ a.status-card {
border-radius: 4px;
margin-left: 40px;
overflow: hidden;
- transform-origin: 50% 0;
+
+ &.top {
+ transform-origin: 50% 100%;
+ }
+
+ &.bottom {
+ transform-origin: 50% 0;
+ }
}
.privacy-dropdown__option {
@@ -3372,6 +3394,10 @@ a.status-card {
}
}
+ &.top .privacy-dropdown__value {
+ border-radius: 0 0 4px 4px;
+ }
+
.privacy-dropdown__dropdown {
display: block;
box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);
@@ -4176,6 +4202,10 @@ a.status-card {
color: $highlight-text-color;
}
+ .status__content p {
+ color: $inverted-text-color;
+ }
+
@media screen and (max-width: 480px) {
max-height: 10vh;
}
diff --git a/app/javascript/styles/mastodon/forms.scss b/app/javascript/styles/mastodon/forms.scss
index 375c7b64bb4..22dbfa8cf9d 100644
--- a/app/javascript/styles/mastodon/forms.scss
+++ b/app/javascript/styles/mastodon/forms.scss
@@ -154,9 +154,8 @@ code {
margin-bottom: 15px;
}
- li {
- float: left;
- width: 50%;
+ ul {
+ columns: 2;
}
}
diff --git a/app/models/account_pin.rb b/app/models/account_pin.rb
index 9a21c340544..b51d3d4cd4e 100644
--- a/app/models/account_pin.rb
+++ b/app/models/account_pin.rb
@@ -11,6 +11,7 @@
#
class AccountPin < ApplicationRecord
+ include Paginable
include RelationshipCacheable
belongs_to :account
diff --git a/app/models/form/status_batch.rb b/app/models/form/status_batch.rb
index 4f08a304973..8f5fd1fa2fd 100644
--- a/app/models/form/status_batch.rb
+++ b/app/models/form/status_batch.rb
@@ -23,7 +23,7 @@ class Form::StatusBatch
media_attached_status_ids = MediaAttachment.where(status_id: status_ids).pluck(:status_id)
ApplicationRecord.transaction do
- Status.where(id: media_attached_status_ids).find_each do |status|
+ Status.where(id: media_attached_status_ids).reorder(nil).find_each do |status|
status.update!(sensitive: sensitive)
log_action :update, status
end
@@ -35,7 +35,7 @@ class Form::StatusBatch
end
def delete_statuses
- Status.where(id: status_ids).find_each do |status|
+ Status.where(id: status_ids).reorder(nil).find_each do |status|
RemovalWorker.perform_async(status.id)
log_action :destroy, status
end
diff --git a/app/models/notification.rb b/app/models/notification.rb
index 4f6ec8e8ea5..b9bec08086c 100644
--- a/app/models/notification.rb
+++ b/app/models/notification.rb
@@ -39,8 +39,6 @@ class Notification < ApplicationRecord
validates :account_id, uniqueness: { scope: [:activity_type, :activity_id] }
validates :activity_type, inclusion: { in: TYPE_CLASS_MAP.values }
- scope :cache_ids, -> { select(:id, :updated_at, :activity_type, :activity_id) }
-
scope :browserable, ->(exclude_types = []) {
types = TYPE_CLASS_MAP.values - activity_types_from_types(exclude_types + [:follow_request])
where(activity_type: types)
@@ -68,6 +66,10 @@ class Notification < ApplicationRecord
end
class << self
+ def cache_ids
+ select(:id, :updated_at, :activity_type, :activity_id)
+ end
+
def reload_stale_associations!(cached_items)
account_ids = (cached_items.map(&:from_account_id) + cached_items.map { |item| item.target_status&.account_id }.compact).uniq
diff --git a/app/models/status.rb b/app/models/status.rb
index 8cd6d3862ca..f38227b85be 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -26,8 +26,6 @@
#
class Status < ApplicationRecord
- self.cache_versioning = false
-
include Paginable
include Streamable
include Cacheable
diff --git a/app/services/after_block_domain_from_account_service.rb b/app/services/after_block_domain_from_account_service.rb
index 0f1a8505d31..56cc819fb7a 100644
--- a/app/services/after_block_domain_from_account_service.rb
+++ b/app/services/after_block_domain_from_account_service.rb
@@ -15,13 +15,13 @@ class AfterBlockDomainFromAccountService < BaseService
private
def reject_existing_followers!
- @account.passive_relationships.where(account: Account.where(domain: @domain)).includes(:account).find_each do |follow|
+ @account.passive_relationships.where(account: Account.where(domain: @domain)).includes(:account).reorder(nil).find_each do |follow|
reject_follow!(follow)
end
end
def reject_pending_follow_requests!
- FollowRequest.where(target_account: @account).where(account: Account.where(domain: @domain)).includes(:account).find_each do |follow_request|
+ FollowRequest.where(target_account: @account).where(account: Account.where(domain: @domain)).includes(:account).reorder(nil).find_each do |follow_request|
reject_follow!(follow_request)
end
end
diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb
index 8492c111763..da7db646259 100644
--- a/app/services/backup_service.rb
+++ b/app/services/backup_service.rb
@@ -18,7 +18,7 @@ class BackupService < BaseService
def build_json!
@collection = serialize(collection_presenter, ActivityPub::CollectionSerializer)
- account.statuses.with_includes.find_in_batches do |statuses|
+ account.statuses.with_includes.reorder(nil).find_in_batches do |statuses|
statuses.each do |status|
item = serialize(status, ActivityPub::ActivitySerializer)
item.delete(:'@context')
@@ -60,7 +60,7 @@ class BackupService < BaseService
end
def dump_media_attachments!(tar)
- MediaAttachment.attached.where(account: account).find_in_batches do |media_attachments|
+ MediaAttachment.attached.where(account: account).reorder(nil).find_in_batches do |media_attachments|
media_attachments.each do |m|
download_to_tar(tar, m.file, m.file.path)
end
diff --git a/app/services/block_domain_service.rb b/app/services/block_domain_service.rb
index d082de40b9b..a1fe93665b1 100644
--- a/app/services/block_domain_service.rb
+++ b/app/services/block_domain_service.rb
@@ -43,14 +43,14 @@ class BlockDomainService < BaseService
end
def suspend_accounts!
- blocked_domain_accounts.where(suspended: false).find_each do |account|
+ blocked_domain_accounts.where(suspended: false).reorder(nil).find_each do |account|
UnsubscribeService.new.call(account) if account.subscribed?
SuspendAccountService.new.call(account)
end
end
def clear_account_images!
- blocked_domain_accounts.find_each do |account|
+ blocked_domain_accounts.reorder(nil).find_each do |account|
account.avatar.destroy if account.avatar.exists?
account.header.destroy if account.header.exists?
account.save
@@ -58,7 +58,7 @@ class BlockDomainService < BaseService
end
def clear_account_attachments!
- media_from_blocked_domain.find_each do |attachment|
+ media_from_blocked_domain.reorder(nil).find_each do |attachment|
@affected_status_ids << attachment.status_id if attachment.status_id.present?
attachment.file.destroy if attachment.file.exists?
diff --git a/app/services/remove_status_service.rb b/app/services/remove_status_service.rb
index fb889140b24..1a53093b894 100644
--- a/app/services/remove_status_service.rb
+++ b/app/services/remove_status_service.rb
@@ -43,13 +43,13 @@ class RemoveStatusService < BaseService
end
def remove_from_followers
- @account.followers_for_local_distribution.find_each do |follower|
+ @account.followers_for_local_distribution.reorder(nil).find_each do |follower|
FeedManager.instance.unpush_from_home(follower, @status)
end
end
def remove_from_lists
- @account.lists_for_local_distribution.select(:id, :account_id).find_each do |list|
+ @account.lists_for_local_distribution.select(:id, :account_id).reorder(nil).find_each do |list|
FeedManager.instance.unpush_from_list(list, @status)
end
end
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index 0a98f5fb9d1..8fc79b8ad66 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -23,9 +23,7 @@ class SuspendAccountService < BaseService
def purge_content!
if @account.local?
- ActivityPub::RawDistributionWorker.perform_async(delete_actor_json, @account.id)
-
- ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url|
+ ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url|
[delete_actor_json, @account.id, inbox_url]
end
end
@@ -75,4 +73,8 @@ class SuspendAccountService < BaseService
@delete_actor_json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(@account))
end
+
+ def delivery_inboxes
+ Account.inboxes + Relay.enabled.pluck(:inbox_url)
+ end
end
diff --git a/app/workers/maintenance/uncache_media_worker.rb b/app/workers/maintenance/uncache_media_worker.rb
index f6a51a1b8b2..2d1a670a76c 100644
--- a/app/workers/maintenance/uncache_media_worker.rb
+++ b/app/workers/maintenance/uncache_media_worker.rb
@@ -8,7 +8,7 @@ class Maintenance::UncacheMediaWorker
def perform(media_attachment_id)
media = MediaAttachment.find(media_attachment_id)
- return unless media.file.exists?
+ return if media.file.blank?
media.file.destroy
media.save
diff --git a/app/workers/refollow_worker.rb b/app/workers/refollow_worker.rb
index 66bcd27c3e4..12f2bf671b8 100644
--- a/app/workers/refollow_worker.rb
+++ b/app/workers/refollow_worker.rb
@@ -9,7 +9,7 @@ class RefollowWorker
target_account = Account.find(target_account_id)
return unless target_account.protocol == :activitypub
- target_account.followers.where(domain: nil).find_each do |follower|
+ target_account.followers.where(domain: nil).reorder(nil).find_each do |follower|
# Locally unfollow remote account
follower.unfollow!(target_account)
diff --git a/app/workers/scheduler/backup_cleanup_scheduler.rb b/app/workers/scheduler/backup_cleanup_scheduler.rb
index 5ab16c057da..023a773077c 100644
--- a/app/workers/scheduler/backup_cleanup_scheduler.rb
+++ b/app/workers/scheduler/backup_cleanup_scheduler.rb
@@ -3,8 +3,10 @@
class Scheduler::BackupCleanupScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
- old_backups.find_each(&:destroy!)
+ old_backups.reorder(nil).find_each(&:destroy!)
end
private
diff --git a/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb b/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
index bab4ae8869b..fec08c6bc38 100644
--- a/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
+++ b/app/workers/scheduler/doorkeeper_cleanup_scheduler.rb
@@ -3,6 +3,8 @@
class Scheduler::DoorkeeperCleanupScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
Doorkeeper::AccessToken.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
Doorkeeper::AccessGrant.where('revoked_at IS NOT NULL').where('revoked_at < NOW()').delete_all
diff --git a/app/workers/scheduler/email_scheduler.rb b/app/workers/scheduler/email_scheduler.rb
index 36866061b23..24117e42418 100644
--- a/app/workers/scheduler/email_scheduler.rb
+++ b/app/workers/scheduler/email_scheduler.rb
@@ -3,8 +3,10 @@
class Scheduler::EmailScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
- eligible_users.find_each do |user|
+ eligible_users.reorder(nil).find_each do |user|
next unless user.allows_digest_emails?
DigestMailerWorker.perform_async(user.id)
end
diff --git a/app/workers/scheduler/feed_cleanup_scheduler.rb b/app/workers/scheduler/feed_cleanup_scheduler.rb
index 42cf14128f2..b02bac88375 100644
--- a/app/workers/scheduler/feed_cleanup_scheduler.rb
+++ b/app/workers/scheduler/feed_cleanup_scheduler.rb
@@ -3,6 +3,8 @@
class Scheduler::FeedCleanupScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
clean_home_feeds!
clean_list_feeds!
diff --git a/app/workers/scheduler/ip_cleanup_scheduler.rb b/app/workers/scheduler/ip_cleanup_scheduler.rb
index 613a5e336d5..6bb93df7d14 100644
--- a/app/workers/scheduler/ip_cleanup_scheduler.rb
+++ b/app/workers/scheduler/ip_cleanup_scheduler.rb
@@ -5,6 +5,8 @@ class Scheduler::IpCleanupScheduler
RETENTION_PERIOD = 1.year
+ sidekiq_options unique: :until_executed
+
def perform
time_ago = RETENTION_PERIOD.ago
SessionActivation.where('updated_at < ?', time_ago).destroy_all
diff --git a/app/workers/scheduler/media_cleanup_scheduler.rb b/app/workers/scheduler/media_cleanup_scheduler.rb
index c35686fcb90..a27e02953bb 100644
--- a/app/workers/scheduler/media_cleanup_scheduler.rb
+++ b/app/workers/scheduler/media_cleanup_scheduler.rb
@@ -3,6 +3,8 @@
class Scheduler::MediaCleanupScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
unattached_media.find_each(&:destroy)
end
diff --git a/app/workers/scheduler/subscriptions_cleanup_scheduler.rb b/app/workers/scheduler/subscriptions_cleanup_scheduler.rb
index af2ae312014..06ba662051c 100644
--- a/app/workers/scheduler/subscriptions_cleanup_scheduler.rb
+++ b/app/workers/scheduler/subscriptions_cleanup_scheduler.rb
@@ -3,6 +3,8 @@
class Scheduler::SubscriptionsCleanupScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
Subscription.expired.in_batches.delete_all
end
diff --git a/app/workers/scheduler/subscriptions_scheduler.rb b/app/workers/scheduler/subscriptions_scheduler.rb
index dc16e85c228..4b0959af20b 100644
--- a/app/workers/scheduler/subscriptions_scheduler.rb
+++ b/app/workers/scheduler/subscriptions_scheduler.rb
@@ -3,6 +3,8 @@
class Scheduler::SubscriptionsScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
Pubsubhubbub::SubscribeWorker.push_bulk(expiring_accounts.pluck(:id))
end
diff --git a/app/workers/scheduler/user_cleanup_scheduler.rb b/app/workers/scheduler/user_cleanup_scheduler.rb
index 245536ceac9..626fb1652ce 100644
--- a/app/workers/scheduler/user_cleanup_scheduler.rb
+++ b/app/workers/scheduler/user_cleanup_scheduler.rb
@@ -3,8 +3,10 @@
class Scheduler::UserCleanupScheduler
include Sidekiq::Worker
+ sidekiq_options unique: :until_executed
+
def perform
- User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).find_in_batches do |batch|
+ User.where('confirmed_at is NULL AND confirmation_sent_at <= ?', 2.days.ago).reorder(nil).find_in_batches do |batch|
Account.where(id: batch.map(&:account_id)).delete_all
User.where(id: batch.map(&:id)).delete_all
end
diff --git a/config/initializers/paperclip.rb b/config/initializers/paperclip.rb
index c134bc5b8fe..59ab9b9a127 100644
--- a/config/initializers/paperclip.rb
+++ b/config/initializers/paperclip.rb
@@ -74,14 +74,10 @@ elsif ENV['SWIFT_ENABLED'] == 'true'
fog_public: true
)
else
- require 'fog/local'
-
Paperclip::Attachment.default_options.merge!(
- fog_credentials: {
- provider: 'Local',
- local_root: ENV.fetch('PAPERCLIP_ROOT_PATH') { Rails.root.join('public', 'system') },
- },
- fog_directory: '',
- fog_host: ENV.fetch('PAPERCLIP_ROOT_URL') { '/system' }
+ storage: :filesystem,
+ use_timestamp: true,
+ path: (ENV['PAPERCLIP_ROOT_PATH'] || ':rails_root/public/system') + '/:class/:attachment/:id_partition/:style/:filename',
+ url: (ENV['PAPERCLIP_ROOT_URL'] || '/system') + '/:class/:attachment/:id_partition/:style/:filename',
)
end
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 7fa2bc8de17..96339e35ecf 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -725,7 +725,7 @@ fi:
tip_local_timeline: Paikallinen aikajana näyttää instanssin %{instance} käyttäjien julkaisut. He ovat naapureitasi!
tip_mobile_webapp: Jos voit lisätä Mastodonin mobiiliselaimen kautta aloitusnäytöllesi, voit vastaanottaa push-ilmoituksia. Toiminta vastaa monin tavoin tavanomaista sovellusta!
tips: Vinkkejä
- title: Tervetuloa mukaan, %name}!
+ title: Tervetuloa mukaan, %{name}!
users:
invalid_email: Virheellinen sähköpostiosoite
invalid_otp_token: Virheellinen kaksivaiheisen todentamisen koodi
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 5d65e1ffbb7..924173140ea 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -6,6 +6,7 @@ pl:
about_this: O tej instancji
administered_by: 'Administrowana przez:'
api: API
+ apps: Aplikacje
closed_registrations: Rejestracja na tej instancji jest obecnie zamknięta. Możesz jednak zarejestrować się na innej instancji, uzyskując dostęp do tej samej sieci.
contact: Kontakt
contact_missing: Nie ustawiono
@@ -281,6 +282,7 @@ pl:
search: Szukaj
title: Znane instancje
invites:
+ deactivate_all: Unieważnij wszystkie
filter:
all: Wszystkie
available: Dostępne
@@ -663,11 +665,14 @@ pl:
publishing: Publikowanie
web: Sieć
remote_follow:
- acct: Podaj swój adres (nazwa@domena), z którego chcesz śledzić
+ acct: Podaj swój adres (nazwa@domena), z którego chcesz wykonać działanie
missing_resource: Nie udało się znaleźć adresu przekierowania z Twojej domeny
no_account_html: Nie masz konta? Możesz
zarejestrować się tutaj
proceed: Śledź
prompt: 'Zamierzasz śledzić:'
+ remote_interaction:
+ proceed: Przejdź do interakcji
+ prompt: 'Chcesz dokonać interakcji z tym wpisem:'
remote_unfollow:
error: Błąd
title: Tytuł
@@ -756,6 +761,7 @@ pl:
private: Nie możesz przypiąć niepublicznego wpisu
reblog: Nie możesz przypiąć podbicia wpisu
show_more: Pokaż więcej
+ sign_in_to_participate: Zaloguj się, aby udzielić się w tej konwersacji
title: '%{name}: "%{quote}"'
visibilities:
private: Tylko dla śledzących
diff --git a/config/routes.rb b/config/routes.rb
index 3e0be9380f5..dffa2fb8b61 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -267,18 +267,19 @@ Rails.application.routes.draw do
get '/search', to: 'search#index', as: :search
- resources :follows, only: [:create]
- resources :media, only: [:create, :update]
- resources :blocks, only: [:index]
- resources :mutes, only: [:index] do
+ resources :follows, only: [:create]
+ resources :media, only: [:create, :update]
+ resources :blocks, only: [:index]
+ resources :mutes, only: [:index] do
collection do
get 'details'
end
end
- resources :favourites, only: [:index]
- resources :bookmarks, only: [:index]
- resources :reports, only: [:index, :create]
- resources :filters, only: [:index, :create, :show, :update, :destroy]
+ resources :favourites, only: [:index]
+ resources :bookmarks, only: [:index]
+ resources :reports, only: [:index, :create]
+ resources :filters, only: [:index, :create, :show, :update, :destroy]
+ resources :endorsements, only: [:index]
namespace :apps do
get :verify_credentials, to: 'credentials#show'
diff --git a/lib/tasks/mastodon.rake b/lib/tasks/mastodon.rake
index f693c8b5abe..191ce634c44 100644
--- a/lib/tasks/mastodon.rake
+++ b/lib/tasks/mastodon.rake
@@ -503,7 +503,7 @@ namespace :mastodon do
desc 'Remove media attachments attributed to silenced accounts'
task remove_silenced: :environment do
nb_media_attachments = 0
- MediaAttachment.where(account: Account.silenced).select(:id).find_in_batches do |media_attachments|
+ MediaAttachment.where(account: Account.silenced).select(:id).reorder(nil).find_in_batches do |media_attachments|
nb_media_attachments += media_attachments.length
Maintenance::DestroyMediaWorker.push_bulk(media_attachments.map(&:id))
end
@@ -515,7 +515,7 @@ namespace :mastodon do
time_ago = ENV.fetch('NUM_DAYS') { 7 }.to_i.days.ago
nb_media_attachments = 0
- MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id).find_in_batches do |media_attachments|
+ MediaAttachment.where.not(remote_url: '').where.not(file_file_name: nil).where('created_at < ?', time_ago).select(:id).reorder(nil).find_in_batches do |media_attachments|
nb_media_attachments += media_attachments.length
Maintenance::UncacheMediaWorker.push_bulk(media_attachments.map(&:id))
end
@@ -535,7 +535,7 @@ namespace :mastodon do
accounts = accounts.where(domain: ENV['DOMAIN']) if ENV['DOMAIN'].present?
nb_accounts = 0
- accounts.select(:id).find_in_batches do |accounts_batch|
+ accounts.select(:id).reorder(nil).find_in_batches do |accounts_batch|
nb_accounts += accounts_batch.length
Maintenance::RedownloadAccountMediaWorker.push_bulk(accounts_batch.map(&:id))
end
@@ -570,7 +570,7 @@ namespace :mastodon do
desc 'Generates home timelines for users who logged in in the past two weeks'
task build: :environment do
- User.active.select(:id, :account_id).find_in_batches do |users|
+ User.active.select(:id, :account_id).reorder(nil).find_in_batches do |users|
RegenerationWorker.push_bulk(users.map(&:account_id))
end
end
diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb
index fd303a9d5bb..8a5bd33010c 100644
--- a/spec/services/suspend_account_service_spec.rb
+++ b/spec/services/suspend_account_service_spec.rb
@@ -2,6 +2,11 @@ require 'rails_helper'
RSpec.describe SuspendAccountService, type: :service do
describe '#call' do
+ before do
+ stub_request(:post, "https://alice.com/inbox").to_return(status: 201)
+ stub_request(:post, "https://bob.com/inbox").to_return(status: 201)
+ end
+
subject do
-> { described_class.new.call(account) }
end
@@ -14,6 +19,8 @@ RSpec.describe SuspendAccountService, type: :service do
let!(:active_relationship) { Fabricate(:follow, account: account) }
let!(:passive_relationship) { Fabricate(:follow, target_account: account) }
let!(:subscription) { Fabricate(:subscription, account: account) }
+ let!(:remote_alice) { Fabricate(:account, inbox_url: 'https://alice.com/inbox', protocol: :activitypub) }
+ let!(:remote_bob) { Fabricate(:account, inbox_url: 'https://bob.com/inbox', protocol: :activitypub) }
it 'deletes associated records' do
is_expected.to change {
@@ -29,5 +36,11 @@ RSpec.describe SuspendAccountService, type: :service do
].map(&:count)
}.from([1, 1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0, 0])
end
+
+ it 'sends a delete actor activity to all known inboxes' do
+ subject.call
+ expect(a_request(:post, "https://alice.com/inbox")).to have_been_made.once
+ expect(a_request(:post, "https://bob.com/inbox")).to have_been_made.once
+ end
end
end