Don't forget to lycansubscribe
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