Git Product home page Git Product logo

ht-search_client's Introduction

Ht::SearchClient

Travis CI Dependency Status

A gem client for the HouseTrip property search service. API documentation is available here.

Table of contents:

Installation

Add this line to your application's Gemfile:

gem 'ht-search_client', git: '[email protected]:HouseTrip/ht-search_client.git'

Configuration

The configuration is done by using an initiliazer.

example config/initializers/search_client.rb:

Ht::SearchClient.configure do |config|
  config.url      = 'SEARCH_SERVICE_HOSTNAME'
  config.username = 'SEARCH_SERVICE_USERNAME'
  config.password = 'SEARCH_SERVICE_PASSWORD'
  config.monitor_class = PropertySearch::Monitor
  config.exception_handler_class = PropertySearch::ExceptionHandler
end

Exception handling

We are leaving the exception handling up to you. You need to define a class that responds to the notify method. The parameters are:

  • exception - the exception instance
  • params - the parameters of the search
  • response - the Faraday response if there was one

Example

  class ExceptionHandler
    def notify(exception, params, response)
      # do whatever with the exception
    end
  end

Monitoring

We are leaving the monitoring up to you. We notify you about the following events:

  • search attempt
  • search success
  • search failure

You need to define a class that responds to the notify method.

Example

  class Monitor
    def notify(event)
      # event is just a string of the type (attempt, success, failure)
      # do whatever with the event
    end
  end

Usage

So you want to use the Search service? There are few types of search you can perform:

You can also pass additional parameters to refine your search:

Full documentation available at: Apiary documentation

Types of search

PlaceSearch

Search based on a place_id

Required parameters:

{
  place_id: 123,
  . . . (filter parameters)
}

PlaceStaySearch

Search based on a place_id, given dates from and to

Required parameters:

{
  place_id: 123,
  from: '2014-10-12',
  to: '2014-10-14',
  . . . (filter parameters)
}

PointSearch

Search based on latitude, longitude and a radius

Required parameters:

{
  latitude: 42.7000,
  longitude: 23.3333,
  radius: 100 #in Kilometers,
  . . . (filter parameters)
}

PointStaySearch

Search based on latitude, longitude and a radius, given dates from and to

Required parameters:

{
  latitude: 42.7000,
  longitude: 23.3333,
  radius: 100 #in Kilometers,
  from: '2014-10-12',
  to: '2014-10-14',
  . . . (filter parameters)
}

ViewportSearch

Search based on rectangle shape area, given two points

Required parameters:

{
  bottom_left_lat: 10.10,
  bottom_left_lon: 20.10,
  top_right_lat: 30.00,
  top_right_lon: 40.00,
  . . . (filter parameters)
}

ViewportStaySearch

Search based on rectangle shape area, given two points, given dates from and to

Required parameters:

{
  bottom_left_lat: 10.10,
  bottom_left_lon: 20.10,
  top_right_lat: 30.00,
  top_right_lon: 40.00,
  from: '2014-10-12',
  to: '2014-10-14',
  . . . (filter parameters)
}

Filters

All filters are optional. The filters you can apply are based on:

  • types [array] - types of properties
    • house
    • apartment
    • studio
    • boat
    • castle
  • features [array]
    • swimming pool
    • internet
    • washing machine
  • bedrooms [integer] - minimum number of bedrooms
  • guests [integer] - minimum number of guests
  • price_min [integer]
  • price_max [integer]
  • currency [string] [default: 'EUR']
  • excluding_ids [array]

Aggregations

All aggregations are optional. The aggregations you can apply are based on:

  • aggregations as a comma-separated string (e.g.: type_of_property,garden)
  • range_aggregations as an array of comma-separated strings (e.g.: price,-100,100-200,200-)

Structure:

{
  ... # other search params
  types: ['apartment', 'house'],
  features: ['internet', 'washing_machine'],
  bedrooms: 2,
  ...
}
Note about smoking and pets

If you are looking for properties where smoking or pets are allowed, you have to pass in 'smoking_allowed' or 'pets_allowed' respectively in the features array.

Ordering

Available ordering:

  • sqs_score
  • price_desc
  • price
  • distance - only available with PointSearch
{
  ... # other search params
  order: 'sqs_score'
}

Pagination

  • per_page [integer] - number of results per page - defaults to 32
  • page [integer] - page of the results set - defaults to 1
{
  ... # other search params
  per_page: 30,
  page: 5
}

Testing

In order to facilitate testing this gem can mimick the responses you receive from PSS. You should never ever stub responses coming from Property Search in your consumer apps. Instead you should use the test API provided by this gem. Example of usage in RSpec:

describe MyController do

  using Ht::SearchClient::Test

  before do
    Ht::SearchClient::PlaceSearch
      .stub_request(place_id: 100)
      .with_results(properties: [
        { 'property_id' => 10 }
      ])
  end

  it 'is blue & rainbows' do
    Ht::SearchClient::PlaceSearch.new(place_id: 100).perform
    # returns a PSS-like response with property_id = 10
  end
end

stub_request arguments accept the same parameters as property search service (check apiary documentation), for the specific search class. i.e - PlaceSearch requires a place_id, PointSearch requires a latitude, longitude and radius, etc.. This also stubs behind the scenes with Webmock the HTTP request.

with_results allows you to mock the response returned. It accepts:

  • an array of hashes representing the properties.
  • the total number number or results available.

The total number of results is optional and defaults to the size of the properties array. The resulting properties are set with default attributes, however depending on the type of the search, they can be overriden.

For normal searches (PlaceSearch, PointSearch & ViewportSearch):

  • property_id (required)
  • average_price (default: 100)
  • distance (default: nil)

For stay searches (PlaceStaySearch, PointStaySearch & ViewportStaySearch):

  • property_id (required)
  • stay_cost (default: 1880.0)
  • total_commission (default: 280.0)
  • commission_tax (default: 0.0)
  • commission (default: 280.0)
  • days_cost (default: 1600.0)
  • extra_guest_price (default: 0.0)
  • long_stay_discount (default: 0.0)
  • distance (default: nil)

A special note that this test API does not handle any kind of ordering or results filtering. The set of mocks given on with_results is exactly the one returned. Again, the goal of this API is only giving you specific property search service like responses.

ht-search_client's People

Contributors

mottalrd avatar matthutchinson avatar mrship avatar andycroll avatar nas avatar tadejm avatar

Watchers

James Cloos avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.