dawarich/app/services/maps/hexagon_request_handler.rb

62 lines
1.7 KiB
Ruby
Raw Normal View History

2025-09-16 14:41:53 -04:00
# frozen_string_literal: true
module Maps
class HexagonRequestHandler
def self.call(params:, current_api_user: nil)
new(params: params, current_api_user: current_api_user).call
end
def initialize(params:, current_api_user: nil)
@params = params
@current_api_user = current_api_user
end
def call
context = resolve_context
# Try to use pre-calculated hexagon centers first
if context[:stat]
cached_result = Maps::HexagonCenterManager.call(
stat: context[:stat],
target_user: context[:target_user]
)
return cached_result[:data] if cached_result&.dig(:success)
end
# Fall back to on-the-fly calculation
Rails.logger.debug 'No pre-calculated data available, calculating hexagons on-the-fly'
generate_hexagons_on_the_fly(context)
end
private
attr_reader :params, :current_api_user
def resolve_context
Maps::HexagonContextResolver.call(
params: params,
current_api_user: current_api_user
)
end
def generate_hexagons_on_the_fly(context)
hexagon_params = build_hexagon_params(context)
result = Maps::HexagonGrid.new(hexagon_params).call
Rails.logger.debug "Hexagon service result: #{result['features']&.count || 0} features"
result
end
def build_hexagon_params(context)
bbox_params.merge(
user_id: context[:target_user]&.id,
start_date: context[:start_date],
end_date: context[:end_date]
)
end
def bbox_params
params.permit(:min_lon, :min_lat, :max_lon, :max_lat, :hex_size, :viewport_width, :viewport_height)
end
end
end