Module: Subscribable
- Extended by:
- ActiveSupport::Concern
- Included in:
- DesignManagement::Design, Issuable, Label
- Defined in:
- app/models/concerns/subscribable.rb
Overview
Subscribable concern
Users can subscribe to these models.
Used by Issue, MergeRequest, Label
Instance Method Summary collapse
- #lazy_subscription(user, project = nil) ⇒ Object
- #set_subscription(user, desired_state, project = nil) ⇒ Object
- #subscribe(user, project = nil) ⇒ Object
- #subscribed?(user, project = nil) ⇒ Boolean
-
#subscribed_without_subscriptions?(user, project) ⇒ Boolean
Override this method to define custom logic to consider a subscribable as subscribed without an explicit subscription record.
- #subscribers(project) ⇒ Object
- #toggle_subscription(user, project = nil) ⇒ Object
- #unsubscribe(user, project = nil) ⇒ Object
Instance Method Details
#lazy_subscription(user, project = nil) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'app/models/concerns/subscribable.rb', line 30 def lazy_subscription(user, project = nil) return unless user BatchLoader.for(id: id, subscribable_type: subscribable_type, project_id: project&.id).batch do |items, loader| values = items.each_with_object({ ids: Set.new, subscribable_types: Set.new, project_ids: Set.new }) do |item, result| result[:ids] << item[:id] result[:subscribable_types] << item[:subscribable_type] result[:project_ids] << item[:project_id] end subscriptions = Subscription.where(subscribable_id: values[:ids], subscribable_type: values[:subscribable_types], project_id: values[:project_ids], user: user) subscriptions.each do |subscription| loader.call({ id: subscription.subscribable_id, subscribable_type: subscription.subscribable_type, project_id: subscription.project_id }, subscription) end end end |
#set_subscription(user, desired_state, project = nil) ⇒ Object
89 90 91 92 93 94 95 |
# File 'app/models/concerns/subscribable.rb', line 89 def set_subscription(user, desired_state, project = nil) if desired_state subscribe(user, project) else unsubscribe(user, project) end end |
#subscribe(user, project = nil) ⇒ Object
75 76 77 78 79 80 |
# File 'app/models/concerns/subscribable.rb', line 75 def subscribe(user, project = nil) unsubscribe_from_other_levels(user, project) find_or_initialize_subscription(user, project) .update(subscribed: true) end |
#subscribed?(user, project = nil) ⇒ Boolean
20 21 22 23 24 25 26 27 28 |
# File 'app/models/concerns/subscribable.rb', line 20 def subscribed?(user, project = nil) return false unless user if (subscription = lazy_subscription(user, project)&.itself) subscription.subscribed else subscribed_without_subscriptions?(user, project) end end |
#subscribed_without_subscriptions?(user, project) ⇒ Boolean
Override this method to define custom logic to consider a subscribable as subscribed without an explicit subscription record.
54 55 56 |
# File 'app/models/concerns/subscribable.rb', line 54 def subscribed_without_subscriptions?(user, project) false end |
#subscribers(project) ⇒ Object
58 59 60 61 62 63 64 |
# File 'app/models/concerns/subscribable.rb', line 58 def subscribers(project) relation = subscriptions_available(project) .where(subscribed: true) .select(:user_id) User.where(id: relation) end |
#toggle_subscription(user, project = nil) ⇒ Object
66 67 68 69 70 71 72 73 |
# File 'app/models/concerns/subscribable.rb', line 66 def toggle_subscription(user, project = nil) unsubscribe_from_other_levels(user, project) new_value = !subscribed?(user, project) find_or_initialize_subscription(user, project) .update(subscribed: new_value) end |
#unsubscribe(user, project = nil) ⇒ Object
82 83 84 85 86 87 |
# File 'app/models/concerns/subscribable.rb', line 82 def unsubscribe(user, project = nil) unsubscribe_from_other_levels(user, project) find_or_initialize_subscription(user, project) .update(subscribed: false) end |