bug fixes (#630)

* fix on old repos

* clean up broken leaderboards

* Update app/jobs/sync_repo_metadata_job.rb

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* remove broken lb logic

* Update db/migrate/20251116045400_clean_up_weekly_leaderboards.rb

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Echo
2025-11-16 00:23:42 -05:00
committed by GitHub
parent f728c4de25
commit 810f09828c
6 changed files with 244 additions and 313 deletions

View File

@@ -12,73 +12,34 @@ class LeaderboardUpdateJob < ApplicationJob
def perform(period = :daily, date = Date.current, force_update: false)
date = LeaderboardDateRange.normalize_date(date, period)
# global
build_leaderboard(date, period, nil, nil, force_update)
# Build timezone leaderboards
range = LeaderboardDateRange.calculate(date, period)
timezones_for_users_in(range).each do |timezone|
offset = User.timezone_to_utc_offset(timezone)
build_leaderboard(date, period, offset, timezone, force_update)
end
build_leaderboard(date, period, force_update)
end
private
def timezones_for_users_in(range)
# Expand range by 1 day in both directions to catch users in all timezones
expanded_range = (range.begin - 1.day)...(range.end + 1.day)
User.joins(:heartbeats)
.where(heartbeats: { time: expanded_range })
.where.not(timezone: nil)
.distinct
.pluck(:timezone)
.compact
end
def build_leaderboard(date, period, timezone_offset = nil, timezone = nil, force_update = false)
def build_leaderboard(date, period, force_update = false)
board = ::Leaderboard.find_or_create_by!(
start_date: date,
period_type: period,
timezone_utc_offset: timezone_offset
timezone_utc_offset: nil
)
return board if board.finished_generating_at.present? && !force_update
if timezone_offset
Rails.logger.info "Building timezone leaderboard for #{timezone} (UTC#{timezone_offset >= 0 ? '+' : ''}#{timezone_offset})"
else
Rails.logger.info "Building global leaderboard"
end
Rails.logger.info "Building leaderboard for #{period} on #{date}"
# Calculate timezone-aware range
range = if timezone
Time.use_zone(timezone) { LeaderboardDateRange.calculate(date, period) }
else
LeaderboardDateRange.calculate(date, period)
end
range = LeaderboardDateRange.calculate(date, period)
ActiveRecord::Base.transaction do
board.entries.delete_all
# Build the base heartbeat query
heartbeat_query = Heartbeat.where(time: range)
.with_valid_timestamps
.joins(:user)
.coding_only
.where.not(users: { github_uid: nil })
.where.not(users: { trust_level: User.trust_levels[:red] })
# Filter by timezone if specified
if timezone_offset
users_in_tz = User.users_in_timezone_offset(timezone_offset).not_convicted
user_ids = users_in_tz.pluck(:id)
return board if user_ids.empty?
heartbeat_query = heartbeat_query.where(user_id: user_ids)
end
.with_valid_timestamps
.joins(:user)
.coding_only
.where.not(users: { github_uid: nil })
.where.not(users: { trust_level: User.trust_levels[:red] })
data = heartbeat_query.group(:user_id).duration_seconds
.filter { |_, seconds| seconds > 60 }
@@ -101,13 +62,10 @@ class LeaderboardUpdateJob < ApplicationJob
end
# Cache the board
cache_key = timezone_offset ?
LeaderboardCache.timezone_key(timezone_offset, date, period) :
LeaderboardCache.global_key(period, date)
cache_key = LeaderboardCache.global_key(period, date)
LeaderboardCache.write(cache_key, board)
Rails.logger.debug "Persisted #{timezone_offset ? 'timezone' : 'global'} leaderboard with #{board.entries.count} entries"
Rails.logger.debug "Persisted leaderboard for #{period} with #{board.entries.count} entries"
board
end

View File

@@ -16,11 +16,6 @@ class SyncRepoMetadataJob < ApplicationJob
return unless user
service = RepoHost::ServiceFactory.for_url(user, repository.url)
unless service
Rails.logger.info "[SyncRepoMetadataJob] Unsupported repository host for #{repository.url}"
return
end
metadata = service.fetch_repo_metadata
if metadata
@@ -29,6 +24,12 @@ class SyncRepoMetadataJob < ApplicationJob
else
Rails.logger.warn "[SyncRepoMetadataJob] No metadata returned for #{repository.url}"
end
rescue ArgumentError => e
if e.message.include?("Unsupported repository host")
Rails.logger.debug "[SyncRepoMetadataJob] Skipping unsupported host: #{repository.url}"
else
raise
end
rescue => e
Rails.logger.error "[SyncRepoMetadataJob] Unexpected error: #{e.message}"
raise # Retry for other errors

View File

@@ -1,46 +1,14 @@
class LeaderboardService
include TimezoneRegions
def self.get(period: :daily, date: Date.current, offset: nil)
new.get(period: period, date: date, offset: offset)
def self.get(period: :daily, date: Date.current)
new.get(period: period, date: date)
end
def get(period: :daily, date: Date.current, offset: nil)
def get(period: :daily, date: Date.current)
date = Date.current if date.blank?
if offset.present?
get_timezone(date, period, offset)
else
get_global(date, period)
end
end
private
def get_timezone(date, period, offset)
date = LeaderboardDateRange.normalize_date(date, period)
key = LeaderboardCache.timezone_key(offset, date, period)
board = LeaderboardCache.read(key)
return board if board.present?
board = ::Leaderboard.where.not(finished_generating_at: nil)
.find_by(start_date: date, period_type: period, timezone_utc_offset: offset, deleted_at: nil)
if board.present?
LeaderboardCache.write(key, board)
return board
end
::LeaderboardUpdateJob.perform_later(period, date)
get_global(date, period)
end
def get_global(date, period)
date = LeaderboardDateRange.normalize_date(date, period)
key = LeaderboardCache.global_key(period, date)
board = LeaderboardCache.read(key)
return board if board.present?
board = ::Leaderboard.where.not(finished_generating_at: nil)