Files
archived-hc-harbor/app/controllers/leaderboards_controller.rb
Echo 4466d8d820 leaderboards rework (#623)
* rolling leaderboards

* use actual deletions over soft deletes
2025-11-15 17:34:13 -05:00

74 lines
1.8 KiB
Ruby

class LeaderboardsController < ApplicationController
def index
set_params
@leaderboard = find_or_generate_leaderboard
if @leaderboard.nil?
flash.now[:notice] = "Leaderboard is being updated..."
else
load_entries_and_metadata
end
end
private
def set_params
@period_type = validated_period_type
end
def validated_period_type
period = (params[:period_type] || "daily").to_sym
valid_periods = [ :daily, :last_7_days ]
valid_periods.include?(period) ? period : :daily
end
def find_or_generate_leaderboard
LeaderboardService.get(
period: @period_type,
date: start_date
)
end
def start_date
@start_date ||= case @period_type
when :last_7_days then Date.current
else Date.current
end
end
def load_entries_and_metadata
@entries = @leaderboard.entries
if @leaderboard.persisted?
@entries = @entries.includes(:user).order(total_seconds: :desc)
load_user_tracking_data
end
@active_projects = Cache::ActiveProjectsJob.perform_now
end
def load_user_tracking_data
tracked_user_ids = @leaderboard.entries.distinct.pluck(:user_id)
@user_on_leaderboard = current_user && tracked_user_ids.include?(current_user.id)
unless @user_on_leaderboard
@untracked_entries = calculate_untracked_entries(tracked_user_ids)
end
end
def calculate_untracked_entries(tracked_user_ids)
time_range = case @period_type
when :last_7_days
((Date.current - 6.days).beginning_of_day...Date.current.end_of_day)
else
Date.current.all_day
end
Hackatime::Heartbeat.where(time: time_range)
.distinct
.pluck(:user_id)
.count { |user_id| !tracked_user_ids.include?(user_id) }
end
end