master
1class Search
2 class Yelp
3 attr_reader :client
4
5 def initialize(client = ::Yelp.client)
6 @client = client
7 end
8
9 def for(q, city, categories = [], page = 1, per_page = 20, &block)
10 return paginate([]) if city.blank?
11
12 cache(key: key_for(q, city, page, per_page)) do
13 paginate(results_for(q, city, categories, page, per_page).map(&block))
14 end
15 end
16
17 def for_business(yelp_id)
18 client.business(yelp_id).try(:business)
19 end
20
21 private
22
23 def key_for(*args)
24 args.join("-")
25 end
26
27 def results_for(q, city, categories, page, per_page)
28 client.search(
29 city,
30 category_filter: categories.join(","),
31 limit: per_page,
32 offset: offset_for(page, per_page),
33 term: q,
34 ).businesses
35 end
36
37 def paginate(results)
38 Kaminari.paginate_array(results)
39 end
40
41 def cache(key:)
42 Rails.cache.fetch(key, expires_in: 1.hour) do
43 yield
44 end
45 end
46
47 def offset_for(page, per_page)
48 (page * per_page) - per_page
49 end
50 end
51
52 def self.yelp
53 @yelp ||= Yelp.new
54 end
55end