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