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