docbrown/app/controllers/page_views_controller.rb

40 lines
1.6 KiB
Ruby

class PageViewsController < ApplicationMetalController
# ApplicationMetalController because we do not need all bells and whistles of ApplicationController.
# It should help performance.
include ActionController::Head
# Each time we have a non-authenticated visitor, we have a 10% chance that we will record that
# specific impression as a page view. When we do record that specific impression as a page view,
# we want to give credit for all likely page views that we didn't record (e.g., the 90% or so).
#
# @note Yes, this is a very verbose constant name. Apologies, don't type it. But I [@jeremyf]
# want it here to explain a magic number.
#
# @see https://github.com/forem/forem/blob/main/app/assets/javascripts/initializers/initializeBaseTracking.js.erb#L113-L117
# @see https://github.com/forem/forem/pull/12686#discussion_r577271589 for further discussion.
VISITOR_IMPRESSIONS_AGGREGATE_COUNTS_FOR_NUMBER_OF_VIEWS = 10
def create
page_view_create_params = params.slice(:article_id, :referrer, :user_agent)
if session_current_user_id
page_view_create_params[:user_id] = session_current_user_id
else
page_view_create_params[:counts_for_number_of_views] = VISITOR_IMPRESSIONS_AGGREGATE_COUNTS_FOR_NUMBER_OF_VIEWS
end
Articles::UpdatePageViewsWorker.perform_at(
2.minutes.from_now,
page_view_create_params,
)
head :ok
end
def update
if session_current_user_id
Articles::PageViewUpdater.call(article_id: params[:id], user_id: session_current_user_id)
end
head :ok
end
end