mirror of
https://github.com/SrIzan10/hc-harbor.git
synced 2026-05-01 10:45:21 +00:00
74 lines
1.8 KiB
Ruby
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
|