From 708bca26eb1f4004b632e550392e13240e4e9188 Mon Sep 17 00:00:00 2001 From: Eugene Burmakin Date: Sun, 20 Jul 2025 17:43:55 +0200 Subject: [PATCH] Fix owntracks point creation --- CHANGELOG.md | 1 + app/jobs/owntracks/point_creating_job.rb | 2 +- app/services/own_tracks/params.rb | 6 ++ .../jobs/owntracks/point_creating_job_spec.rb | 8 +++ spec/services/own_tracks/params_spec.rb | 8 +++ swagger/v1/swagger.yaml | 69 ++++++++----------- 6 files changed, 54 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bdd02d1..21a189d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## Fixed - Swagger documentation is now valid again. +- Invalid owntracks points are now ignored. # [0.29.1] - 2025-07-02 diff --git a/app/jobs/owntracks/point_creating_job.rb b/app/jobs/owntracks/point_creating_job.rb index 5695894e..63ff6c90 100644 --- a/app/jobs/owntracks/point_creating_job.rb +++ b/app/jobs/owntracks/point_creating_job.rb @@ -8,7 +8,7 @@ class Owntracks::PointCreatingJob < ApplicationJob def perform(point_params, user_id) parsed_params = OwnTracks::Params.new(point_params).call - return if parsed_params[:timestamp].nil? || parsed_params[:lonlat].nil? + return if parsed_params.try(:[], :timestamp).nil? || parsed_params.try(:[], :lonlat).nil? return if point_exists?(parsed_params, user_id) Point.create!(parsed_params.merge(user_id:)) diff --git a/app/services/own_tracks/params.rb b/app/services/own_tracks/params.rb index 88533690..838af33a 100644 --- a/app/services/own_tracks/params.rb +++ b/app/services/own_tracks/params.rb @@ -10,6 +10,8 @@ class OwnTracks::Params # rubocop:disable Metrics/MethodLength # rubocop:disable Metrics/AbcSize def call + return unless valid_point? + { lonlat: "POINT(#{params[:lon]} #{params[:lat]})", battery: params[:batt], @@ -84,4 +86,8 @@ class OwnTracks::Params def owntracks_point? params[:topic].present? end + + def valid_point? + params[:lon].present? && params[:lat].present? && params[:tst].present? + end end diff --git a/spec/jobs/owntracks/point_creating_job_spec.rb b/spec/jobs/owntracks/point_creating_job_spec.rb index 3607bc7b..ae8d49fb 100644 --- a/spec/jobs/owntracks/point_creating_job_spec.rb +++ b/spec/jobs/owntracks/point_creating_job_spec.rb @@ -28,5 +28,13 @@ RSpec.describe Owntracks::PointCreatingJob, type: :job do expect { perform }.not_to(change { Point.count }) end end + + context 'when point is invalid' do + let(:point_params) { { lat: 1.0, lon: 1.0, tid: 'test', tst: nil, topic: 'iPhone 12 pro' } } + + it 'does not create a point' do + expect { perform }.not_to(change { Point.count }) + end + end end end diff --git a/spec/services/own_tracks/params_spec.rb b/spec/services/own_tracks/params_spec.rb index d08f5b30..9bea14cc 100644 --- a/spec/services/own_tracks/params_spec.rb +++ b/spec/services/own_tracks/params_spec.rb @@ -185,5 +185,13 @@ RSpec.describe OwnTracks::Params do expect(params[:trigger]).to eq('unknown') end end + + context 'when point is invalid' do + let(:raw_point_params) { super().merge(lon: nil, lat: nil, tst: nil) } + + it 'returns parsed params' do + expect(params).to eq(nil) + end + end end end diff --git a/swagger/v1/swagger.yaml b/swagger/v1/swagger.yaml index 7a65546f..bc25a57d 100644 --- a/swagger/v1/swagger.yaml +++ b/swagger/v1/swagger.yaml @@ -1059,18 +1059,14 @@ paths: type: string example: your-photoprism-api-key description: API key for PhotoPrism photo service - maps: - type: object - properties: - distance_unit: - type: string - example: km - description: Distance unit preference (km or miles) - description: Map-related settings - visits_suggestions_enabled: - type: boolean - example: true - description: Whether visit suggestions are enabled + speed_color_scale: + type: string + example: viridis + description: Color scale for speed-colored routes + fog_of_war_threshold: + type: number + example: 100 + description: Fog of war threshold value examples: '0': summary: Updates user settings @@ -1090,9 +1086,8 @@ paths: immich_api_key: your-immich-api-key photoprism_url: https://photoprism.example.com photoprism_api_key: your-photoprism-api-key - maps: - distance_unit: km - visits_suggestions_enabled: true + speed_color_scale: viridis + fog_of_war_threshold: 100 get: summary: Retrieves user settings tags: @@ -1116,28 +1111,28 @@ paths: type: object properties: route_opacity: - type: string - example: '60' + type: number + example: 60 description: Route opacity percentage (0-100) meters_between_routes: - type: string - example: '500' + type: number + example: 500 description: Minimum distance between routes in meters minutes_between_routes: - type: string - example: '30' + type: number + example: 30 description: Minimum time between routes in minutes fog_of_war_meters: - type: string - example: '50' + type: number + example: 50 description: Fog of war radius in meters time_threshold_minutes: - type: string - example: '30' + type: number + example: 30 description: Time threshold for grouping points in minutes merge_threshold_minutes: - type: string - example: '15' + type: number + example: 15 description: Threshold for merging nearby points in minutes preferred_map_layer: type: string @@ -1172,18 +1167,14 @@ paths: type: string example: your-photoprism-api-key description: API key for PhotoPrism photo service - maps: - type: object - properties: - distance_unit: - type: string - example: km - description: Distance unit preference (km or miles) - description: Map-related settings - visits_suggestions_enabled: - type: boolean - example: true - description: Whether visit suggestions are enabled + speed_color_scale: + type: string + example: viridis + description: Color scale for speed-colored routes + fog_of_war_threshold: + type: number + example: 100 + description: Fog of war threshold value "/api/v1/stats": get: summary: Retrieves all stats