Class: FriendlyShipping::Services::USPSShip::ParseTimingsResponse

Inherits:
Object
  • Object
show all
Extended by:
Dry::Monads::Result::Mixin
Defined in:
lib/friendly_shipping/services/usps_ship/parse_timings_response.rb

Class Method Summary collapse

Class Method Details

.call(request:, response:) ⇒ Success<ApiResult<Array<Timing>>>, Failure<ApiResult<String>>

Parse a timings response.

Parameters:

  • request (Request)

    the request that was used to obtain this response

  • response (Response)

    the response that USPS returned

Returns:



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/friendly_shipping/services/usps_ship/parse_timings_response.rb', line 15

def call(request:, response:)
  timings = JSON.parse(response.body).map do |timing|
    shipping_method = SHIPPING_METHODS.detect { |sm| sm.service_code == timing['mailClass'] }

    # The delivery estimate is blank if an invalid destination zip code was used
    delivery = timing.dig('delivery', 'scheduledDeliveryDateTime')
    next unless delivery

    FriendlyShipping::Timing.new(
      shipping_method: shipping_method,
      pickup: Time.parse(timing['acceptanceDateTime']),
      delivery: Time.parse(delivery),
      guaranteed: timing['delivery']['guaranteedDelivery'],
      data: {
        notes: timing['notes'],
        service_standard: timing['serviceStandard'],
        service_standard_message: timing['serviceStandardMessage']
      }
    )
  end.compact

  if timings.empty?
    failure(api_error("No timings were returned. Is the destination zip correct?"), request, response)
  else
    success(timings, request, response)
  end
rescue JSON::ParserError => e
  failure(e, request, response)
end

.failure(error, request, response) ⇒ Failure<ApiResult>

Parameters:

Returns:



63
64
65
66
67
68
69
70
71
# File 'lib/friendly_shipping/services/usps_ship/parse_timings_response.rb', line 63

def failure(error, request, response)
  Failure(
    ApiResult.new(
      error,
      original_request: request,
      original_response: response
    )
  )
end

.success(timings, request, response) ⇒ Success<ApiResult<Array<Timing>>]

Returns Success>].

Parameters:

Returns:



49
50
51
52
53
54
55
56
57
# File 'lib/friendly_shipping/services/usps_ship/parse_timings_response.rb', line 49

def success(timings, request, response)
  Success(
    ApiResult.new(
      timings,
      original_request: request,
      original_response: response
    )
  )
end