mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-10 01:01:39 -05:00
78 lines
2.4 KiB
Ruby
78 lines
2.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Tracks
|
|
class Generator
|
|
include Tracks::Segmentation
|
|
include Tracks::TrackBuilder
|
|
|
|
attr_reader :user, :point_loader, :incomplete_segment_handler, :track_cleaner
|
|
|
|
def initialize(user, point_loader:, incomplete_segment_handler:, track_cleaner:)
|
|
@user = user
|
|
@point_loader = point_loader
|
|
@incomplete_segment_handler = incomplete_segment_handler
|
|
@track_cleaner = track_cleaner
|
|
end
|
|
|
|
def call
|
|
Rails.logger.info "Starting track generation for user #{user.id}"
|
|
|
|
tracks_created = 0
|
|
|
|
Point.transaction do
|
|
# Clean up existing tracks if needed
|
|
track_cleaner.cleanup_if_needed
|
|
|
|
# Load points using the configured strategy
|
|
points = point_loader.load_points
|
|
|
|
if points.empty?
|
|
Rails.logger.info "No points to process for user #{user.id}"
|
|
return 0
|
|
end
|
|
|
|
Rails.logger.info "Processing #{points.size} points for user #{user.id}"
|
|
|
|
# Apply segmentation logic
|
|
segments = split_points_into_segments(points)
|
|
|
|
Rails.logger.info "Created #{segments.size} segments for user #{user.id}"
|
|
|
|
# Process each segment
|
|
segments.each do |segment_points|
|
|
next if segment_points.size < 2
|
|
|
|
if incomplete_segment_handler.should_finalize_segment?(segment_points)
|
|
# Create track from finalized segment
|
|
track = create_track_from_points(segment_points)
|
|
if track&.persisted?
|
|
tracks_created += 1
|
|
Rails.logger.debug "Created track #{track.id} with #{segment_points.size} points"
|
|
end
|
|
else
|
|
# Handle incomplete segment according to strategy
|
|
incomplete_segment_handler.handle_incomplete_segment(segment_points)
|
|
Rails.logger.debug "Stored #{segment_points.size} points as incomplete segment"
|
|
end
|
|
end
|
|
|
|
# Cleanup any processed buffered data
|
|
incomplete_segment_handler.cleanup_processed_data
|
|
end
|
|
|
|
Rails.logger.info "Completed track generation for user #{user.id}: #{tracks_created} tracks created"
|
|
tracks_created
|
|
end
|
|
|
|
private
|
|
|
|
# Required by Tracks::Segmentation module
|
|
def distance_threshold_meters
|
|
@distance_threshold_meters ||= user.safe_settings.meters_between_routes.to_i || 500
|
|
end
|
|
|
|
def time_threshold_minutes
|
|
@time_threshold_minutes ||= user.safe_settings.minutes_between_routes.to_i || 60
|
|
end
|
|
end
|
|
end
|