fix leaderboard generation jobs

This commit is contained in:
Echo
2025-07-01 00:04:09 -04:00
parent 09f31758f4
commit 8aff60f04c
6 changed files with 98 additions and 10 deletions

View File

@@ -78,7 +78,16 @@ class LeaderboardsController < ApplicationController
def generate_regional_leaderboard
return nil unless current_user&.timezone_utc_offset
LeaderboardGenerator.generate_timezone_offset_leaderboard(
leaderboard = Leaderboard.where.not(finished_generating_at: nil)
.find_by(
start_date: start_date,
period_type: @period_type,
timezone_utc_offset: current_user.timezone_utc_offset,
deleted_at: nil
)
# fuck
leaderboard || LeaderboardGenerator.generate_timezone_offset_leaderboard(
start_date, current_user.timezone_utc_offset, @period_type
)
end
@@ -96,6 +105,7 @@ class LeaderboardsController < ApplicationController
leaderboard = Rails.cache.fetch(cache_key, expires_in: 1.minute) do
Leaderboard.where.not(finished_generating_at: nil)
.global
.find_by(start_date: start_date, period_type: @period_type, deleted_at: nil)
end

View File

@@ -6,15 +6,79 @@ class WarmMiniLeaderboardCacheJob < ApplicationJob
offsets.each do |offset|
begin
LeaderboardGenerator.generate_timezone_offset_leaderboard(
Date.current,
offset,
:daily
)
Rails.logger.info "Warmed mini leaderboard cache for UTC#{offset >= 0 ? '+' : ''}#{offset}"
# for some fucnking reason this shit broke now im pissed
[:daily, :weekly, :last_7_days].each do |period_type|
generate_timezone_leaderboard(offset, period_type)
end
Rails.logger.info "made leaderboard offset #{offset >= 0 ? '+' : ''}#{offset}"
rescue => e
Rails.logger.error "Failed to warm cache for UTC#{offset >= 0 ? '+' : ''}#{offset}: #{e.message}"
Rails.logger.error "didnt make leaderboard offset #{offset >= 0 ? '+' : ''}#{offset}: #{e.message}"
end
end
end
private
def generate_timezone_leaderboard(offset, period_type)
date = case period_type
when :weekly then Date.current.beginning_of_week
when :last_7_days then Date.current - 6.days
else Date.current
end
leaderboard = Leaderboard.create!(
start_date: date,
period_type: period_type,
timezone_utc_offset: offset
)
users = User.users_in_timezone_offset(offset).not_convicted
user_ids = users.pluck(:id)
return leaderboard if user_ids.empty?
date_range = case period_type
when :weekly
date.beginning_of_day...(date + 7.days).beginning_of_day
when :last_7_days
(date - 6.days).beginning_of_day...date.end_of_day
else
date.all_day
end
ActiveRecord::Base.transaction do
entries_data = Heartbeat.where(user_id: user_ids, time: date_range)
.coding_only
.with_valid_timestamps
.joins(:user)
.where.not(users: { github_uid: nil })
.group(:user_id)
.duration_seconds
entries_data = entries_data.filter { |_, total_seconds| total_seconds > 60 }
streaks = Heartbeat.daily_streaks_for_users(entries_data.keys) if entries_data.any?
entries_to_create = entries_data.map do |user_id, total_seconds|
{
leaderboard_id: leaderboard.id,
user_id: user_id,
total_seconds: total_seconds,
streak_count: streaks[user_id] || 0
}
end
LeaderboardEntry.insert_all!(entries_to_create) if entries_to_create.any?
end
leaderboard.update!(finished_generating_at: Time.current)
Leaderboard.where.not(id: leaderboard.id)
.where(start_date: date, period_type: period_type, timezone_utc_offset: offset)
.where(deleted_at: nil)
.update_all(deleted_at: Time.current)
leaderboard
end
end

View File

@@ -10,9 +10,13 @@ class Leaderboard < ApplicationRecord
enum :period_type, {
daily: 0,
weekly: 1,
last_7_days: 2
last_7_days: 2,
daily_timezone_normalized: 3
}
scope :for_timezone_offset, ->(offset) { where(timezone_utc_offset: offset) }
scope :global, -> { where(timezone_utc_offset: nil) }
def finished_generating?
finished_generating_at.present?
end

View File

@@ -42,6 +42,10 @@ Rails.application.configure do
class: "LeaderboardUpdateJob",
args: [ :last_7_days ]
},
timezone_leaderboard_refresh: {
cron: "*/5 * * * *",
class: "WarmMiniLeaderboardCacheJob"
},
# sailors_log_poll: {
# cron: "*/2 * * * *",
# class: "SailorsLogPollForChangesJob"

View File

@@ -0,0 +1,5 @@
class AddTimezoneUtcOffsetToLeaderboards < ActiveRecord::Migration[8.0]
def change
add_column :leaderboards, :timezone_utc_offset, :integer
end
end

3
db/schema.rb generated
View File

@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2025_06_30_000002) do
ActiveRecord::Schema[8.0].define(version: 2025_07_01_035652) do
create_schema "pganalyze"
# These are extensions that must be enabled in order to support this database
@@ -272,6 +272,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_06_30_000002) do
t.datetime "finished_generating_at"
t.datetime "deleted_at"
t.integer "period_type", default: 0, null: false
t.integer "timezone_utc_offset"
t.index ["start_date"], name: "index_leaderboards_on_start_date", where: "(deleted_at IS NULL)"
end