@ -49,6 +49,7 @@ class Account < ApplicationRecord
USERNAME_RE = / [a-z0-9_]+([a-z0-9_ \ .-]+[a-z0-9_]+)? /i
MENTION_RE = / (?<=^|[^ \/ [:word:]])@(( #{ USERNAME_RE } )(?:@[a-z0-9 \ . \ -]+[a-z0-9]+)?) /i
include AccountAssociations
include AccountAvatar
include AccountFinderConcern
include AccountHeader
@ -59,9 +60,6 @@ class Account < ApplicationRecord
enum protocol : [ :ostatus , :activitypub ]
# Local users
has_one :user , inverse_of : :account
validates :username , presence : true
# Remote user validations
@ -76,45 +74,6 @@ class Account < ApplicationRecord
validates :note , length : { maximum : 160 } , if : - > { local? && will_save_change_to_note? }
validates :fields , length : { maximum : 4 } , if : - > { local? && will_save_change_to_fields? }
# Timelines
has_many :stream_entries , inverse_of : :account , dependent : :destroy
has_many :statuses , inverse_of : :account , dependent : :destroy
has_many :favourites , inverse_of : :account , dependent : :destroy
has_many :mentions , inverse_of : :account , dependent : :destroy
has_many :notifications , inverse_of : :account , dependent : :destroy
# Pinned statuses
has_many :status_pins , inverse_of : :account , dependent : :destroy
has_many :pinned_statuses , - > { reorder ( 'status_pins.created_at DESC' ) } , through : :status_pins , class_name : 'Status' , source : :status
# Endorsements
has_many :account_pins , inverse_of : :account , dependent : :destroy
has_many :endorsed_accounts , through : :account_pins , class_name : 'Account' , source : :target_account
# Media
has_many :media_attachments , dependent : :destroy
# PuSH subscriptions
has_many :subscriptions , dependent : :destroy
# Report relationships
has_many :reports
has_many :targeted_reports , class_name : 'Report' , foreign_key : :target_account_id
has_many :report_notes , dependent : :destroy
has_many :custom_filters , inverse_of : :account , dependent : :destroy
# Moderation notes
has_many :account_moderation_notes , dependent : :destroy
has_many :targeted_moderation_notes , class_name : 'AccountModerationNote' , foreign_key : :target_account_id , dependent : :destroy
# Lists
has_many :list_accounts , inverse_of : :account , dependent : :destroy
has_many :lists , through : :list_accounts
# Account migrations
belongs_to :moved_to_account , class_name : 'Account' , optional : true
scope :remote , - > { where . not ( domain : nil ) }
scope :local , - > { where ( domain : nil ) }
scope :expiring , - > ( time ) { remote . where . not ( subscription_expires_at : nil ) . where ( 'subscription_expires_at < ?' , time ) }
@ -452,6 +411,7 @@ class Account < ApplicationRecord
before_create :generate_keys
before_validation :normalize_domain
before_validation :prepare_contents , if : :local?
before_destroy :clean_feed_manager
private
@ -477,4 +437,19 @@ class Account < ApplicationRecord
def emojifiable_text
[ note , display_name , fields . map ( & :value ) ] . join ( ' ' )
end
def clean_feed_manager
reblog_key = FeedManager . instance . key ( :home , id , 'reblogs' )
reblogged_id_set = Redis . current . zrange ( reblog_key , 0 , - 1 )
Redis . current . pipelined do
Redis . current . del ( FeedManager . instance . key ( :home , id ) )
Redis . current . del ( reblog_key )
reblogged_id_set . each do | reblogged_id |
reblog_set_key = FeedManager . instance . key ( :home , id , " reblogs: #{ reblogged_id } " )
Redis . current . del ( reblog_set_key )
end
end
end
end