Files
mastodon/app/models/concerns/account/mappings.rb
2026-03-09 10:01:12 +00:00

116 lines
3.2 KiB
Ruby

# frozen_string_literal: true
module Account::Mappings
extend ActiveSupport::Concern
class_methods do
def following_map(target_account_ids, account_id)
Follow.where(target_account_id: target_account_ids, account_id: account_id).to_h do |follow|
[follow.target_account_id, {
reblogs: follow.show_reblogs?,
notify: follow.notify?,
languages: follow.languages,
}]
end
end
def followed_by_map(target_account_ids, account_id)
build_mapping(
Follow.where(account_id: target_account_ids, target_account_id: account_id),
:account_id
)
end
def blocking_map(target_account_ids, account_id)
build_mapping(
Block.where(target_account_id: target_account_ids, account_id: account_id),
:target_account_id
)
end
def blocked_by_map(target_account_ids, account_id)
build_mapping(
Block.where(account_id: target_account_ids, target_account_id: account_id),
:account_id
)
end
def muting_map(target_account_ids, account_id)
Mute.where(target_account_id: target_account_ids, account_id: account_id).to_h do |mute|
[mute.target_account_id, {
notifications: mute.hide_notifications?,
expires_at: mute.expires_at,
}]
end
end
def requested_map(target_account_ids, account_id)
FollowRequest.where(target_account_id: target_account_ids, account_id: account_id).to_h do |follow_request|
[follow_request.target_account_id, {
reblogs: follow_request.show_reblogs?,
notify: follow_request.notify?,
languages: follow_request.languages,
}]
end
end
def requested_by_map(target_account_ids, account_id)
build_mapping(
FollowRequest.where(account_id: target_account_ids, target_account_id: account_id),
:account_id
)
end
def endorsed_map(target_account_ids, account_id)
build_mapping(
AccountPin.where(account_id: account_id, target_account_id: target_account_ids),
:target_account_id
)
end
def account_note_map(target_account_ids, account_id)
AccountNote.where(target_account_id: target_account_ids, account_id: account_id).to_h do |note|
[note.target_account_id, {
comment: note.comment,
}]
end
end
def domain_blocking_map_by_domain(target_domains, account_id)
build_mapping(
AccountDomainBlock.where(account_id: account_id, domain: target_domains),
:domain
)
end
private
def build_mapping(query, field)
query
.pluck(field)
.index_with(true)
end
end
def preload_relations!(...)
@preloaded_relations = relations_map(...)
end
private
def relations_map(account_ids, domains = nil, **options)
relations = {
blocked_by: Account.blocked_by_map(account_ids, id),
following: Account.following_map(account_ids, id),
}
return relations if options[:skip_blocking_and_muting]
relations.merge!({
blocking: Account.blocking_map(account_ids, id),
muting: Account.muting_map(account_ids, id),
domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, id),
})
end
end