Class: SmSmsCampaignWebhook::CampaignEngagement::Answer

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

Overview

Data model for campaign engagement answer data.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(field:, answer_hash:) ⇒ Answer

Returns a new instance of Answer.

Parameters:

  • field (String)

    Field describing the answer

  • answer_hash (Hash)

    Answer data from payload



22
23
24
25
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement/answer.rb', line 22

def initialize(field:, answer_hash:)
  @field = String(field)
  @answer_hash = answer_hash.freeze
end

Instance Attribute Details

#answer_hashObject (readonly)

Returns the value of attribute answer_hash.



17
18
19
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement/answer.rb', line 17

def answer_hash
  @answer_hash
end

#fieldObject (readonly)

Returns the value of attribute field.



17
18
19
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement/answer.rb', line 17

def field
  @field
end

Class Method Details

.cast(data:) ⇒ Array<Answer>

Returns Modeled answer data sorted by collected_at.

Parameters:

  • data (Hash)

    Answers from payload

Returns:

  • (Array<Answer>)

    Modeled answer data sorted by collected_at



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

def self.cast(data:)
  data.map { |field, answer_hash|
    new(field: field, answer_hash: answer_hash)
  }.sort_by(&:collected_at)
end

Instance Method Details

#collected_atDateTime

Returns Timestamp of answer value collection.

Returns:

  • (DateTime)

    Timestamp of answer value collection

Raises:



62
63
64
65
66
67
68
69
70
71
72
73
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement/answer.rb', line 62

def collected_at
  @collected_at ||= begin
    raw_collected_at = answer_hash.fetch("collected_at") {
      raise InvalidPayload,
        "collected_at missing from answer_hash #{answer_hash.inspect}"
    }
    DateTime.parse(raw_collected_at).freeze
  end
rescue ArgumentError
  raise InvalidPayloadValue,
    "collected_at has invalid datetime value #{answer_hash.inspect}"
end

#valueString, ...

Collected answer could be many different value types.

The SMS campaign service collects answers of type: string, email, date, number, boolean, us_state

The possible types are from SMS campaign service perspective. They are coerced to the appropriate type in Ruby.

Returns:

  • (String, Integer, Date, TrueClass, FalseClass)

    Coerced answer

Raises:



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'app/models/sm_sms_campaign_webhook/campaign_engagement/answer.rb', line 37

def value
  # Could be boolean so cannot rely on double pipe assignment guard.
  unless @value.nil?
    return @value
  end

  # Extract the value and memoize it.
  @value = begin
    raw_value = answer_hash.fetch("value") {
      raise InvalidPayload,
        "value missing from answer_hash #{answer_hash.inspect}"
    }.freeze

    # Attempt to parse date value falling back to raw value.
    begin
      Date.strptime(raw_value, "%Y-%m-%d").freeze
    rescue
      raw_value
    end
  end
end