2025-12-06 14:54:49 -05:00
|
|
|
import { pointsToGeoJSON } from 'maps_maplibre/utils/geojson_transformers'
|
|
|
|
|
import { RoutesLayer } from 'maps_maplibre/layers/routes_layer'
|
|
|
|
|
import { createCircle } from 'maps_maplibre/utils/geometry'
|
|
|
|
|
import { performanceMonitor } from 'maps_maplibre/utils/performance_monitor'
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Handles loading and transforming data from API
|
|
|
|
|
*/
|
|
|
|
|
export class DataLoader {
|
2025-12-14 06:05:59 -05:00
|
|
|
constructor(api, apiKey, settings = {}) {
|
2025-12-06 14:54:49 -05:00
|
|
|
this.api = api
|
|
|
|
|
this.apiKey = apiKey
|
2025-12-14 06:05:59 -05:00
|
|
|
this.settings = settings
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Update settings (called when user changes settings)
|
|
|
|
|
*/
|
|
|
|
|
updateSettings(settings) {
|
|
|
|
|
this.settings = settings
|
2025-12-06 14:54:49 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Fetch all map data (points, visits, photos, areas, tracks)
|
|
|
|
|
*/
|
|
|
|
|
async fetchMapData(startDate, endDate, onProgress) {
|
|
|
|
|
const data = {}
|
|
|
|
|
|
|
|
|
|
// Fetch points
|
|
|
|
|
performanceMonitor.mark('fetch-points')
|
|
|
|
|
data.points = await this.api.fetchAllPoints({
|
|
|
|
|
start_at: startDate,
|
|
|
|
|
end_at: endDate,
|
|
|
|
|
onProgress: onProgress
|
|
|
|
|
})
|
|
|
|
|
performanceMonitor.measure('fetch-points')
|
|
|
|
|
|
|
|
|
|
// Transform points to GeoJSON
|
|
|
|
|
performanceMonitor.mark('transform-geojson')
|
|
|
|
|
data.pointsGeoJSON = pointsToGeoJSON(data.points)
|
2025-12-14 06:05:59 -05:00
|
|
|
data.routesGeoJSON = RoutesLayer.pointsToRoutes(data.points, {
|
|
|
|
|
distanceThresholdMeters: this.settings.metersBetweenRoutes || 1000,
|
|
|
|
|
timeThresholdMinutes: this.settings.minutesBetweenRoutes || 60
|
|
|
|
|
})
|
2025-12-06 14:54:49 -05:00
|
|
|
performanceMonitor.measure('transform-geojson')
|
|
|
|
|
|
|
|
|
|
// Fetch visits
|
|
|
|
|
try {
|
|
|
|
|
data.visits = await this.api.fetchVisits({
|
|
|
|
|
start_at: startDate,
|
|
|
|
|
end_at: endDate
|
|
|
|
|
})
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.warn('Failed to fetch visits:', error)
|
|
|
|
|
data.visits = []
|
|
|
|
|
}
|
|
|
|
|
data.visitsGeoJSON = this.visitsToGeoJSON(data.visits)
|
|
|
|
|
|
0.37.2 (#2114)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
* Pull only necessary data for map v2 points
* Feature/raw data archive (#2009)
* 0.36.2 (#2007)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Remove esbuild scripts from package.json
* Remove sideEffects field from package.json
* Raw data archivation
* Add tests
* Fix tests
* Fix tests
* Update ExceptionReporter
* Add schedule to run raw data archival job monthly
* Change file structure for raw data archival feature
* Update changelog and version for raw data archival feature
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Set raw_data to an empty hash instead of nil when archiving
* Fix storage configuration and file extraction
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation (#2018)
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation
* Remove raw data from visited cities api endpoint
* Use user timezone to show dates on maps (#2020)
* Fix/pre epoch time (#2019)
* Use user timezone to show dates on maps
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Fix tests failing due to new index on stats table
* Fix failing specs
* Update redis client configuration to support unix socket connection
* Update changelog
* Fix kml kmz import issues (#2023)
* Fix kml kmz import issues
* Refactor KML importer to improve readability and maintainability
* Implement moving points in map v2 and fix route rendering logic to ma… (#2027)
* Implement moving points in map v2 and fix route rendering logic to match map v1.
* Fix route spec
* fix(maplibre): update date format to ISO 8601 (#2029)
* Add verification step to raw data archival process (#2028)
* Add verification step to raw data archival process
* Add actual verification of raw data archives after creation, and only clear raw_data for verified archives.
* Fix failing specs
* Eliminate zip-bomb risk
* Fix potential memory leak in js
* Return .keep files
* Use Toast instead of alert for notifications
* Add help section to navbar dropdown
* Update changelog
* Remove raw_data_archival_job
* Ensure file is being closed properly after reading in Archivable concern
* Add composite index to stats table if not exists
* Update changelog
* Update entrypoint to always sync static assets (not only new ones)
* Add family layer to MapLibre maps (#2055)
* Add family layer to MapLibre maps
* Update migration
* Don't show family toggle if feature is disabled
* Update changelog
* Return changelog
* Update changelog
* Update tailwind file
* Bump sentry-rails from 6.0.0 to 6.1.0 (#1945)
Bumps [sentry-rails](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-ruby/compare/6.0.0...6.1.0)
---
updated-dependencies:
- dependency-name: sentry-rails
dependency-version: 6.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump turbo-rails from 2.0.17 to 2.0.20 (#1944)
Bumps [turbo-rails](https://github.com/hotwired/turbo-rails) from 2.0.17 to 2.0.20.
- [Release notes](https://github.com/hotwired/turbo-rails/releases)
- [Commits](https://github.com/hotwired/turbo-rails/compare/v2.0.17...v2.0.20)
---
updated-dependencies:
- dependency-name: turbo-rails
dependency-version: 2.0.20
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump webmock from 3.25.1 to 3.26.1 (#1943)
Bumps [webmock](https://github.com/bblimke/webmock) from 3.25.1 to 3.26.1.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.25.1...v3.26.1)
---
updated-dependencies:
- dependency-name: webmock
dependency-version: 3.26.1
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump brakeman from 7.1.0 to 7.1.1 (#1942)
Bumps [brakeman](https://github.com/presidentbeef/brakeman) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/presidentbeef/brakeman/releases)
- [Changelog](https://github.com/presidentbeef/brakeman/blob/main/CHANGES.md)
- [Commits](https://github.com/presidentbeef/brakeman/compare/v7.1.0...v7.1.1)
---
updated-dependencies:
- dependency-name: brakeman
dependency-version: 7.1.1
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump redis from 5.4.0 to 5.4.1 (#1941)
Bumps [redis](https://github.com/redis/redis-rb) from 5.4.0 to 5.4.1.
- [Changelog](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/redis/redis-rb/compare/v5.4.0...v5.4.1)
---
updated-dependencies:
- dependency-name: redis
dependency-version: 5.4.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Put import deletion into background job (#2045)
* Put import deletion into background job
* Update changelog
* fix null type error and update heatmap styling (#2037)
* fix: use constant weight for maplibre heatmap layer
* fix null type, update heatmap styling
* improve heatmap styling
* fix typo
* Fix stats calculation to recursively reduce H3 resolution when too ma… (#2065)
* Fix stats calculation to recursively reduce H3 resolution when too many hexagons are generated
* Update CHANGELOG.md
* Validate trip start and end dates (#2066)
* Validate trip start and end dates
* Update changelog
* Update migration to clean up duplicate stats before adding unique index
* Fix fog of war radius setting being ignored and applying settings causing errors (#2068)
* Update changelog
* Add Rack::Deflater middleware to config/application.rb to enable gzip compression for responses.
* Add composite index to points on user_id and timestamp
* Deduplicte points based on timestamp brought to unix time
* Fix/stats cache invalidation (#2072)
* Fix family layer toggle in Map v2 settings for non-selfhosted env
* Invalidate cache
* Remove comments
* Remove comment
* Add new indicies to improve performance and remove unused ones to opt… (#2078)
* Add new indicies to improve performance and remove unused ones to optimize database.
* Remove comments
* Update map search suggestions panel styling
* Add yearly digest (#2073)
* Add yearly digest
* Rename YearlyDigests to Users::Digests
* Minor changes
* Update yearly digest layout and styles
* Add flags and chart to email
* Update colors
* Fix layout of stats in yearly digest view
* Remove cron job for yearly digest scheduling
* Update CHANGELOG.md
* Update digest email setting handling
* Allow sharing digest for 1 week or 1 month
* Change Digests Distance to Bigint
* Fix settings page
* Update changelog
* Add RailsPulse (#2079)
* Add RailsPulse
* Add RailsPulse monitoring tool with basic HTTP authentication
* Bring points_count to integer
* Update migration and version
* Update rubocop issues
* Fix migrations and data verification to remove safety_assured blocks and handle missing points gracefully.
* Update version
* Update calculation of time spent in a country for year-end digest email (#2110)
* Update calculation of time spent in a country for year-end digest email
* Add a filter to exclude raw data points when calculating yearly digests.
* Bump trix from 2.1.15 to 2.1.16 in the npm_and_yarn group across 1 directory (#2098)
* 0.37.1 (#2092)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
* Pull only necessary data for map v2 points
* Feature/raw data archive (#2009)
* 0.36.2 (#2007)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Remove esbuild scripts from package.json
* Remove sideEffects field from package.json
* Raw data archivation
* Add tests
* Fix tests
* Fix tests
* Update ExceptionReporter
* Add schedule to run raw data archival job monthly
* Change file structure for raw data archival feature
* Update changelog and version for raw data archival feature
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Set raw_data to an empty hash instead of nil when archiving
* Fix storage configuration and file extraction
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation (#2018)
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation
* Remove raw data from visited cities api endpoint
* Use user timezone to show dates on maps (#2020)
* Fix/pre epoch time (#2019)
* Use user timezone to show dates on maps
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Fix tests failing due to new index on stats table
* Fix failing specs
* Update redis client configuration to support unix socket connection
* Update changelog
* Fix kml kmz import issues (#2023)
* Fix kml kmz import issues
* Refactor KML importer to improve readability and maintainability
* Implement moving points in map v2 and fix route rendering logic to ma… (#2027)
* Implement moving points in map v2 and fix route rendering logic to match map v1.
* Fix route spec
* fix(maplibre): update date format to ISO 8601 (#2029)
* Add verification step to raw data archival process (#2028)
* Add verification step to raw data archival process
* Add actual verification of raw data archives after creation, and only clear raw_data for verified archives.
* Fix failing specs
* Eliminate zip-bomb risk
* Fix potential memory leak in js
* Return .keep files
* Use Toast instead of alert for notifications
* Add help section to navbar dropdown
* Update changelog
* Remove raw_data_archival_job
* Ensure file is being closed properly after reading in Archivable concern
* Add composite index to stats table if not exists
* Update changelog
* Update entrypoint to always sync static assets (not only new ones)
* Add family layer to MapLibre maps (#2055)
* Add family layer to MapLibre maps
* Update migration
* Don't show family toggle if feature is disabled
* Update changelog
* Return changelog
* Update changelog
* Update tailwind file
* Bump sentry-rails from 6.0.0 to 6.1.0 (#1945)
Bumps [sentry-rails](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-ruby/compare/6.0.0...6.1.0)
---
updated-dependencies:
- dependency-name: sentry-rails
dependency-version: 6.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump turbo-rails from 2.0.17 to 2.0.20 (#1944)
Bumps [turbo-rails](https://github.com/hotwired/turbo-rails) from 2.0.17 to 2.0.20.
- [Release notes](https://github.com/hotwired/turbo-rails/releases)
- [Commits](https://github.com/hotwired/turbo-rails/compare/v2.0.17...v2.0.20)
---
updated-dependencies:
- dependency-name: turbo-rails
dependency-version: 2.0.20
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump webmock from 3.25.1 to 3.26.1 (#1943)
Bumps [webmock](https://github.com/bblimke/webmock) from 3.25.1 to 3.26.1.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.25.1...v3.26.1)
---
updated-dependencies:
- dependency-name: webmock
dependency-version: 3.26.1
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump brakeman from 7.1.0 to 7.1.1 (#1942)
Bumps [brakeman](https://github.com/presidentbeef/brakeman) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/presidentbeef/brakeman/releases)
- [Changelog](https://github.com/presidentbeef/brakeman/blob/main/CHANGES.md)
- [Commits](https://github.com/presidentbeef/brakeman/compare/v7.1.0...v7.1.1)
---
updated-dependencies:
- dependency-name: brakeman
dependency-version: 7.1.1
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump redis from 5.4.0 to 5.4.1 (#1941)
Bumps [redis](https://github.com/redis/redis-rb) from 5.4.0 to 5.4.1.
- [Changelog](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/redis/redis-rb/compare/v5.4.0...v5.4.1)
---
updated-dependencies:
- dependency-name: redis
dependency-version: 5.4.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Put import deletion into background job (#2045)
* Put import deletion into background job
* Update changelog
* fix null type error and update heatmap styling (#2037)
* fix: use constant weight for maplibre heatmap layer
* fix null type, update heatmap styling
* improve heatmap styling
* fix typo
* Fix stats calculation to recursively reduce H3 resolution when too ma… (#2065)
* Fix stats calculation to recursively reduce H3 resolution when too many hexagons are generated
* Update CHANGELOG.md
* Validate trip start and end dates (#2066)
* Validate trip start and end dates
* Update changelog
* Update migration to clean up duplicate stats before adding unique index
* Fix fog of war radius setting being ignored and applying settings causing errors (#2068)
* Update changelog
* Add Rack::Deflater middleware to config/application.rb to enable gzip compression for responses.
* Add composite index to points on user_id and timestamp
* Deduplicte points based on timestamp brought to unix time
* Fix/stats cache invalidation (#2072)
* Fix family layer toggle in Map v2 settings for non-selfhosted env
* Invalidate cache
* Remove comments
* Remove comment
* Add new indicies to improve performance and remove unused ones to opt… (#2078)
* Add new indicies to improve performance and remove unused ones to optimize database.
* Remove comments
* Update map search suggestions panel styling
* Add yearly digest (#2073)
* Add yearly digest
* Rename YearlyDigests to Users::Digests
* Minor changes
* Update yearly digest layout and styles
* Add flags and chart to email
* Update colors
* Fix layout of stats in yearly digest view
* Remove cron job for yearly digest scheduling
* Update CHANGELOG.md
* Update digest email setting handling
* Allow sharing digest for 1 week or 1 month
* Change Digests Distance to Bigint
* Fix settings page
* Update changelog
* Add RailsPulse (#2079)
* Add RailsPulse
* Add RailsPulse monitoring tool with basic HTTP authentication
* Bring points_count to integer
* Update migration and version
* Update rubocop issues
* Fix migrations and data verification to remove safety_assured blocks and handle missing points gracefully.
* Update version
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Robin Tuszik <mail@robin.gg>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump trix in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [trix](https://github.com/basecamp/trix).
Updates `trix` from 2.1.15 to 2.1.16
- [Release notes](https://github.com/basecamp/trix/releases)
- [Commits](https://github.com/basecamp/trix/compare/v2.1.15...v2.1.16)
---
updated-dependencies:
- dependency-name: trix
dependency-version: 2.1.16
dependency-type: direct:production
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
Co-authored-by: Robin Tuszik <mail@robin.gg>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Map v2 will no longer block the UI when Immich/Photoprism integration has a bad URL or is unreachable (#2113)
* Bump rubocop-rails from 2.33.4 to 2.34.2 (#2080)
Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.33.4 to 2.34.2.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.33.4...v2.34.2)
---
updated-dependencies:
- dependency-name: rubocop-rails
dependency-version: 2.34.2
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump chartkick from 5.2.0 to 5.2.1 (#2081)
Bumps [chartkick](https://github.com/ankane/chartkick) from 5.2.0 to 5.2.1.
- [Changelog](https://github.com/ankane/chartkick/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ankane/chartkick/compare/v5.2.0...v5.2.1)
---
updated-dependencies:
- dependency-name: chartkick
dependency-version: 5.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump rubyzip from 3.2.0 to 3.2.2 (#2082)
Bumps [rubyzip](https://github.com/rubyzip/rubyzip) from 3.2.0 to 3.2.2.
- [Release notes](https://github.com/rubyzip/rubyzip/releases)
- [Changelog](https://github.com/rubyzip/rubyzip/blob/main/Changelog.md)
- [Commits](https://github.com/rubyzip/rubyzip/compare/v3.2.0...v3.2.2)
---
updated-dependencies:
- dependency-name: rubyzip
dependency-version: 3.2.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump sentry-ruby from 6.0.0 to 6.2.0 (#2083)
Bumps [sentry-ruby](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.2.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-ruby/compare/6.0.0...6.2.0)
---
updated-dependencies:
- dependency-name: sentry-ruby
dependency-version: 6.2.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump sidekiq from 8.0.8 to 8.1.0 (#2084)
Bumps [sidekiq](https://github.com/sidekiq/sidekiq) from 8.0.8 to 8.1.0.
- [Changelog](https://github.com/sidekiq/sidekiq/blob/main/Changes.md)
- [Commits](https://github.com/sidekiq/sidekiq/compare/v8.0.8...v8.1.0)
---
updated-dependencies:
- dependency-name: sidekiq
dependency-version: 8.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Update digest calculation to use actual time spent in countries based… (#2115)
* Update digest calculation to use actual time spent in countries based on consecutive points, avoiding double-counting days when crossing borders.
* Move methods to private
* Update Gemfile and Gemfile.lock to pin connection_pool and sidekiq versions
* Rework country tracked days calculation
* Adjust calculate_duration_in_minutes to only count continuous presence within cities, excluding long gaps.
* Move helpers for digest city progress to a helper method
* Implement globe projection option for Map v2 using MapLibre GL JS.
* Update time spent calculation for country minutes in user digests
* Stats are now calculated with more accuracy by storing total minutes spent per country.
* Add globe_projection setting to safe settings
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Robin Tuszik <mail@robin.gg>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-04 14:05:04 -05:00
|
|
|
// Fetch photos - only if photos layer is enabled and integration is configured
|
|
|
|
|
// Skip API call if photos are disabled to avoid blocking on failed integrations
|
|
|
|
|
if (this.settings.photosEnabled) {
|
|
|
|
|
try {
|
|
|
|
|
console.log('[Photos] Fetching photos from:', startDate, 'to', endDate)
|
|
|
|
|
// Use Promise.race to enforce a client-side timeout
|
|
|
|
|
const photosPromise = this.api.fetchPhotos({
|
|
|
|
|
start_at: startDate,
|
|
|
|
|
end_at: endDate
|
|
|
|
|
})
|
|
|
|
|
const timeoutPromise = new Promise((_, reject) =>
|
|
|
|
|
setTimeout(() => reject(new Error('Photo fetch timeout')), 15000) // 15 second timeout
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
data.photos = await Promise.race([photosPromise, timeoutPromise])
|
|
|
|
|
console.log('[Photos] Fetched photos:', data.photos.length, 'photos')
|
|
|
|
|
console.log('[Photos] Sample photo:', data.photos[0])
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.warn('[Photos] Failed to fetch photos (non-blocking):', error.message)
|
|
|
|
|
data.photos = []
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
console.log('[Photos] Photos layer disabled, skipping fetch')
|
2025-12-06 14:54:49 -05:00
|
|
|
data.photos = []
|
|
|
|
|
}
|
|
|
|
|
data.photosGeoJSON = this.photosToGeoJSON(data.photos)
|
|
|
|
|
console.log('[Photos] Converted to GeoJSON:', data.photosGeoJSON.features.length, 'features')
|
0.37.2 (#2114)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
* Pull only necessary data for map v2 points
* Feature/raw data archive (#2009)
* 0.36.2 (#2007)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Remove esbuild scripts from package.json
* Remove sideEffects field from package.json
* Raw data archivation
* Add tests
* Fix tests
* Fix tests
* Update ExceptionReporter
* Add schedule to run raw data archival job monthly
* Change file structure for raw data archival feature
* Update changelog and version for raw data archival feature
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Set raw_data to an empty hash instead of nil when archiving
* Fix storage configuration and file extraction
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation (#2018)
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation
* Remove raw data from visited cities api endpoint
* Use user timezone to show dates on maps (#2020)
* Fix/pre epoch time (#2019)
* Use user timezone to show dates on maps
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Fix tests failing due to new index on stats table
* Fix failing specs
* Update redis client configuration to support unix socket connection
* Update changelog
* Fix kml kmz import issues (#2023)
* Fix kml kmz import issues
* Refactor KML importer to improve readability and maintainability
* Implement moving points in map v2 and fix route rendering logic to ma… (#2027)
* Implement moving points in map v2 and fix route rendering logic to match map v1.
* Fix route spec
* fix(maplibre): update date format to ISO 8601 (#2029)
* Add verification step to raw data archival process (#2028)
* Add verification step to raw data archival process
* Add actual verification of raw data archives after creation, and only clear raw_data for verified archives.
* Fix failing specs
* Eliminate zip-bomb risk
* Fix potential memory leak in js
* Return .keep files
* Use Toast instead of alert for notifications
* Add help section to navbar dropdown
* Update changelog
* Remove raw_data_archival_job
* Ensure file is being closed properly after reading in Archivable concern
* Add composite index to stats table if not exists
* Update changelog
* Update entrypoint to always sync static assets (not only new ones)
* Add family layer to MapLibre maps (#2055)
* Add family layer to MapLibre maps
* Update migration
* Don't show family toggle if feature is disabled
* Update changelog
* Return changelog
* Update changelog
* Update tailwind file
* Bump sentry-rails from 6.0.0 to 6.1.0 (#1945)
Bumps [sentry-rails](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-ruby/compare/6.0.0...6.1.0)
---
updated-dependencies:
- dependency-name: sentry-rails
dependency-version: 6.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump turbo-rails from 2.0.17 to 2.0.20 (#1944)
Bumps [turbo-rails](https://github.com/hotwired/turbo-rails) from 2.0.17 to 2.0.20.
- [Release notes](https://github.com/hotwired/turbo-rails/releases)
- [Commits](https://github.com/hotwired/turbo-rails/compare/v2.0.17...v2.0.20)
---
updated-dependencies:
- dependency-name: turbo-rails
dependency-version: 2.0.20
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump webmock from 3.25.1 to 3.26.1 (#1943)
Bumps [webmock](https://github.com/bblimke/webmock) from 3.25.1 to 3.26.1.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.25.1...v3.26.1)
---
updated-dependencies:
- dependency-name: webmock
dependency-version: 3.26.1
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump brakeman from 7.1.0 to 7.1.1 (#1942)
Bumps [brakeman](https://github.com/presidentbeef/brakeman) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/presidentbeef/brakeman/releases)
- [Changelog](https://github.com/presidentbeef/brakeman/blob/main/CHANGES.md)
- [Commits](https://github.com/presidentbeef/brakeman/compare/v7.1.0...v7.1.1)
---
updated-dependencies:
- dependency-name: brakeman
dependency-version: 7.1.1
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump redis from 5.4.0 to 5.4.1 (#1941)
Bumps [redis](https://github.com/redis/redis-rb) from 5.4.0 to 5.4.1.
- [Changelog](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/redis/redis-rb/compare/v5.4.0...v5.4.1)
---
updated-dependencies:
- dependency-name: redis
dependency-version: 5.4.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Put import deletion into background job (#2045)
* Put import deletion into background job
* Update changelog
* fix null type error and update heatmap styling (#2037)
* fix: use constant weight for maplibre heatmap layer
* fix null type, update heatmap styling
* improve heatmap styling
* fix typo
* Fix stats calculation to recursively reduce H3 resolution when too ma… (#2065)
* Fix stats calculation to recursively reduce H3 resolution when too many hexagons are generated
* Update CHANGELOG.md
* Validate trip start and end dates (#2066)
* Validate trip start and end dates
* Update changelog
* Update migration to clean up duplicate stats before adding unique index
* Fix fog of war radius setting being ignored and applying settings causing errors (#2068)
* Update changelog
* Add Rack::Deflater middleware to config/application.rb to enable gzip compression for responses.
* Add composite index to points on user_id and timestamp
* Deduplicte points based on timestamp brought to unix time
* Fix/stats cache invalidation (#2072)
* Fix family layer toggle in Map v2 settings for non-selfhosted env
* Invalidate cache
* Remove comments
* Remove comment
* Add new indicies to improve performance and remove unused ones to opt… (#2078)
* Add new indicies to improve performance and remove unused ones to optimize database.
* Remove comments
* Update map search suggestions panel styling
* Add yearly digest (#2073)
* Add yearly digest
* Rename YearlyDigests to Users::Digests
* Minor changes
* Update yearly digest layout and styles
* Add flags and chart to email
* Update colors
* Fix layout of stats in yearly digest view
* Remove cron job for yearly digest scheduling
* Update CHANGELOG.md
* Update digest email setting handling
* Allow sharing digest for 1 week or 1 month
* Change Digests Distance to Bigint
* Fix settings page
* Update changelog
* Add RailsPulse (#2079)
* Add RailsPulse
* Add RailsPulse monitoring tool with basic HTTP authentication
* Bring points_count to integer
* Update migration and version
* Update rubocop issues
* Fix migrations and data verification to remove safety_assured blocks and handle missing points gracefully.
* Update version
* Update calculation of time spent in a country for year-end digest email (#2110)
* Update calculation of time spent in a country for year-end digest email
* Add a filter to exclude raw data points when calculating yearly digests.
* Bump trix from 2.1.15 to 2.1.16 in the npm_and_yarn group across 1 directory (#2098)
* 0.37.1 (#2092)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
* Pull only necessary data for map v2 points
* Feature/raw data archive (#2009)
* 0.36.2 (#2007)
* fix: move foreman to global gems to fix startup crash (#1971)
* Update exporting code to stream points data to file in batches to red… (#1980)
* Update exporting code to stream points data to file in batches to reduce memory usage
* Update changelog
* Update changelog
* Feature/maplibre frontend (#1953)
* Add a plan to use MapLibre GL JS for the frontend map rendering, replacing Leaflet
* Implement phase 1
* Phases 1-3 + part of 4
* Fix e2e tests
* Phase 6
* Implement fog of war
* Phase 7
* Next step: fix specs, phase 7 done
* Use our own map tiles
* Extract v2 map logic to separate manager classes
* Update settings panel on v2 map
* Update v2 e2e tests structure
* Reimplement location search in maps v2
* Update speed routes
* Implement visits and places creation in v2
* Fix last failing test
* Implement visits merging
* Fix a routes e2e test and simplify the routes layer styling.
* Extract js to modules from maps_v2_controller.js
* Implement area creation
* Fix spec problem
* Fix some e2e tests
* Implement live mode in v2 map
* Update icons and panel
* Extract some styles
* Remove unused file
* Start adding dark theme to popups on MapLibre maps
* Make popups respect dark theme
* Move v2 maps to maplibre namespace
* Update v2 references to maplibre
* Put place, area and visit info into side panel
* Update API to use safe settings config method
* Fix specs
* Fix method name to config in SafeSettings and update usages accordingly
* Add missing public files
* Add handling for real time points
* Fix remembering enabled/disabled layers of the v2 map
* Fix lots of e2e tests
* Add settings to select map version
* Use maps/v2 as main path for MapLibre maps
* Update routing
* Update live mode
* Update maplibre controller
* Update changelog
* Remove some console.log statements
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Remove esbuild scripts from package.json
* Remove sideEffects field from package.json
* Raw data archivation
* Add tests
* Fix tests
* Fix tests
* Update ExceptionReporter
* Add schedule to run raw data archival job monthly
* Change file structure for raw data archival feature
* Update changelog and version for raw data archival feature
---------
Co-authored-by: Robin Tuszik <mail@robin.gg>
* Set raw_data to an empty hash instead of nil when archiving
* Fix storage configuration and file extraction
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation (#2018)
* Consider MIN_MINUTES_SPENT_IN_CITY during stats calculation
* Remove raw data from visited cities api endpoint
* Use user timezone to show dates on maps (#2020)
* Fix/pre epoch time (#2019)
* Use user timezone to show dates on maps
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Limit timestamps to valid range to prevent database errors when users enter pre-epoch dates.
* Fix tests failing due to new index on stats table
* Fix failing specs
* Update redis client configuration to support unix socket connection
* Update changelog
* Fix kml kmz import issues (#2023)
* Fix kml kmz import issues
* Refactor KML importer to improve readability and maintainability
* Implement moving points in map v2 and fix route rendering logic to ma… (#2027)
* Implement moving points in map v2 and fix route rendering logic to match map v1.
* Fix route spec
* fix(maplibre): update date format to ISO 8601 (#2029)
* Add verification step to raw data archival process (#2028)
* Add verification step to raw data archival process
* Add actual verification of raw data archives after creation, and only clear raw_data for verified archives.
* Fix failing specs
* Eliminate zip-bomb risk
* Fix potential memory leak in js
* Return .keep files
* Use Toast instead of alert for notifications
* Add help section to navbar dropdown
* Update changelog
* Remove raw_data_archival_job
* Ensure file is being closed properly after reading in Archivable concern
* Add composite index to stats table if not exists
* Update changelog
* Update entrypoint to always sync static assets (not only new ones)
* Add family layer to MapLibre maps (#2055)
* Add family layer to MapLibre maps
* Update migration
* Don't show family toggle if feature is disabled
* Update changelog
* Return changelog
* Update changelog
* Update tailwind file
* Bump sentry-rails from 6.0.0 to 6.1.0 (#1945)
Bumps [sentry-rails](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.1.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-ruby/compare/6.0.0...6.1.0)
---
updated-dependencies:
- dependency-name: sentry-rails
dependency-version: 6.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump turbo-rails from 2.0.17 to 2.0.20 (#1944)
Bumps [turbo-rails](https://github.com/hotwired/turbo-rails) from 2.0.17 to 2.0.20.
- [Release notes](https://github.com/hotwired/turbo-rails/releases)
- [Commits](https://github.com/hotwired/turbo-rails/compare/v2.0.17...v2.0.20)
---
updated-dependencies:
- dependency-name: turbo-rails
dependency-version: 2.0.20
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump webmock from 3.25.1 to 3.26.1 (#1943)
Bumps [webmock](https://github.com/bblimke/webmock) from 3.25.1 to 3.26.1.
- [Release notes](https://github.com/bblimke/webmock/releases)
- [Changelog](https://github.com/bblimke/webmock/blob/master/CHANGELOG.md)
- [Commits](https://github.com/bblimke/webmock/compare/v3.25.1...v3.26.1)
---
updated-dependencies:
- dependency-name: webmock
dependency-version: 3.26.1
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump brakeman from 7.1.0 to 7.1.1 (#1942)
Bumps [brakeman](https://github.com/presidentbeef/brakeman) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/presidentbeef/brakeman/releases)
- [Changelog](https://github.com/presidentbeef/brakeman/blob/main/CHANGES.md)
- [Commits](https://github.com/presidentbeef/brakeman/compare/v7.1.0...v7.1.1)
---
updated-dependencies:
- dependency-name: brakeman
dependency-version: 7.1.1
dependency-type: direct:development
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump redis from 5.4.0 to 5.4.1 (#1941)
Bumps [redis](https://github.com/redis/redis-rb) from 5.4.0 to 5.4.1.
- [Changelog](https://github.com/redis/redis-rb/blob/master/CHANGELOG.md)
- [Commits](https://github.com/redis/redis-rb/compare/v5.4.0...v5.4.1)
---
updated-dependencies:
- dependency-name: redis
dependency-version: 5.4.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Put import deletion into background job (#2045)
* Put import deletion into background job
* Update changelog
* fix null type error and update heatmap styling (#2037)
* fix: use constant weight for maplibre heatmap layer
* fix null type, update heatmap styling
* improve heatmap styling
* fix typo
* Fix stats calculation to recursively reduce H3 resolution when too ma… (#2065)
* Fix stats calculation to recursively reduce H3 resolution when too many hexagons are generated
* Update CHANGELOG.md
* Validate trip start and end dates (#2066)
* Validate trip start and end dates
* Update changelog
* Update migration to clean up duplicate stats before adding unique index
* Fix fog of war radius setting being ignored and applying settings causing errors (#2068)
* Update changelog
* Add Rack::Deflater middleware to config/application.rb to enable gzip compression for responses.
* Add composite index to points on user_id and timestamp
* Deduplicte points based on timestamp brought to unix time
* Fix/stats cache invalidation (#2072)
* Fix family layer toggle in Map v2 settings for non-selfhosted env
* Invalidate cache
* Remove comments
* Remove comment
* Add new indicies to improve performance and remove unused ones to opt… (#2078)
* Add new indicies to improve performance and remove unused ones to optimize database.
* Remove comments
* Update map search suggestions panel styling
* Add yearly digest (#2073)
* Add yearly digest
* Rename YearlyDigests to Users::Digests
* Minor changes
* Update yearly digest layout and styles
* Add flags and chart to email
* Update colors
* Fix layout of stats in yearly digest view
* Remove cron job for yearly digest scheduling
* Update CHANGELOG.md
* Update digest email setting handling
* Allow sharing digest for 1 week or 1 month
* Change Digests Distance to Bigint
* Fix settings page
* Update changelog
* Add RailsPulse (#2079)
* Add RailsPulse
* Add RailsPulse monitoring tool with basic HTTP authentication
* Bring points_count to integer
* Update migration and version
* Update rubocop issues
* Fix migrations and data verification to remove safety_assured blocks and handle missing points gracefully.
* Update version
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Robin Tuszik <mail@robin.gg>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump trix in the npm_and_yarn group across 1 directory
Bumps the npm_and_yarn group with 1 update in the / directory: [trix](https://github.com/basecamp/trix).
Updates `trix` from 2.1.15 to 2.1.16
- [Release notes](https://github.com/basecamp/trix/releases)
- [Commits](https://github.com/basecamp/trix/compare/v2.1.15...v2.1.16)
---
updated-dependencies:
- dependency-name: trix
dependency-version: 2.1.16
dependency-type: direct:production
dependency-group: npm_and_yarn
...
Signed-off-by: dependabot[bot] <support@github.com>
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
Co-authored-by: Robin Tuszik <mail@robin.gg>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Map v2 will no longer block the UI when Immich/Photoprism integration has a bad URL or is unreachable (#2113)
* Bump rubocop-rails from 2.33.4 to 2.34.2 (#2080)
Bumps [rubocop-rails](https://github.com/rubocop/rubocop-rails) from 2.33.4 to 2.34.2.
- [Release notes](https://github.com/rubocop/rubocop-rails/releases)
- [Changelog](https://github.com/rubocop/rubocop-rails/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rubocop/rubocop-rails/compare/v2.33.4...v2.34.2)
---
updated-dependencies:
- dependency-name: rubocop-rails
dependency-version: 2.34.2
dependency-type: direct:development
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump chartkick from 5.2.0 to 5.2.1 (#2081)
Bumps [chartkick](https://github.com/ankane/chartkick) from 5.2.0 to 5.2.1.
- [Changelog](https://github.com/ankane/chartkick/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ankane/chartkick/compare/v5.2.0...v5.2.1)
---
updated-dependencies:
- dependency-name: chartkick
dependency-version: 5.2.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump rubyzip from 3.2.0 to 3.2.2 (#2082)
Bumps [rubyzip](https://github.com/rubyzip/rubyzip) from 3.2.0 to 3.2.2.
- [Release notes](https://github.com/rubyzip/rubyzip/releases)
- [Changelog](https://github.com/rubyzip/rubyzip/blob/main/Changelog.md)
- [Commits](https://github.com/rubyzip/rubyzip/compare/v3.2.0...v3.2.2)
---
updated-dependencies:
- dependency-name: rubyzip
dependency-version: 3.2.2
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* Bump sentry-ruby from 6.0.0 to 6.2.0 (#2083)
Bumps [sentry-ruby](https://github.com/getsentry/sentry-ruby) from 6.0.0 to 6.2.0.
- [Release notes](https://github.com/getsentry/sentry-ruby/releases)
- [Changelog](https://github.com/getsentry/sentry-ruby/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-ruby/compare/6.0.0...6.2.0)
---
updated-dependencies:
- dependency-name: sentry-ruby
dependency-version: 6.2.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Bump sidekiq from 8.0.8 to 8.1.0 (#2084)
Bumps [sidekiq](https://github.com/sidekiq/sidekiq) from 8.0.8 to 8.1.0.
- [Changelog](https://github.com/sidekiq/sidekiq/blob/main/Changes.md)
- [Commits](https://github.com/sidekiq/sidekiq/compare/v8.0.8...v8.1.0)
---
updated-dependencies:
- dependency-name: sidekiq
dependency-version: 8.1.0
dependency-type: direct:production
update-type: version-update:semver-minor
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Evgenii Burmakin <Freika@users.noreply.github.com>
* Update digest calculation to use actual time spent in countries based… (#2115)
* Update digest calculation to use actual time spent in countries based on consecutive points, avoiding double-counting days when crossing borders.
* Move methods to private
* Update Gemfile and Gemfile.lock to pin connection_pool and sidekiq versions
* Rework country tracked days calculation
* Adjust calculate_duration_in_minutes to only count continuous presence within cities, excluding long gaps.
* Move helpers for digest city progress to a helper method
* Implement globe projection option for Map v2 using MapLibre GL JS.
* Update time spent calculation for country minutes in user digests
* Stats are now calculated with more accuracy by storing total minutes spent per country.
* Add globe_projection setting to safe settings
---------
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Robin Tuszik <mail@robin.gg>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-01-04 14:05:04 -05:00
|
|
|
if (data.photosGeoJSON.features.length > 0) {
|
|
|
|
|
console.log('[Photos] Sample feature:', data.photosGeoJSON.features[0])
|
|
|
|
|
}
|
2025-12-06 14:54:49 -05:00
|
|
|
|
|
|
|
|
// Fetch areas
|
|
|
|
|
try {
|
|
|
|
|
data.areas = await this.api.fetchAreas()
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.warn('Failed to fetch areas:', error)
|
|
|
|
|
data.areas = []
|
|
|
|
|
}
|
|
|
|
|
data.areasGeoJSON = this.areasToGeoJSON(data.areas)
|
|
|
|
|
|
|
|
|
|
// Fetch places (no date filtering)
|
|
|
|
|
try {
|
|
|
|
|
data.places = await this.api.fetchPlaces()
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.warn('Failed to fetch places:', error)
|
|
|
|
|
data.places = []
|
|
|
|
|
}
|
|
|
|
|
data.placesGeoJSON = this.placesToGeoJSON(data.places)
|
|
|
|
|
|
|
|
|
|
// Tracks - DISABLED: Backend API not yet implemented
|
|
|
|
|
// TODO: Re-enable when /api/v1/tracks endpoint is created
|
|
|
|
|
data.tracks = []
|
|
|
|
|
data.tracksGeoJSON = this.tracksToGeoJSON(data.tracks)
|
|
|
|
|
|
|
|
|
|
return data
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert visits to GeoJSON
|
|
|
|
|
*/
|
|
|
|
|
visitsToGeoJSON(visits) {
|
|
|
|
|
return {
|
|
|
|
|
type: 'FeatureCollection',
|
|
|
|
|
features: visits.map(visit => ({
|
|
|
|
|
type: 'Feature',
|
|
|
|
|
geometry: {
|
|
|
|
|
type: 'Point',
|
|
|
|
|
coordinates: [visit.place.longitude, visit.place.latitude]
|
|
|
|
|
},
|
|
|
|
|
properties: {
|
|
|
|
|
id: visit.id,
|
|
|
|
|
name: visit.name,
|
|
|
|
|
place_name: visit.place?.name,
|
|
|
|
|
status: visit.status,
|
|
|
|
|
started_at: visit.started_at,
|
|
|
|
|
ended_at: visit.ended_at,
|
|
|
|
|
duration: visit.duration
|
|
|
|
|
}
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert photos to GeoJSON
|
|
|
|
|
*/
|
|
|
|
|
photosToGeoJSON(photos) {
|
|
|
|
|
return {
|
|
|
|
|
type: 'FeatureCollection',
|
|
|
|
|
features: photos.map(photo => {
|
|
|
|
|
// Construct thumbnail URL
|
|
|
|
|
const thumbnailUrl = `/api/v1/photos/${photo.id}/thumbnail.jpg?api_key=${this.apiKey}&source=${photo.source}`
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
type: 'Feature',
|
|
|
|
|
geometry: {
|
|
|
|
|
type: 'Point',
|
|
|
|
|
coordinates: [photo.longitude, photo.latitude]
|
|
|
|
|
},
|
|
|
|
|
properties: {
|
|
|
|
|
id: photo.id,
|
|
|
|
|
thumbnail_url: thumbnailUrl,
|
|
|
|
|
taken_at: photo.localDateTime,
|
|
|
|
|
filename: photo.originalFileName,
|
|
|
|
|
city: photo.city,
|
|
|
|
|
state: photo.state,
|
|
|
|
|
country: photo.country,
|
|
|
|
|
type: photo.type,
|
|
|
|
|
source: photo.source
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert places to GeoJSON
|
|
|
|
|
*/
|
|
|
|
|
placesToGeoJSON(places) {
|
|
|
|
|
return {
|
|
|
|
|
type: 'FeatureCollection',
|
|
|
|
|
features: places.map(place => ({
|
|
|
|
|
type: 'Feature',
|
|
|
|
|
geometry: {
|
|
|
|
|
type: 'Point',
|
|
|
|
|
coordinates: [place.longitude, place.latitude]
|
|
|
|
|
},
|
|
|
|
|
properties: {
|
|
|
|
|
id: place.id,
|
|
|
|
|
name: place.name,
|
|
|
|
|
latitude: place.latitude,
|
|
|
|
|
longitude: place.longitude,
|
|
|
|
|
note: place.note,
|
|
|
|
|
// Stringify tags for MapLibre GL JS compatibility
|
|
|
|
|
tags: JSON.stringify(place.tags || []),
|
|
|
|
|
// Use first tag's color if available
|
|
|
|
|
color: place.tags?.[0]?.color || '#6366f1'
|
|
|
|
|
}
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert areas to GeoJSON
|
|
|
|
|
* Backend returns circular areas with latitude, longitude, radius
|
|
|
|
|
*/
|
|
|
|
|
areasToGeoJSON(areas) {
|
|
|
|
|
return {
|
|
|
|
|
type: 'FeatureCollection',
|
|
|
|
|
features: areas.map(area => {
|
|
|
|
|
// Create circle polygon from center and radius
|
|
|
|
|
// Parse as floats since API returns strings
|
|
|
|
|
const center = [parseFloat(area.longitude), parseFloat(area.latitude)]
|
|
|
|
|
const coordinates = createCircle(center, area.radius)
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
type: 'Feature',
|
|
|
|
|
geometry: {
|
|
|
|
|
type: 'Polygon',
|
|
|
|
|
coordinates: [coordinates]
|
|
|
|
|
},
|
|
|
|
|
properties: {
|
|
|
|
|
id: area.id,
|
|
|
|
|
name: area.name,
|
|
|
|
|
color: area.color || '#ef4444',
|
|
|
|
|
radius: area.radius
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert tracks to GeoJSON
|
|
|
|
|
*/
|
|
|
|
|
tracksToGeoJSON(tracks) {
|
|
|
|
|
return {
|
|
|
|
|
type: 'FeatureCollection',
|
|
|
|
|
features: tracks.map(track => ({
|
|
|
|
|
type: 'Feature',
|
|
|
|
|
geometry: {
|
|
|
|
|
type: 'LineString',
|
|
|
|
|
coordinates: track.coordinates
|
|
|
|
|
},
|
|
|
|
|
properties: {
|
|
|
|
|
id: track.id,
|
|
|
|
|
name: track.name,
|
|
|
|
|
color: track.color || '#8b5cf6'
|
|
|
|
|
}
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|