/tomato

Elixir wrapper for the Zomato API

Primary LanguageElixirMIT LicenseMIT

tomato

Elixir wrapper for the Zomato API (documentation).

Installation

First, add tomato to your mix.exs dependencies:

def deps do
  [
    {:tomato, "~> 0.1.1"}
  ]
end

Then, update your dependencies:

$ mix deps.get

Configuration

Configure the Zomato API key and URI:

# config/config.exs

config :tomato,
  zomato_api_key: System.get_env("ZOMATO_API_KEY"),
  zomato_api_uri: System.get_env("ZOMATO_API_URI")

Usage

Usage follows the existing Zomato API endpoints.

Parameters for the various Tomato functions should be passed as a map (e.g., %{city_id: 82}).

Tomato.geocode/2 and Tomato.restaurant/1 are the exceptions:

  • Tomato.geocode/2 receives latitude and longitude, respectively;
  • Tomato.restaurant/1 receives a restaurant ID.

Categories

  • GET /categories
iex> Tomato.categories()
{:ok,
 [
   %Tomato.Category{id: 1, name: "Delivery"},
   %Tomato.Category{id: 2, name: "Dine-out"},
   %Tomato.Category{id: 3, name: "Nightlife"},
   ...
 ]}

Cities

  • GET /cities
iex> Tomato.cities(%{q: "Lisbon"})
{:ok,
 [
   %Tomato.City{
     country_id: 164,
     country_name: "Portugal",
     id: 82,
     is_state: 0,
     name: "Greater Lisbon",
     state_code: "",
     state_id: 0,
     state_name: ""
   },
   ...
 ]}

Collections

  • GET /collections
iex> Tomato.collections(%{city_id: 82})
{:ok,
 [
   %Tomato.Collection{
     description: "The best new places in town",
     id: 29,
     image_url: "https://b.zmtcdn.com/data/collections/957133b8ebf50487c00cbadea54d6461_1516725996.jpg",
     res_count: 26,
     share_url: "http://www.zoma.to/c-82/29",
     title: "Newly Opened",
     url: "https://www.zomato.com/grande-lisboa/best-new-restaurants?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1"
   },
   ...
 ]}

Cuisines

  • GET /cuisines
iex> Tomato.cuisines(%{city_id: 82})
{:ok,
 [
   %Tomato.Cuisine{id: 152, name: "African"},
   %Tomato.Cuisine{id: 283, name: "Alentejana"},
   %Tomato.Cuisine{id: 1, name: "American"},
   ...
 ]}

Establishments

  • GET /establishments
iex> Tomato.establishments(%{city_id: 82})
{:ok,
 [
   %Tomato.Establishment{id: 241, name: "Snack Bar"},
   %Tomato.Establishment{id: 16, name: "Casual Dining"},
   %Tomato.Establishment{id: 278, name: "Wine Bar"},
   ...
 ]}

Geocode

  • GET /geocode

Note: Geocode is one of the few responses which is not wrapped in a custom entity (unlike, e.g., cuisines, which map to Tomato.Cuisine).

iex> Tomato.geocode(38.733563, -9.144688)
{:ok,
 %{
   "link" => "https://www.zomato.com/grande-lisboa/saldanha-restaurants",
   "location" => %{
     "city_id" => 82,
     "city_name" => "Greater Lisbon",
     "country_id" => 164,
     "country_name" => "Portugal",
     "entity_id" => 82041,
     "entity_type" => "subzone",
     "latitude" => "38.7337710000",
     "longitude" => "-9.1448500000",
     "title" => "Saldanha"
   },
   "nearby_restaurants" => [
     %{
       "restaurant" => %{
         ...
       }
     },
     ...
   ],
   ...
 }}

Restaurant

  • GET /restaurant
iex> Tomato.restaurant(18714697)
{:ok,
 %Tomato.Restaurant{
   average_cost_for_two: 30,
   cuisines: "Pizza",
   currency: "€",
   deeplink: "zomato://restaurant/18714697",
   events_url: "https://www.zomato.com/grande-lisboa/valdo-gatti-bairro-alto-lisboa/events#tabtop?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
   featured_image: "https://b.zmtcdn.com/data/pictures/7/18714697/2d7c3dbbb17e70490e68f0db2fba5c29.jpg",
   has_online_delivery: 0,
   has_table_booking: 0,
   id: "18714697",
   is_delivering_now: 0,
   location: %Tomato.Location{
     address: "Rua do Grémio Lusitano, 13, Bairro Alto, Lisboa",
     city: "Lisboa",
     country_id: 164,
     latitude: "38.7133620825",
     locality: "Bairro Alto",
     longitude: "-9.1440753266",
     zipcode: ""
   },
   menu_url: "https://www.zomato.com/grande-lisboa/valdo-gatti-bairro-alto-lisboa/menu?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1&openSwipeBox=menu&showMinimal=1#tabtop",
   name: "Valdo Gatti",
   photos_url: "https://www.zomato.com/grande-lisboa/valdo-gatti-bairro-alto-lisboa/photos?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1#tabtop",
   price_range: 3,
   thumb: "https://b.zmtcdn.com/data/pictures/7/18714697/2d7c3dbbb17e70490e68f0db2fba5c29.jpg?fit=around%7C200%3A200&crop=200%3A200%3B%2A%2C%2A",
   url: "https://www.zomato.com/grande-lisboa/valdo-gatti-bairro-alto-lisboa?utm_source=api_basic_user&utm_medium=api&utm_campaign=v2.1",
   user_rating: %Tomato.Rating{
     aggregate_rating: "4.5",
     rating_color: "3F7E00",
     rating_text: "Excellent",
     votes: "124"
   }
 }}

Search

  • GET /search
iex> Tomato.search(%{entity_type: "city", entity_id: 82, start: 0, count: 5, cuisines: "82", sort: "rating", order: "desc"})
{:ok,
 [
   %Tomato.Restaurant{
     average_cost_for_two: 50,
     cuisines: "Pizza, Italian",
     currency: "€",
     deeplink: "zomato://restaurant/8212322",
     ...
   },
   ...
 ]}

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/dnlserrano/tomato.

License

tomato is released under the MIT License.