lib/paubox/email_disposition.rb in paubox-0.2.3 vs lib/paubox/email_disposition.rb in paubox-0.3.0

- old
+ new

@@ -1,57 +1,62 @@ -module Paubox - # Parses email dispositions from /v1/message_reciept response to friendly Ruby - class EmailDisposition - require 'time' - attr_reader :response, :raw_json_response, :source_tracking_id, :message_id, - :message_deliveries, :errors - MessageDelivery = Struct.new(:recipient, :status) - MessageDeliveryStatus = Struct.new(:delivery_status, :delivery_time, - :opened_status, :opened_time) - MessageMultiDeliveryStatus = Struct.new(:delivery_status, :delivery_time) - ResponseError = Struct.new(:code, :status, :title, :details) - - def initialize(response) - @response = response - @raw_json_response = response.to_json - @source_tracking_id = response.dig('sourceTrackingId') - @message_data = response.dig('data', 'message') - @message_id = @message_data ? @message_data['id'] : nil - @message_deliveries ||= build_message_deliveries - @errors ||= build_errors - end - - def errors? - errors.any? - end - - def build_errors - return [] unless response['errors'] - errors = response['errors'] - errors.map { |e| ResponseError.new(e['code'], e['status'], e['title'], e['details']) } - end - - private - - def build_message_deliveries - return [] unless @message_data - deliveries = @message_data.fetch('message_deliveries', []) - deliveries.map do |delivery| - status = build_message_delivery_status(delivery['status']) - MessageDelivery.new(delivery['recipient'], status) - end - end - - def build_message_delivery_status(stat) - delivery_status = stat['deliveryStatus'] - delivery_time = stat['deliveryTime'].to_s.empty? ? nil : DateTime.parse(stat['deliveryTime']) - opened_status = stat['openedStatus'].to_s.empty? ? 'unopened' : stat['openedStatus'] - opened_time = stat['openedTime'].to_s.empty? ? nil : DateTime.parse(stat['openedTime']) - return MessageMultiDeliveryStatus.new(delivery_status, delivery_time) if multi_recipient? - MessageDeliveryStatus.new(delivery_status, delivery_time, opened_status, opened_time) - end - - def multi_recipient? - @message_data.fetch('message_deliveries', []).length > 1 - end - end -end +# frozen_string_literal: true + +module Paubox + # Parses email dispositions from /v1/message_reciept response to friendly Ruby + class EmailDisposition + require 'time' + attr_reader :response, :raw_json_response, :source_tracking_id, :message_id, + :message_deliveries, :errors + MessageDelivery = Struct.new(:recipient, :status) + MessageDeliveryStatus = Struct.new(:delivery_status, :delivery_time, + :opened_status, :opened_time) + MessageMultiDeliveryStatus = Struct.new(:delivery_status, :delivery_time) + ResponseError = Struct.new(:code, :status, :title, :details) + + def initialize(response) + @response = response + @raw_json_response = response.to_json + @source_tracking_id = response.dig('sourceTrackingId') + @message_data = response.dig('data', 'message') + @message_id = @message_data ? @message_data['id'] : nil + @message_deliveries ||= build_message_deliveries + @errors ||= build_errors + end + + def errors? + errors.any? + end + + def build_errors + return [] unless response['errors'] + + errors = response['errors'] + errors.map { |e| ResponseError.new(e['code'], e['status'], e['title'], e['details']) } + end + + private + + def build_message_deliveries + return [] unless @message_data + + deliveries = @message_data.fetch('message_deliveries', []) + deliveries.map do |delivery| + status = build_message_delivery_status(delivery['status']) + MessageDelivery.new(delivery['recipient'], status) + end + end + + def build_message_delivery_status(stat) + delivery_status = stat['deliveryStatus'] + delivery_time = stat['deliveryTime'].to_s.empty? ? nil : DateTime.parse(stat['deliveryTime']) + opened_status = stat['openedStatus'].to_s.empty? ? 'unopened' : stat['openedStatus'] + opened_time = stat['openedTime'].to_s.empty? ? nil : DateTime.parse(stat['openedTime']) + return MessageMultiDeliveryStatus.new(delivery_status, delivery_time) if multi_recipient? + + MessageDeliveryStatus.new(delivery_status, delivery_time, opened_status, opened_time) + end + + def multi_recipient? + @message_data.fetch('message_deliveries', []).length > 1 + end + end +end