]> git.openstreetmap.org Git - rails.git/blob - app/helpers/banner_helper.rb
Merge remote-tracking branch 'upstream/pull/4136'
[rails.git] / app / helpers / banner_helper.rb
1 module BannerHelper
2   def active_banners
3     BANNERS.reject do |_k, v|
4       enddate = v[:enddate]
5       begin
6         parsed = enddate && Date.parse(enddate)
7       rescue StandardError
8         parsed = nil
9       end
10       !parsed.is_a?(Date) || (parsed.is_a?(Date) && parsed.past?)
11     end
12   end
13
14   # returns the least recently seen banner that is not hidden
15   def next_banner
16     banners = active_banners
17     banner_key = nil
18     cookie_key = nil
19     min_index = 9999
20     min_date = Date.new(9999, 1, 1)
21
22     banners.each do |k, v|
23       ckey = banner_cookie(v[:id]).to_sym
24       cval = cookies[ckey] || 0
25       next if cval == "hide"
26
27       # rotate all banner queue positions
28       index = cval.to_i
29       cookies[ckey] = index - 1 if index.positive?
30
31       # pick banner with minimum queue position
32       next if index > min_index
33
34       # or if equal queue position, pick banner with soonest end date (i.e. next expiring)
35       end_date = Date.parse(v[:enddate])
36       next if index == min_index && end_date > min_date
37
38       banner_key = k
39       cookie_key = ckey
40       min_index = index
41       min_date = end_date
42     end
43
44     unless banner_key.nil?
45       cookies[cookie_key] = banners.length # bump to end of queue
46       banners[banner_key]
47     end
48   end
49
50   def banner_cookie(key)
51     "_osm_banner_#{key}"
52   end
53 end