Class: SmSmsCampaignWebhook::CampaignEngagement::Answer
- Inherits:
-
Object
- Object
- SmSmsCampaignWebhook::CampaignEngagement::Answer
- Defined in:
- app/models/sm_sms_campaign_webhook/campaign_engagement/answer.rb
Overview
Data model for campaign engagement answer data.
Instance Attribute Summary collapse
-
#answer_hash ⇒ Object
readonly
Returns the value of attribute answer_hash.
-
#field ⇒ Object
readonly
Returns the value of attribute field.
Class Method Summary collapse
-
.cast(data:) ⇒ Array<Answer>
Modeled answer data sorted by collected_at.
Instance Method Summary collapse
-
#collected_at ⇒ DateTime
Timestamp of answer value collection.
-
#initialize(field:, answer_hash:) ⇒ Answer
constructor
A new instance of Answer.
-
#value ⇒ String, ...
Collected answer could be many different value types.
Constructor Details
#initialize(field:, answer_hash:) ⇒ Answer
Returns a new instance of Answer.
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_hash ⇒ Object (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 |
#field ⇒ Object (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.
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_at ⇒ DateTime
Returns Timestamp of answer value collection.
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 |
#value ⇒ String, ...
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.
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 |