Class: RailsDrips::Remove

Inherits:
Object
  • Object
show all
Defined in:
app/services/rails_drips/remove.rb

Class Method Summary collapse

Class Method Details

.call(campaign:, recipient:, reason:, actor: nil, data: {}) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'app/services/rails_drips/remove.rb', line 5

def self.call(campaign:, recipient:, reason:, actor: nil, data: {})
  campaign = campaign.is_a?(Campaign) ? campaign : Campaign.find_by(key: campaign.to_s)
  return Result.new(status: :campaign_not_found) unless campaign

  enrollment = campaign.enrollments.open.find_by(recipient: recipient)
  return Result.new(status: :not_open, campaign: campaign) unless enrollment

  Enrollment.transaction do
    enrollment.lock!
    enrollment.remove!(reason: reason, actor: actor)
    RecordEvent.call(enrollment: enrollment, event_type: "removed", actor: actor,
      data: (data || {}).stringify_keys.merge("reason" => reason.to_s))
    enrollment.deliveries.scheduled.find_each do |delivery|
      delivery.cancel!(reason: :recipient_removed)
      RecordEvent.call(enrollment: enrollment, event_type: "delivery_cancelled", actor: actor,
        data: { "delivery_id" => delivery.id, "reason" => "recipient_removed" })
    end
  end
  Instrumentation.instrument("enrollment.removed", campaign_key: campaign.key, enrollment_id: enrollment.id)
  Result.new(status: :removed, campaign: campaign, enrollment: enrollment)
end