mirror of
https://github.com/Freika/dawarich.git
synced 2026-01-11 09:41:40 -05:00
90 lines
2.4 KiB
Ruby
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
|