2025-07-12 17:04:15 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
|
|
module Tracks
|
|
|
|
|
class BulkTrackCreator
|
|
|
|
|
def initialize(start_at: nil, end_at: 1.day.ago.end_of_day, user_ids: [])
|
2025-07-12 17:45:43 -04:00
|
|
|
@start_at = start_at&.to_datetime
|
|
|
|
|
@end_at = end_at&.to_datetime
|
2025-07-12 17:04:15 -04:00
|
|
|
@user_ids = user_ids
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def call
|
|
|
|
|
users.find_each do |user|
|
|
|
|
|
next if user.tracked_points.empty?
|
|
|
|
|
|
2025-07-12 17:45:43 -04:00
|
|
|
user_start_at = start_at || start_time(user)
|
2025-07-12 17:04:15 -04:00
|
|
|
|
2025-07-12 17:45:43 -04:00
|
|
|
next unless user.tracked_points.where(timestamp: user_start_at.to_i..end_at.to_i).exists?
|
2025-07-12 17:04:15 -04:00
|
|
|
|
2025-07-12 17:45:43 -04:00
|
|
|
Tracks::CreateJob.perform_later(
|
|
|
|
|
user.id,
|
|
|
|
|
start_at: user_start_at,
|
|
|
|
|
end_at:,
|
|
|
|
|
cleaning_strategy: :daily
|
|
|
|
|
)
|
2025-07-12 17:04:15 -04:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
2025-07-12 17:45:43 -04:00
|
|
|
attr_reader :start_at, :end_at, :user_ids
|
|
|
|
|
|
2025-07-12 17:04:15 -04:00
|
|
|
def users
|
2025-07-12 17:45:43 -04:00
|
|
|
user_ids.any? ? User.active.where(id: user_ids) : User.active
|
2025-07-12 17:04:15 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def start_time(user)
|
|
|
|
|
latest_track = user.tracks.order(end_at: :desc).first
|
2025-07-12 17:45:43 -04:00
|
|
|
|
2025-07-12 17:04:15 -04:00
|
|
|
if latest_track
|
|
|
|
|
latest_track.end_at
|
|
|
|
|
else
|
|
|
|
|
oldest_point = user.tracked_points.order(:timestamp).first
|
|
|
|
|
oldest_point ? Time.zone.at(oldest_point.timestamp) : 1.day.ago.beginning_of_day
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|