Switch leaderboard away from using slack id

This commit is contained in:
Max Wofford
2025-03-13 17:59:11 -04:00
parent 5400849a1c
commit b447e16013
4 changed files with 10 additions and 11 deletions

View File

@@ -10,9 +10,9 @@ class LeaderboardsController < ApplicationController
.includes(:user)
.order(total_seconds: :desc)
tracked_user_ids = @leaderboard.entries.distinct.pluck(:slack_uid)
tracked_user_ids = @leaderboard.entries.distinct.pluck(:user_id)
@user_on_leaderboard = current_user && tracked_user_ids.include?(current_user.slack_uid)
@user_on_leaderboard = current_user && tracked_user_ids.include?(current_user.id)
unless @user_on_leaderboard
today = Time.current
@untracked_entries = Hackatime::Heartbeat

View File

@@ -16,11 +16,11 @@ class LeaderboardUpdateJob < ApplicationJob
leaderboard = Leaderboard.create!(start_date: parsed_date)
# Get list of valid user IDs from our database
valid_slack_uids = User.pluck(:id)
return if valid_slack_uids.empty?
valid_user_ids = User.pluck(:id)
return if valid_user_ids.empty?
ActiveRecord::Base.transaction do
valid_slack_uids.each_slice(BATCH_SIZE) do |batch_user_ids|
valid_user_ids.each_slice(BATCH_SIZE) do |batch_user_ids|
entries_data = Heartbeat.where(user_id: batch_user_ids)
.where(time: parsed_date.all_day)
.group(:user_id)
@@ -31,7 +31,7 @@ class LeaderboardUpdateJob < ApplicationJob
entries_data = entries_data.map do |user_id, total_seconds|
{
leaderboard_id: leaderboard.id,
slack_uid: User.find(user_id).slack_uid,
user_id: user_id,
total_seconds: total_seconds
}
end

View File

@@ -1,8 +1,7 @@
class LeaderboardEntry < ApplicationRecord
belongs_to :leaderboard
belongs_to :user, primary_key: :slack_uid, foreign_key: :slack_uid
belongs_to :user
validates :slack_uid, presence: true
validates :total_seconds, presence: true, numericality: { greater_than_or_equal_to: 0 }
validates :slack_uid, uniqueness: { scope: :leaderboard_id }
validates :user_id, uniqueness: { scope: :leaderboard_id }
end

View File

@@ -1,7 +1,7 @@
<%
entries = leaderboard.entries.includes(:user).order(total_seconds: :desc)
if current_user
user_rank = entries.find_index { |entry| entry.slack_uid == current_user.slack_uid }
user_rank = entries.find_index { |entry| entry.user_id == current_user.id }
if user_rank && user_rank >= 3
# Show top 2 entries and immediate competition
top_entries = entries[0..1]
@@ -25,7 +25,7 @@
<div class="leaderboard-entries">
<% mini_leaderboard_entries.each_with_index do |entry, idx| %>
<% is_competition = !show_top_entries && idx >= 2 %>
<div class="leaderboard-entry <%= 'current-user' if entry.slack_uid == current_user&.slack_uid %>">
<div class="leaderboard-entry <%= 'current-user' if entry.user_id == current_user&.id %>">
<% if !is_competition %>
<% rank_emoji = case entries.index(entry)
when 0 then "🥇"