From f3b98ac83dadce8c33078037e786f81675221b83 Mon Sep 17 00:00:00 2001 From: Eugene Burmakin Date: Sun, 23 Mar 2025 19:00:04 +0100 Subject: [PATCH] Use attached import file to import own tracks data --- app/services/gpx/track_importer.rb | 2 +- app/services/own_tracks/importer.rb | 25 +++++++++++++---------- app/services/own_tracks/rec_parser.rb | 7 ++----- spec/factories/imports.rb | 3 +-- spec/services/own_tracks/importer_spec.rb | 8 +++++++- 5 files changed, 25 insertions(+), 20 deletions(-) diff --git a/app/services/gpx/track_importer.rb b/app/services/gpx/track_importer.rb index ee2c7338..9abd1a56 100644 --- a/app/services/gpx/track_importer.rb +++ b/app/services/gpx/track_importer.rb @@ -11,7 +11,7 @@ class Gpx::TrackImporter end def call - import.file.open do |file| + import.file.download do |file| json = Hash.from_xml(file) tracks = json['gpx']['trk'] diff --git a/app/services/own_tracks/importer.rb b/app/services/own_tracks/importer.rb index 20dbc706..75cd88ab 100644 --- a/app/services/own_tracks/importer.rb +++ b/app/services/own_tracks/importer.rb @@ -3,25 +3,28 @@ class OwnTracks::Importer include Imports::Broadcaster - attr_reader :import, :data, :user_id + attr_reader :import, :user_id def initialize(import, user_id) @import = import - @data = import.raw_data @user_id = user_id end def call - points_data = data.map.with_index(1) do |point, index| - OwnTracks::Params.new(point).call.merge( - import_id: import.id, - user_id: user_id, - created_at: Time.current, - updated_at: Time.current - ) - end + import.file.download do |file| + parsed_data = OwnTracks::RecParser.new(file).call - bulk_insert_points(points_data) + points_data = parsed_data.map do |point| + OwnTracks::Params.new(point).call.merge( + import_id: import.id, + user_id: user_id, + created_at: Time.current, + updated_at: Time.current + ) + end + + bulk_insert_points(points_data) + end end private diff --git a/app/services/own_tracks/rec_parser.rb b/app/services/own_tracks/rec_parser.rb index 7e502263..7e3550af 100644 --- a/app/services/own_tracks/rec_parser.rb +++ b/app/services/own_tracks/rec_parser.rb @@ -10,11 +10,8 @@ class OwnTracks::RecParser def call file.split("\n").map do |line| parts = line.split("\t") - if parts.size > 2 && parts[1].strip == '*' - JSON.parse(parts[2]) - else - nil - end + + Oj.load(parts[2]) if parts.size > 2 && parts[1].strip == '*' end.compact end end diff --git a/spec/factories/imports.rb b/spec/factories/imports.rb index 05be1e9f..07dec894 100644 --- a/spec/factories/imports.rb +++ b/spec/factories/imports.rb @@ -3,8 +3,7 @@ FactoryBot.define do factory :import do user - name { 'MARCH_2024.json' } + name { 'owntracks_export.json' } source { Import.sources[:owntracks] } - raw_data { OwnTracks::RecParser.new(File.read('spec/fixtures/files/owntracks/2024-03.rec')).call } end end diff --git a/spec/services/own_tracks/importer_spec.rb b/spec/services/own_tracks/importer_spec.rb index 2e3e16e9..0800d0b8 100644 --- a/spec/services/own_tracks/importer_spec.rb +++ b/spec/services/own_tracks/importer_spec.rb @@ -7,7 +7,13 @@ RSpec.describe OwnTracks::Importer do subject(:parser) { described_class.new(import, user.id).call } let(:user) { create(:user) } - let(:import) { create(:import, user:, name: 'owntracks_export.json') } + let(:import) { create(:import, user:, name: '2024-03.rec') } + let(:file_path) { Rails.root.join('spec/fixtures/files/owntracks/2024-03.rec') } + let(:file) { Rack::Test::UploadedFile.new(file_path, 'text/plain') } + + before do + import.file.attach(io: File.open(file_path), filename: '2024-03.rec', content_type: 'text/plain') + end context 'when file exists' do it 'creates points' do