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