diff options
author | ThibG <thib@sitedethib.com> | 2020-01-24 17:28:22 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-01-24 17:28:22 +0100 |
commit | 0be67df4f0a64367d9e376b06bd3fd2fb9ca8195 (patch) | |
tree | 2eaa85c899033aab9bd1b2f9da2d727ce5788e16 /app/models/relationship_filter.rb | |
parent | a8c109baca4d02cc8aed454e231518c1f8ec1844 (diff) | |
parent | bdc1581556b86ba25a385c9309db714eeaba1ca1 (diff) |
Merge pull request #1265 from ThibG/glitch-soc/merge-upstream
Merge upstream changes
Diffstat (limited to 'app/models/relationship_filter.rb')
-rw-r--r-- | app/models/relationship_filter.rb | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/app/models/relationship_filter.rb b/app/models/relationship_filter.rb index 51640f494..e6859bf3d 100644 --- a/app/models/relationship_filter.rb +++ b/app/models/relationship_filter.rb @@ -7,5 +7,114 @@ class RelationshipFilter by_domain activity order + location ).freeze + + attr_reader :params, :account + + def initialize(account, params) + @account = account + @params = params + + set_defaults! + end + + def results + scope = scope_for('relationship', params['relationship'].to_s.strip) + + params.each do |key, value| + next if key.to_s == 'page' + + scope.merge!(scope_for(key.to_s, value.to_s.strip)) if value.present? + end + + scope + end + + private + + def set_defaults! + params['relationship'] = 'following' if params['relationship'].blank? + params['order'] = 'recent' if params['order'].blank? + end + + def scope_for(key, value) + case key + when 'relationship' + relationship_scope(value) + when 'by_domain' + by_domain_scope(value) + when 'location' + location_scope(value) + when 'status' + status_scope(value) + when 'order' + order_scope(value) + when 'activity' + activity_scope(value) + else + raise "Unknown filter: #{key}" + end + end + + def relationship_scope(value) + case value + when 'following' + account.following.eager_load(:account_stat).reorder(nil) + when 'followed_by' + account.followers.eager_load(:account_stat).reorder(nil) + when 'mutual' + account.followers.eager_load(:account_stat).reorder(nil).merge(Account.where(id: account.following)) + when 'invited' + Account.joins(user: :invite).merge(Invite.where(user: account.user)).eager_load(:account_stat).reorder(nil) + else + raise "Unknown relationship: #{value}" + end + end + + def by_domain_scope(value) + Account.where(domain: value) + end + + def location_scope(value) + case value + when 'local' + Account.local + when 'remote' + Account.remote + else + raise "Unknown location: #{value}" + end + end + + def status_scope(value) + case value + when 'moved' + Account.where.not(moved_to_account_id: nil) + when 'primary' + Account.where(moved_to_account_id: nil) + else + raise "Unknown status: #{value}" + end + end + + def order_scope(value) + case value + when 'active' + Account.by_recent_status + when 'recent' + params[:relationship] == 'invited' ? Account.recent : Follow.recent + else + raise "Unknown order: #{value}" + end + end + + def activity_scope(value) + case value + when 'dormant' + AccountStat.where(last_status_at: nil).or(AccountStat.where(AccountStat.arel_table[:last_status_at].lt(1.month.ago))) + else + raise "Unknown activity: #{value}" + end + end end |