diff --git a/.app_version b/.app_version index a67cebaf..59dad104 100644 --- a/.app_version +++ b/.app_version @@ -1 +1 @@ -0.21.1 +0.21.2 diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d5c2fc7..e48c4511 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +# 0.21.2 - 2024-12-25 + +### Changed + +- Imported points will now be reverse geocoded only after import is finished. + # 0.21.1 - 2024-12-24 ### Added diff --git a/app/javascript/controllers/imports_controller.js b/app/javascript/controllers/imports_controller.js index b4817c23..fd00d5c9 100644 --- a/app/javascript/controllers/imports_controller.js +++ b/app/javascript/controllers/imports_controller.js @@ -10,31 +10,20 @@ export default class extends Controller { return } - // console.log("Imports controller connected", { - // hasIndexTarget: this.hasIndexTarget, - // element: this.element, - // userId: this.element.dataset.userId - // }); this.setupSubscription(); } setupSubscription() { const userId = this.element.dataset.userId; - // console.log("Setting up subscription with userId:", userId); this.channel = consumer.subscriptions.create( { channel: "ImportsChannel" }, { connected: () => { - // console.log("Successfully connected to ImportsChannel"); - // Test that we can receive messages - // console.log("Subscription object:", this.channel); }, disconnected: () => { - // console.log("Disconnected from ImportsChannel"); }, received: (data) => { - // console.log("Received data:", data); const row = this.element.querySelector(`tr[data-import-id="${data.import.id}"]`); if (row) { diff --git a/app/models/import.rb b/app/models/import.rb index a0fbc870..f396c555 100644 --- a/app/models/import.rb +++ b/app/models/import.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class Import < ApplicationRecord - # self.ignored_columns = %w[raw_data] - belongs_to :user has_many :points, dependent: :destroy @@ -17,6 +15,10 @@ class Import < ApplicationRecord Imports::Create.new(user, self).call end + def reverse_geocoded_points_count + points.reverse_geocoded.count + end + def years_and_months_tracked points.order(:timestamp).pluck(:timestamp).map do |timestamp| time = Time.zone.at(timestamp) diff --git a/app/models/point.rb b/app/models/point.rb index bec501b4..26984c3e 100644 --- a/app/models/point.rb +++ b/app/models/point.rb @@ -33,8 +33,9 @@ class Point < ApplicationRecord Time.zone.at(timestamp) end - def async_reverse_geocode + def async_reverse_geocode(force: false) return unless REVERSE_GEOCODING_ENABLED + return if import_id.present? && !force ReverseGeocodingJob.perform_later(self.class.to_s, id) end diff --git a/app/services/imports/create.rb b/app/services/imports/create.rb index af9b0d0c..78ddf9cd 100644 --- a/app/services/imports/create.rb +++ b/app/services/imports/create.rb @@ -15,6 +15,7 @@ class Imports::Create schedule_stats_creating(user.id) schedule_visit_suggesting(user.id, import) + schedule_reverse_geocoding(user.id) rescue StandardError => e create_import_failed_notification(import, user, e) end @@ -47,6 +48,10 @@ class Imports::Create VisitSuggestingJob.perform_later(user_ids: [user_id], start_at:, end_at:) end + def schedule_reverse_geocoding(user_id) + EnqueueBackgroundJob.perform_later('continue_reverse_geocoding', user_id) + end + def create_import_finished_notification(import, user) Notifications::Create.new( user:, diff --git a/app/services/jobs/create.rb b/app/services/jobs/create.rb index ff8466be..6e301146 100644 --- a/app/services/jobs/create.rb +++ b/app/services/jobs/create.rb @@ -21,6 +21,8 @@ class Jobs::Create raise InvalidJobName, 'Invalid job name' end - points.find_each(batch_size: 1_000, &:async_reverse_geocode) + points.find_each(batch_size: 1_000) do |point| + point.async_reverse_geocode(force: true) + end end end diff --git a/app/views/imports/index.html.erb b/app/views/imports/index.html.erb index b3f8cbfc..d2ee8d30 100644 --- a/app/views/imports/index.html.erb +++ b/app/views/imports/index.html.erb @@ -41,6 +41,7 @@ Name Imported points + Reverse geocoded points Created at @@ -50,7 +51,9 @@ data-user-id="<%= current_user.id %>" > <% @imports.each do |import| %> - + <%= link_to import.name, import, class: 'underline hover:no-underline' %> (<%= import.source %>) @@ -62,6 +65,9 @@ <%= number_with_delimiter import.points_count %> + + <%= number_with_delimiter import.reverse_geocoded_points_count %> + <%= import.created_at.strftime("%d.%m.%Y, %H:%M") %> <% end %> diff --git a/spec/models/point_spec.rb b/spec/models/point_spec.rb index 12e2442a..b2e98bf2 100644 --- a/spec/models/point_spec.rb +++ b/spec/models/point_spec.rb @@ -52,6 +52,20 @@ RSpec.describe Point, type: :model do expect { point.async_reverse_geocode }.to have_enqueued_job(ReverseGeocodingJob) .with('Point', point.id) end + + context 'when point is imported' do + let(:point) { build(:point, import_id: 1) } + + it 'does not enqueue ReverseGeocodeJob' do + expect { point.async_reverse_geocode }.not_to have_enqueued_job(ReverseGeocodingJob) + end + + context 'when reverse geocoding is forced' do + it 'enqueues ReverseGeocodeJob' do + expect { point.async_reverse_geocode(force: true) }.to have_enqueued_job(ReverseGeocodingJob) + end + end + end end end end diff --git a/spec/services/imports/create_spec.rb b/spec/services/imports/create_spec.rb index 85f2131a..908eba72 100644 --- a/spec/services/imports/create_spec.rb +++ b/spec/services/imports/create_spec.rb @@ -55,6 +55,11 @@ RSpec.describe Imports::Create do expect { service.call }.to have_enqueued_job(VisitSuggestingJob) end end + + it 'schedules reverse geocoding' do + expect { service.call }.to \ + have_enqueued_job(EnqueueBackgroundJob).with('continue_reverse_geocoding', user.id) + end end context 'when import fails' do