Class: SmSmsCampaignWebhook::CampaignEngagement

Inherits:
Object
  • Object
show all
Defined in:
app/models/sm_sms_campaign_webhook/campaign_engagement.rb,
app/models/sm_sms_campaign_webhook/campaign_engagement/answer.rb

Overview

Data model for campaign engagement event from SMS campaign.

Defined Under Namespace

Classes: Answer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(payload:) ⇒ CampaignEngagement

Returns a new instance of CampaignEngagement.

Parameters:

  • payload (Hash)

    Campaign engagement event payload



11
12
13
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 11

def initialize(payload:)
  @payload = payload.deep_dup.freeze
end

Instance Attribute Details

#payloadObject (readonly)

Returns the value of attribute payload.



8
9
10
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 8

def payload
  @payload
end

Instance Method Details

#answer_for(field:) ⇒ Answer, NilClass

Returns Modeled answer for field when found.

Parameters:

  • field (String)

    Answer data to find

Returns:

  • (Answer, NilClass)

    Modeled answer for field when found



181
182
183
184
185
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 181

def answer_for(field:)
  phone_campaign_state_answers.detect do |answer|
    answer.field == field
  end
end

#campaign_idInteger

Returns ID of the engaged campaign.

Returns:

  • (Integer)

    ID of the engaged campaign

Raises:



53
54
55
56
57
58
59
60
61
62
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 53

def campaign_id
  @campaign_id ||= Integer(
    campaign_hash.fetch("id") {
      raise_invalid_payload_for("campaign id")
    }
  )
rescue ArgumentError
  raise InvalidPayloadValue,
    "campaign id has invalid integer value #{payload.inspect}"
end

#campaign_keywordString

Returns Keyword of the engaged campaign.

Returns:

  • (String)

    Keyword of the engaged campaign

Raises:



66
67
68
69
70
71
72
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 66

def campaign_keyword
  @campaign_keyword ||= String(
    campaign_hash.fetch("keyword") {
      raise_invalid_payload_for("campaign keyword")
    }.freeze
  )
end

#event_created_atDateTime

Returns Campaign engagement event timestamp.

Returns:

  • (DateTime)

    Campaign engagement event timestamp

Raises:



38
39
40
41
42
43
44
45
46
47
48
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 38

def event_created_at
  @event_created_at ||= begin
    raw_created_at = payload.fetch("created_at") {
      raise_invalid_payload_for("created_at")
    }
    DateTime.parse(raw_created_at).freeze
  end
rescue ArgumentError
  raise InvalidPayloadValue,
    "created_at has invalid datetime value #{payload.inspect}"
end

#event_typeString

Returns Campaign engagement event type.

Returns:

  • (String)

    Campaign engagement event type

Raises:



27
28
29
30
31
32
33
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 27

def event_type
  @event_type ||= String(
    payload.fetch("type") {
      raise_invalid_payload_for("type")
    }.freeze
  )
end

#event_uuidString

Returns Campaign engagement event UUID.

Returns:

  • (String)

    Campaign engagement event UUID

Raises:



17
18
19
20
21
22
23
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 17

def event_uuid
  @event_uuid ||= String(
    payload.fetch("uuid") {
      raise_invalid_payload_for("uuid")
    }.freeze
  )
end

#phone_campaign_state_answersArray<Answer>

Returns Modeled campaign engagement answers.

Returns:

  • (Array<Answer>)

    Modeled campaign engagement answers

Raises:



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 156

def phone_campaign_state_answers
  @phone_campaign_state_answers ||= begin
    # Extract answers data from payload.
    data = phone_campaign_state_hash.fetch("answers") {
      raise_invalid_payload_for("phone_campaign_state answers")
    }

    # Is this hash data?
    unless data.is_a?(Hash)
      raise InvalidPayloadValue,
        "phone_campaign_state answers has invalid hash value #{payload.inspect}"
    end

    # Cast answers data.
    Answer.cast(data: data).freeze
  end
end

#phone_campaign_state_answers?TrueClass, FalseClass

Returns Are any campaign engagement answers present?.

Returns:

  • (TrueClass, FalseClass)

    Are any campaign engagement answers present?



175
176
177
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 175

def phone_campaign_state_answers?
  !phone_campaign_state_answers.empty?
end

#phone_campaign_state_completed?TrueClass, FalseClass

Returns Has campaign engagement completed?.

Returns:

  • (TrueClass, FalseClass)

    Has campaign engagement completed?

Raises:



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 115

def phone_campaign_state_completed?
  # Has the boolean value already been assigned?
  unless @phone_campaign_state_completed.nil?
    return @phone_campaign_state_completed
  end

  # Extract the value and memoize it.
  @phone_campaign_state_completed = begin
    completed = phone_campaign_state_hash
      .fetch("completed") {
        raise_invalid_payload_for("phone_campaign_state completed")
      }

    # Is this a boolean value?
    if [true, false].none?(completed)
      raise InvalidPayloadValue,
        "phone_campaign_state completed has invalid boolean value #{payload.inspect}"
    end

    completed
  end
end

#phone_campaign_state_completed_atDateTime, NilClass

Returns Timestamp of campaign engagement completion if completed.

Returns:

  • (DateTime, NilClass)

    Timestamp of campaign engagement completion if completed

Raises:



141
142
143
144
145
146
147
148
149
150
151
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 141

def phone_campaign_state_completed_at
  @phone_campaign_state_completed_at ||= begin
    raw_completed_at = phone_campaign_state_hash.fetch("completed_at") {
      raise_invalid_payload_for("phone_campaign_state completed_at")
    }
    DateTime.parse(raw_completed_at).freeze if raw_completed_at
  end
rescue ArgumentError
  raise InvalidPayloadValue,
    "phone_campaign_state completed_at has invalid datetime value #{payload.inspect}"
end

#phone_campaign_state_idInteger

Returns ID of campaign engagement state record.

Returns:

  • (Integer)

    ID of campaign engagement state record

Raises:



101
102
103
104
105
106
107
108
109
110
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 101

def phone_campaign_state_id
  @phone_campaign_state_id ||= Integer(
    phone_campaign_state_hash.fetch("id") {
      raise_invalid_payload_for("phone_campaign_state id")
    }
  )
rescue ArgumentError
  raise InvalidPayloadValue,
    "phone_campaign_state id has invalid integer value #{payload.inspect}"
end

#phone_idInteger

Returns ID of the engaging phone.

Returns:

  • (Integer)

    ID of the engaging phone

Raises:



77
78
79
80
81
82
83
84
85
86
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 77

def phone_id
  @phone_id ||= Integer(
    phone_hash.fetch("id") {
      raise_invalid_payload_for("phone id")
    }
  )
rescue ArgumentError
  raise InvalidPayloadValue,
    "phone id has invalid integer value #{payload.inspect}"
end

#phone_numberString

Returns Phone number engaging the campaign.

Returns:

  • (String)

    Phone number engaging the campaign

Raises:



90
91
92
93
94
95
96
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement.rb', line 90

def phone_number
  @phone_number ||= String(
    phone_hash.fetch("number") {
      raise_invalid_payload_for("phone number")
    }.freeze
  )
end