docbrown/app/controllers/billboards_controller.rb
Ben Halpern 2f9769a89d
Add new sidebar billboard locations and remove legacy campaign area (#20562)
* Add new sidebar billboard locations

* Remove some specs

* Remove campaign tests

* Adjust tag-allowed billboards

* Fix up targeting functionality

* Fix sidebar third render
2024-02-08 16:55:48 +00:00

72 lines
2.2 KiB
Ruby

class BillboardsController < ApplicationController
before_action :set_cache_control_headers, only: %i[show], unless: -> { current_user }
include BillboardHelper
CACHE_EXPIRY_FOR_BILLBOARDS = 3.minutes.to_i.freeze
RANDOM_USER_TAG_RANGE_MIN = 5
RANDOM_USER_TAG_RANGE_MAX = 32
def show
skip_authorization
unless session_current_user_id
set_cache_control_headers(CACHE_EXPIRY_FOR_BILLBOARDS)
if FeatureFlag.enabled?(Geolocation::FEATURE_FLAG)
add_vary_header("X-Cacheable-Client-Geo")
end
end
if placement_area
if return_test_billboard?
@billboard = Billboard.find_by(id: params[:bb_test_id])
render layout: false
return
end
if params[:username].present? && params[:slug].present?
@article = Article.find_by(slug: params[:slug])
end
@billboard = Billboard.for_display(
area: placement_area,
user_signed_in: user_signed_in?,
user_id: current_user&.id,
article: @article ? ArticleDecorator.new(@article) : nil,
user_tags: user_tags,
cookies_allowed: cookies_allowed?,
location: client_geolocation,
)
if @billboard && !session_current_user_id
set_surrogate_key_header @billboard.record_key
end
end
render layout: false
end
private
def placement_area
params[:placement_area]
end
def user_tags
return unless feed_targeted_tag_placement?(placement_area)
# We limit the tags considered for this location to a max of 32
# cached_followed_tag_names is ordered by points
# So we randomaly take from the top of the list in order to return
# higher-point tags more often for that user.
current_user&.cached_followed_tag_names&.first(rand(RANDOM_USER_TAG_RANGE_MIN..RANDOM_USER_TAG_RANGE_MAX))
end
def return_test_billboard?
param_present = params[:bb_test_placement_area] == placement_area && params[:bb_test_id].present?
present_and_admin = param_present && current_user&.any_admin?
present_and_live = param_present && Billboard.approved_and_published.where(id: params[:bb_test_id]).any?
present_and_admin || present_and_live
end
def cookies_allowed?
params[:cookies_allowed] == "true"
end
end