Don't forget to lycansubscribe
at master 2.5 kB view raw
1require 'active_record' 2 3require_relative 'import' 4require_relative 'import_job' 5require_relative 'like' 6require_relative 'quote' 7require_relative 'pin' 8require_relative 'post' 9require_relative 'repost' 10require_relative 'user_importable' 11 12class User < ActiveRecord::Base 13 validates_presence_of :did 14 validates_length_of :did, maximum: 260 15 validates_format_of :did, with: /\Adid:(plc:[0-9a-z]{24}|web:[0-9a-z\-]+(\.[0-9a-z\-]+)+)\Z/ 16 17 has_many :posts 18 has_many :imports, dependent: :delete_all 19 has_one :import_job, dependent: :delete 20 21 before_destroy :delete_posts_cascading 22 23 has_many :likes, foreign_key: 'actor_id', dependent: :delete_all, extend: UserImportable 24 has_many :reposts, foreign_key: 'actor_id', dependent: :delete_all, extend: UserImportable 25 has_many :quotes, foreign_key: 'actor_id', dependent: :delete_all, extend: UserImportable 26 has_many :pins, foreign_key: 'actor_id', dependent: :delete_all, extend: UserImportable 27 28 def self.active 29 self.joins(:imports).distinct 30 end 31 32 def self.with_unfinished_import 33 self.where(id: Import.unfinished.select('user_id').distinct) 34 .or(self.where(id: Like.in_queue(:import).select('actor_id').distinct)) 35 .or(self.where(id: Repost.in_queue(:import).select('actor_id').distinct)) 36 .or(self.where(id: Quote.in_queue(:import).select('actor_id').distinct)) 37 .or(self.where(id: Pin.in_queue(:import).select('actor_id').distinct)) 38 end 39 40 def active? 41 imports.exists? 42 end 43 44 def all_pending_items 45 [:likes, :reposts, :quotes, :pins].map { |x| self.send(x).pending.to_a }.reduce(&:+) 46 end 47 48 def all_items_in_queue(queue) 49 [:likes, :reposts, :quotes, :pins].map { |x| self.send(x).in_queue(queue).to_a }.reduce(&:+) 50 end 51 52 def imported_until 53 import_positions = self.imports.map(&:imported_until) 54 55 if import_positions.empty? || import_positions.any? { |x| x.nil? } 56 nil 57 else 58 import_positions.sort.last 59 end 60 end 61 62 def erase_imports! 63 [:likes, :reposts, :quotes, :pins].map { |x| self.send(x).delete_all } 64 65 self.import_job&.destroy 66 self.imports.delete_all 67 end 68 69 def delete_posts_cascading 70 posts_subquery = self.posts.select(:id) 71 72 Like.where(post_id: posts_subquery).delete_all 73 Repost.where(post_id: posts_subquery).delete_all 74 Pin.where(post_id: posts_subquery).delete_all 75 Quote.where(post_id: posts_subquery).delete_all 76 77 Post.where(user: self).delete_all 78 end 79 80 def to_s 81 %(<User id: #{id}, did: "#{did}">) 82 end 83end