Sha256: c490185398469f68317119adb119081c6da75c416d1ca52461649aef8e9cbd3f
Contents?: true
Size: 2 KB
Versions: 2
Compression:
Stored size: 2 KB
Contents
# frozen_string_literal: true module FriendlyShipping module Services class ShipEngine # Parses the labels API response. class ParseLabelResponse # @param request [Request] the request to attach to the API result # @param response [Response] the response to parse # @return [ApiResult<Array<Label>] the parsed labels (ShipEngine only returns one label at a time) def self.call(request:, response:) parsed_json = JSON.parse(response.body) label_uri_string = parsed_json['label_download']['href'] label_data = nil label_url = nil if label_uri_string.starts_with?('data') # This URI has the following form: # data:application/zpl;base64,XlhBDQpeTEwxMjE4.... # We don't know the content type here, but we can assume Base64 # encoding. # This next line splits the URI at the first occurrence of ";base64,", # giving us the desired base64 encoded string. _, base64_encoded = label_uri_string.split(";base64,", 2) label_data = Base64.decode64(base64_encoded) else label_url = label_uri_string end currency = parsed_json.dig('shipment_cost', 'currency') cents = parsed_json.dig('shipment_cost', 'amount') * 100 shipment_cost = Money.new(cents, currency) label = FriendlyShipping::Label.new( id: parsed_json['label_id'], shipment_id: parsed_json['shipment_id'], tracking_number: parsed_json['tracking_number'], service_code: parsed_json['service_code'], label_href: label_url, label_data: label_data, label_format: parsed_json['label_format'].to_sym, shipment_cost: shipment_cost, cost: shipment_cost, data: parsed_json ) ApiResult.new([label], original_request: request, original_response: response) end end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
friendly_shipping-0.10.1 | lib/friendly_shipping/services/ship_engine/parse_label_response.rb |
friendly_shipping-0.10.0 | lib/friendly_shipping/services/ship_engine/parse_label_response.rb |