Search code examples
ruby-on-railsrubygeolocationlocation-based-service

Are there any open-source examples of using LocationLabs or Loc-Aid through Ruby?


LocationLabs and Loc-Aid are location aggregation services that expose REST APIs. They currently offer Java, .NET and PHP SDKs. The API is not complex but, still, as a learning tool, it would be nice to have a Ruby tutorial or example to play with, extent, etc.


Solution

  • After further analysis, I built my application on Loc-Aid's infrastructure. Since there weren't many Ruby examples I could find, I'm sharing a snippet from my app.

      # Get SAVON soap client locaid location services
      # Parameters:
      #   - none
      # Returns: SOAP client for locaid location services
      def get_location_client
        Savon::Client.new do
          wsdl.document = LOCAID_CONFIG['use_local_wsdl'] ?
            File.expand_path(LOCAID_CONFIG['get_location_wsdl'].to_s, ::Rails.root.to_s) :
            LOCAID_CONFIG['get_location_wsdl'].to_s
          wsdl.endpoint = LOCAID_CONFIG['get_location_endpoint'].to_s
        end
      end
    
    
      # Strip the return result from locaid response as a hash
      # Parameters:
      #   - raw_response: Raw response XMLfrom locaid services
      #   - response_name: Response name which wrap the response return result in locaid response XML
      # Returns: Hash corresponding to the key "return" in locaid soap response hash.
      # Sample Raw Response:
      #   {:subscribe_phone_response=>{:return=>{:error=>{:error_code=>"00001", :error_message=>"Invalid or inactive user"}, :transaction_id=>"14028251"},
      #       :"@xmlns:ns2"=>"http://webservice.portico.locaid.net/"}}
      def strip_locaid_return(raw_response, response_name)
        unless raw_response.to_hash.has_key?(response_name)
          raise TropoExceptions::ExternalError
        end
        raw_response[response_name][:return]
      end
    
      # Get location from locaid by the caller id
      # Parameters:
      #     - @caller_id: Caller id get from scope value
      # Returns: none
      def location_from_locaid
        client = get_location_client
        client.http.read_timeout = LOCAID_CONFIG['get_location_timeout'].to_i
        # Call locaider service to get location
        response = client.request :wsdl, :get_locations_x do |soap|
          soap.body = {
              :login  => LOCAID_CONFIG['login'],
              :password  => LOCAID_CONFIG['password'],
              :class_id => LOCAID_CONFIG['class_id'],
              :msisdn_list => ["1#{@caller_id}"],
              :coor_type => "DECIMAL",
              :location_method => LOCAID_CONFIG['location_method'],
              :sync_type => "SYN",
              :overage => "1"
          }
        end
    
        result_hash = strip_locaid_return(response, :get_locations_x_response)
        if result_hash.has_key?(:error)
          raise TropoExceptions::ExternalError
        end
    
        yield result_hash[:location_response].is_a?(Array) ?
            result_hash[:location_response][0] :
            result_hash[:location_response]
    
      rescue Savon::Error, Timeout::Error => e
        logger.error e
        yield nil
      end
    end