dawarich/app/services/users/import_data/visits.rb
2025-06-28 12:22:56 +02:00

90 lines
2.4 KiB
Ruby

# frozen_string_literal: true
class Users::ImportData::Visits
def initialize(user, visits_data)
@user = user
@visits_data = visits_data
end
def call
return 0 unless visits_data.is_a?(Array)
Rails.logger.info "Importing #{visits_data.size} visits for user: #{user.email}"
visits_created = 0
visits_data.each do |visit_data|
next unless visit_data.is_a?(Hash)
# Check if visit already exists (match by name, timestamps, and place reference)
existing_visit = find_existing_visit(visit_data)
if existing_visit
Rails.logger.debug "Visit already exists: #{visit_data['name']}"
next
end
# Create new visit
begin
visit_record = create_visit_record(visit_data)
visits_created += 1
Rails.logger.debug "Created visit: #{visit_record.name}"
rescue ActiveRecord::RecordInvalid => e
Rails.logger.error "Failed to create visit: #{e.message}"
next
end
end
Rails.logger.info "Visits import completed. Created: #{visits_created}"
visits_created
end
private
attr_reader :user, :visits_data
def find_existing_visit(visit_data)
user.visits.find_by(
name: visit_data['name'],
started_at: visit_data['started_at'],
ended_at: visit_data['ended_at']
)
end
def create_visit_record(visit_data)
visit_attributes = prepare_visit_attributes(visit_data)
user.visits.create!(visit_attributes)
end
def prepare_visit_attributes(visit_data)
attributes = visit_data.except('place_reference')
# Find and assign place if referenced
if visit_data['place_reference']
place = find_referenced_place(visit_data['place_reference'])
attributes[:place] = place if place
end
attributes
end
def find_referenced_place(place_reference)
return nil unless place_reference.is_a?(Hash)
name = place_reference['name']
latitude = place_reference['latitude'].to_f
longitude = place_reference['longitude'].to_f
# Find place by name and coordinates (global search since places are not user-specific)
place = Place.find_by(name: name) ||
Place.where("latitude = ? AND longitude = ?", latitude, longitude).first
if place
Rails.logger.debug "Found referenced place: #{name}"
else
Rails.logger.warn "Referenced place not found: #{name} (#{latitude}, #{longitude})"
end
place
end
end