Conflicts: - `.github/dependabot.yml`: Upstream made changes, but we had removed it. Discarded upstream changes. - `.rubocop_todo.yml`: Upstream regenerated the file, we had some glitch-soc-specific ignores. - `app/models/account_statuses_filter.rb`: Minor upstream code style change where glitch-soc had slightly different code due to handling of local-only posts. Updated to match upstream's code style. - `app/models/status.rb`: Upstream moved ActiveRecord callback definitions, glitch-soc had an extra one. Moved the definitions as upstream did. - `app/services/backup_service.rb`: Upstream rewrote a lot of the backup service, glitch-soc had changes because of exporting local-only posts. Took upstream changes and added back code to deal with local-only posts. - `config/routes.rb`: Upstream split the file into different files, while glitch-soc had a few extra routes. Extra routes added to `config/routes/settings.rb`, `config/routes/api.rb` and `config/routes/admin.rb` - `db/schema.rb`: Upstream has new migrations, while glitch-soc had an extra migration. Updated the expected serial number to match upstream's. - `lib/mastodon/version.rb`: Upstream added support to set version tags from environment variables, while glitch-soc has an extra `+glitch` tag. Changed the code to support upstream's feature but prepending a `+glitch`. - `spec/lib/activitypub/activity/create_spec.rb`: Minor code style change upstream, while glitch-soc has extra tests due to `directMessage` handling. Applied upstream's changes while keeping glitch-soc's extra tests. - `spec/models/concerns/account_interactions_spec.rb`: Minor code style change upstream, while glitch-soc has extra tests. Applied upstream's changes while keeping glitch-soc's extra tests.
134 lines
2.9 KiB
Ruby
134 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class AccountStatusesFilter
|
|
KEYS = %i(
|
|
pinned
|
|
tagged
|
|
only_media
|
|
exclude_replies
|
|
exclude_reblogs
|
|
).freeze
|
|
|
|
attr_reader :params, :account, :current_account
|
|
|
|
def initialize(account, current_account, params = {})
|
|
@account = account
|
|
@current_account = current_account
|
|
@params = params
|
|
end
|
|
|
|
def results
|
|
scope = initial_scope
|
|
|
|
scope.merge!(pinned_scope) if pinned?
|
|
scope.merge!(only_media_scope) if only_media?
|
|
scope.merge!(no_replies_scope) if exclude_replies?
|
|
scope.merge!(no_reblogs_scope) if exclude_reblogs?
|
|
scope.merge!(hashtag_scope) if tagged?
|
|
|
|
scope
|
|
end
|
|
|
|
private
|
|
|
|
def initial_scope
|
|
return Status.none if suspended?
|
|
|
|
if anonymous?
|
|
account.statuses.not_local_only.where(visibility: %i(public unlisted))
|
|
elsif author?
|
|
account.statuses.all # NOTE: #merge! does not work without the #all
|
|
elsif blocked?
|
|
Status.none
|
|
else
|
|
filtered_scope
|
|
end
|
|
end
|
|
|
|
def filtered_scope
|
|
scope = account.statuses.left_outer_joins(:mentions)
|
|
|
|
scope.merge!(scope.where(visibility: follower? ? %i(public unlisted private) : %i(public unlisted)).or(scope.where(mentions: { account_id: current_account.id })).group(Status.arel_table[:id]))
|
|
scope.merge!(filtered_reblogs_scope) if reblogs_may_occur?
|
|
|
|
scope
|
|
end
|
|
|
|
def filtered_reblogs_scope
|
|
Status.left_outer_joins(:reblog).where(reblog_of_id: nil).or(Status.where.not(reblogs_statuses: { account_id: current_account.excluded_from_timeline_account_ids }))
|
|
end
|
|
|
|
def only_media_scope
|
|
Status.joins(:media_attachments).merge(account.media_attachments.reorder(nil)).group(Status.arel_table[:id])
|
|
end
|
|
|
|
def no_replies_scope
|
|
Status.without_replies
|
|
end
|
|
|
|
def no_reblogs_scope
|
|
Status.without_reblogs
|
|
end
|
|
|
|
def pinned_scope
|
|
account.pinned_statuses.group(Status.arel_table[:id], StatusPin.arel_table[:created_at])
|
|
end
|
|
|
|
def hashtag_scope
|
|
tag = Tag.find_normalized(params[:tagged])
|
|
|
|
if tag
|
|
Status.tagged_with(tag.id)
|
|
else
|
|
Status.none
|
|
end
|
|
end
|
|
|
|
def suspended?
|
|
account.suspended?
|
|
end
|
|
|
|
def anonymous?
|
|
current_account.nil?
|
|
end
|
|
|
|
def author?
|
|
current_account.id == account.id
|
|
end
|
|
|
|
def blocked?
|
|
account.blocking?(current_account) || (current_account.domain.present? && account.domain_blocking?(current_account.domain))
|
|
end
|
|
|
|
def follower?
|
|
current_account.following?(account)
|
|
end
|
|
|
|
def reblogs_may_occur?
|
|
!exclude_reblogs? && !only_media? && !tagged?
|
|
end
|
|
|
|
def pinned?
|
|
truthy_param?(:pinned)
|
|
end
|
|
|
|
def only_media?
|
|
truthy_param?(:only_media)
|
|
end
|
|
|
|
def exclude_replies?
|
|
truthy_param?(:exclude_replies)
|
|
end
|
|
|
|
def exclude_reblogs?
|
|
truthy_param?(:exclude_reblogs)
|
|
end
|
|
|
|
def tagged?
|
|
params[:tagged].present?
|
|
end
|
|
|
|
def truthy_param?(key)
|
|
ActiveModel::Type::Boolean.new.cast(params[key])
|
|
end
|
|
end
|