mirror of
https://github.com/SrIzan10/hc-harbor.git
synced 2026-05-01 10:45:21 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user