dawarich/app/services/users/import_data/places.rb

101 lines
2.3 KiB
Ruby
Raw Normal View History

2025-06-28 06:22:56 -04:00
# frozen_string_literal: true
class Users::ImportData::Places
BATCH_SIZE = 5000
2025-10-05 14:59:03 -04:00
def initialize(user, places_data = nil, batch_size: BATCH_SIZE, logger: Rails.logger)
2025-06-28 06:22:56 -04:00
@user = user
@places_data = places_data
2025-10-05 14:59:03 -04:00
@batch_size = batch_size
@logger = logger
@buffer = []
@created = 0
2025-06-28 06:22:56 -04:00
end
def call
2025-10-05 14:59:03 -04:00
return 0 unless places_data.respond_to?(:each)
2025-06-28 06:22:56 -04:00
2025-10-05 14:59:03 -04:00
enumerate(places_data) do |place_data|
add(place_data)
end
2025-06-28 06:22:56 -04:00
2025-10-05 14:59:03 -04:00
finalize
end
2025-06-28 06:22:56 -04:00
2025-10-05 14:59:03 -04:00
def add(place_data)
return unless place_data.is_a?(Hash)
2025-06-28 06:22:56 -04:00
2025-10-05 14:59:03 -04:00
@buffer << place_data
flush_batch if @buffer.size >= batch_size
end
def finalize
flush_batch
logger.info "Places import completed. Created: #{@created}"
@created
2025-06-28 06:22:56 -04:00
end
private
2025-10-05 14:59:03 -04:00
attr_reader :user, :places_data, :batch_size, :logger
def enumerate(collection, &block)
collection.each(&block)
2025-10-05 14:59:03 -04:00
end
def collection_description(collection)
return collection.size if collection.respond_to?(:size)
'streamed'
end
def flush_batch
return if @buffer.empty?
logger.debug "Processing places batch of #{@buffer.size}"
@buffer.each do |place_data|
place = find_or_create_place_for_import(place_data)
@created += 1 if place&.respond_to?(:previously_new_record?) && place.previously_new_record?
end
@buffer.clear
end
2025-06-28 06:22:56 -04:00
2025-07-02 14:22:40 -04:00
def find_or_create_place_for_import(place_data)
2025-06-28 06:22:56 -04:00
name = place_data['name']
latitude = place_data['latitude']&.to_f
longitude = place_data['longitude']&.to_f
unless name.present? && latitude.present? && longitude.present?
return nil
end
2025-07-02 14:22:40 -04:00
existing_place = Place.where(
name: name,
latitude: latitude,
0.36.0 (#1952) * Implement OmniAuth GitHub authentication * Fix omniauth GitHub scope to include user email access * Remove margin-bottom * Implement Google OAuth2 authentication * Implement OIDC authentication for Dawarich using omniauth_openid_connect gem. * Add patreon account linking and patron checking service * Update docker-compose.yml to use boolean values instead of strings * Add support for KML files * Add tests * Update changelog * Remove patreon OAuth integration * Move omniauthable to a concern * Update an icon in integrations * Update changelog * Update app version * Fix family location sharing toggle * Move family location sharing to its own controller * Update changelog * Implement basic tagging functionality for places, allowing users to categorize and label places with custom tags. * Add places management API and tags feature * Add some changes related to places management feature * Fix some tests * Fix sometests * Add places layer * Update places layer to use Leaflet.Control.Layers.Tree for hierarchical layer control * Rework tag form * Add hashtag * Add privacy zones to tags * Add notes to places and manage place tags * Update changelog * Update e2e tests * Extract tag serializer to its own file * Fix some tests * Fix tags request specs * Fix some tests * Fix rest of the tests * Revert some changes * Add missing specs * Revert changes in place export/import code * Fix some specs * Fix PlaceFinder to only consider global places when finding existing places * Fix few more specs * Fix visits creator spec * Fix last tests * Update place creating modal * Add home location based on "Home" tagged place * Save enabled tag layers * Some fixes * Fix bug where enabling place tag layers would trigger saving enabled layers, overwriting with incomplete data * Update migration to use disable_ddl_transaction! and add up/down methods * Fix tag layers restoration and filtering logic * Update OIDC auto-registration and email/password registration settings * Fix potential xss
2025-11-24 13:45:09 -05:00
longitude: longitude,
user_id: nil
2025-07-02 14:22:40 -04:00
).first
2025-06-28 06:22:56 -04:00
if existing_place
existing_place.define_singleton_method(:previously_new_record?) { false }
return existing_place
end
place_attributes = place_data.except('created_at', 'updated_at', 'latitude', 'longitude')
place_attributes['lonlat'] = "POINT(#{longitude} #{latitude})"
place_attributes['latitude'] = latitude
place_attributes['longitude'] = longitude
place_attributes.delete('user')
begin
place = Place.create!(place_attributes)
place.define_singleton_method(:previously_new_record?) { true }
place
rescue ActiveRecord::RecordInvalid => e
nil
end
end
end