From d1cfd0fd8e926f3fa34cf3ed307ff75f23e8f387 Mon Sep 17 00:00:00 2001 From: sstent Date: Fri, 16 Jan 2026 15:35:26 -0800 Subject: [PATCH] feat: implement Fitbit OAuth, Garmin MFA, and optimize segment discovery - Add Fitbit authentication flow (save credentials, OAuth callback handling) - Implement Garmin MFA support with successful session/cookie handling - Optimize segment discovery with new sampling and activity query services - Refactor database session management in discovery API for better testability - Enhance activity data parsing for charts and analysis - Update tests to use testcontainers and proper dependency injection - Clean up repository by ignoring and removing tracked transient files (.pyc, .db) --- .gitignore | 58 +++ FitnessSync/backend/.coverage | Bin 53248 -> 0 bytes .../backend/__pycache__/main.cpython-311.pyc | Bin 6242 -> 0 bytes .../backend/__pycache__/main.cpython-313.pyc | Bin 5560 -> 0 bytes .../alembic/__pycache__/env.cpython-311.pyc | Bin 3238 -> 0 bytes .../alembic/__pycache__/env.cpython-313.pyc | Bin 2791 -> 0 bytes ...e_add_extended_fit_metrics.cpython-311.pyc | Bin 4879 -> 0 bytes ...5e9_add_is_estimated_power.cpython-311.pyc | Bin 1818 -> 0 bytes ..._segment_scan_timestamp_v3.cpython-311.pyc | Bin 1133 -> 0 bytes ...7f880117_create_jobs_table.cpython-311.pyc | Bin 3243 -> 0 bytes ...ove_btree_geometry_indexes.cpython-311.pyc | Bin 1123 -> 0 bytes ...1381ac00_initial_migration.cpython-311.pyc | Bin 11799 -> 0 bytes ...dd_mfa_state_to_api_tokens.cpython-311.pyc | Bin 1087 -> 0 bytes ...16d820129_add_streams_json.cpython-311.pyc | Bin 1179 -> 0 bytes ...tivity_streams_and_postgis.cpython-311.pyc | Bin 4498 -> 0 bytes ...add_bike_setup_to_activity.cpython-311.pyc | Bin 1678 -> 0 bytes ...kens_and_expiry_during_mfa.cpython-311.pyc | Bin 1446 -> 0 bytes ...60ed462bf_add_state_tables.cpython-311.pyc | Bin 3906 -> 0 bytes ..._segment_scan_timestamp_v2.cpython-311.pyc | Bin 1133 -> 0 bytes ...d_missing_activity_columns.cpython-311.pyc | Bin 20080 -> 0 bytes ...ast_segment_scan_timestamp.cpython-311.pyc | Bin 1127 -> 0 bytes ...1216_add_bike_setups_table.cpython-311.pyc | Bin 3006 -> 0 bytes ...495f5e_add_segments_tables.cpython-311.pyc | Bin 4824 -> 0 bytes ...vg_temperature_to_activity.cpython-311.pyc | Bin 2450 -> 0 bytes ...a5_add_fitbit_redirect_uri.cpython-311.pyc | Bin 1456 -> 0 bytes ...nd_activity_schema_metrics.cpython-311.pyc | Bin 4995 -> 0 bytes ...max_power_to_segmenteffort.cpython-311.pyc | Bin 1460 -> 0 bytes ...ssion_fields_to_api_tokens.cpython-311.pyc | Bin 1968 -> 0 bytes ...ast_segment_scan_timestamp.cpython-311.pyc | Bin 1482 -> 0 bytes ...add_segment_effort_metrics.cpython-311.pyc | Bin 1592 -> 0 bytes FitnessSync/backend/main.py | 30 +- FitnessSync/backend/requirements.txt | 9 +- FitnessSync/backend/scripts/repair_geodata.py | 96 ++++ .../src/__pycache__/__init__.cpython-311.pyc | Bin 137 -> 0 bytes .../src/__pycache__/__init__.cpython-313.pyc | Bin 164 -> 0 bytes .../api/__pycache__/__init__.cpython-311.pyc | Bin 141 -> 0 bytes .../api/__pycache__/__init__.cpython-313.pyc | Bin 168 -> 0 bytes .../__pycache__/activities.cpython-311.pyc | Bin 51799 -> 0 bytes .../__pycache__/activities.cpython-313.pyc | Bin 47100 -> 0 bytes .../api/__pycache__/analysis.cpython-311.pyc | Bin 15290 -> 0 bytes .../api/__pycache__/analysis.cpython-313.pyc | Bin 13336 -> 0 bytes .../src/api/__pycache__/auth.cpython-311.pyc | Bin 20365 -> 0 bytes .../src/api/__pycache__/auth.cpython-313.pyc | Bin 17866 -> 0 bytes .../__pycache__/bike_setups.cpython-311.pyc | Bin 9638 -> 0 bytes .../__pycache__/bike_setups.cpython-313.pyc | Bin 8804 -> 0 bytes .../__pycache__/config_routes.cpython-311.pyc | Bin 7328 -> 0 bytes .../__pycache__/config_routes.cpython-313.pyc | Bin 6436 -> 0 bytes .../api/__pycache__/discovery.cpython-311.pyc | Bin 3748 -> 0 bytes .../api/__pycache__/discovery.cpython-313.pyc | Bin 3225 -> 0 bytes .../src/api/__pycache__/logs.cpython-311.pyc | Bin 1390 -> 0 bytes .../src/api/__pycache__/logs.cpython-313.pyc | Bin 1228 -> 0 bytes .../api/__pycache__/metrics.cpython-311.pyc | Bin 17932 -> 0 bytes .../api/__pycache__/metrics.cpython-313.pyc | Bin 17190 -> 0 bytes .../__pycache__/scheduling.cpython-311.pyc | Bin 9479 -> 0 bytes .../__pycache__/scheduling.cpython-313.pyc | Bin 7911 -> 0 bytes .../api/__pycache__/segments.cpython-311.pyc | Bin 22094 -> 0 bytes .../api/__pycache__/segments.cpython-313.pyc | Bin 18313 -> 0 bytes .../src/api/__pycache__/setup.cpython-311.pyc | Bin 29689 -> 0 bytes .../src/api/__pycache__/setup.cpython-313.pyc | Bin 26128 -> 0 bytes .../api/__pycache__/status.cpython-311.pyc | Bin 11438 -> 0 bytes .../api/__pycache__/status.cpython-313.pyc | Bin 10173 -> 0 bytes .../src/api/__pycache__/sync.cpython-311.pyc | Bin 20721 -> 0 bytes .../src/api/__pycache__/sync.cpython-313.pyc | Bin 17955 -> 0 bytes FitnessSync/backend/src/api/activities.py | 475 ++---------------- FitnessSync/backend/src/api/analysis.py | 5 +- FitnessSync/backend/src/api/auth.py | 12 +- FitnessSync/backend/src/api/bike_setups.py | 8 +- FitnessSync/backend/src/api/config_routes.py | 6 +- FitnessSync/backend/src/api/discovery.py | 43 +- FitnessSync/backend/src/api/metrics.py | 5 +- FitnessSync/backend/src/api/scheduling.py | 5 +- FitnessSync/backend/src/api/segments.py | 38 +- FitnessSync/backend/src/api/sync.py | 6 +- .../segment_matching_job.cpython-311.pyc | Bin 3836 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 1117 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 908 -> 0 bytes .../__pycache__/activity.cpython-311.pyc | Bin 4627 -> 0 bytes .../__pycache__/activity.cpython-313.pyc | Bin 3400 -> 0 bytes .../activity_state.cpython-311.pyc | Bin 1243 -> 0 bytes .../activity_state.cpython-313.pyc | Bin 1082 -> 0 bytes .../__pycache__/api_token.cpython-311.pyc | Bin 1822 -> 0 bytes .../__pycache__/api_token.cpython-313.pyc | Bin 1447 -> 0 bytes .../__pycache__/auth_status.cpython-311.pyc | Bin 1532 -> 0 bytes .../__pycache__/auth_status.cpython-313.pyc | Bin 1257 -> 0 bytes .../models/__pycache__/base.cpython-311.pyc | Bin 259 -> 0 bytes .../models/__pycache__/base.cpython-313.pyc | Bin 265 -> 0 bytes .../__pycache__/bike_setup.cpython-311.pyc | Bin 1500 -> 0 bytes .../__pycache__/bike_setup.cpython-313.pyc | Bin 1225 -> 0 bytes .../models/__pycache__/config.cpython-311.pyc | Bin 1540 -> 0 bytes .../models/__pycache__/config.cpython-313.pyc | Bin 1270 -> 0 bytes .../__pycache__/health_metric.cpython-311.pyc | Bin 1533 -> 0 bytes .../__pycache__/health_metric.cpython-313.pyc | Bin 1252 -> 0 bytes .../__pycache__/health_state.cpython-311.pyc | Bin 1382 -> 0 bytes .../__pycache__/health_state.cpython-313.pyc | Bin 1199 -> 0 bytes .../models/__pycache__/job.cpython-311.pyc | Bin 1713 -> 0 bytes .../models/__pycache__/job.cpython-313.pyc | Bin 1358 -> 0 bytes .../__pycache__/scheduled_job.cpython-311.pyc | Bin 1630 -> 0 bytes .../__pycache__/scheduled_job.cpython-313.pyc | Bin 1309 -> 0 bytes .../__pycache__/segment.cpython-311.pyc | Bin 1652 -> 0 bytes .../__pycache__/segment.cpython-313.pyc | Bin 1331 -> 0 bytes .../segment_effort.cpython-311.pyc | Bin 1973 -> 0 bytes .../segment_effort.cpython-313.pyc | Bin 1579 -> 0 bytes .../models/__pycache__/stream.cpython-311.pyc | Bin 2128 -> 0 bytes .../models/__pycache__/stream.cpython-313.pyc | Bin 1705 -> 0 bytes .../__pycache__/sync_log.cpython-311.pyc | Bin 1575 -> 0 bytes .../__pycache__/sync_log.cpython-313.pyc | Bin 1280 -> 0 bytes .../__pycache__/weight_record.cpython-311.pyc | Bin 1591 -> 0 bytes .../__pycache__/weight_record.cpython-313.pyc | Bin 1296 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 145 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 172 -> 0 bytes .../routers/__pycache__/web.cpython-311.pyc | Bin 3709 -> 0 bytes .../routers/__pycache__/web.cpython-313.pyc | Bin 3278 -> 0 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 2415 -> 0 bytes .../__pycache__/discovery.cpython-313.pyc | Bin 1911 -> 0 bytes FitnessSync/backend/src/schemas/discovery.py | 3 + .../__pycache__/__init__.cpython-311.pyc | Bin 146 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 173 -> 0 bytes .../__pycache__/bike_matching.cpython-311.pyc | Bin 10684 -> 0 bytes .../__pycache__/bike_matching.cpython-313.pyc | Bin 10277 -> 0 bytes .../__pycache__/discovery.cpython-311.pyc | Bin 18557 -> 0 bytes .../__pycache__/discovery.cpython-313.pyc | Bin 16194 -> 0 bytes .../__pycache__/fitbit_client.cpython-311.pyc | Bin 6789 -> 0 bytes .../__pycache__/fitbit_client.cpython-313.pyc | Bin 6339 -> 0 bytes .../__pycache__/garmin_client.cpython-313.pyc | Bin 34367 -> 0 bytes .../__pycache__/garth_helper.cpython-311.pyc | Bin 2582 -> 0 bytes .../__pycache__/garth_helper.cpython-313.pyc | Bin 2408 -> 0 bytes .../__pycache__/job_manager.cpython-311.pyc | Bin 17962 -> 0 bytes .../__pycache__/job_manager.cpython-313.pyc | Bin 15429 -> 0 bytes .../__pycache__/parsers.cpython-311.pyc | Bin 15049 -> 0 bytes .../__pycache__/parsers.cpython-313.pyc | Bin 13438 -> 0 bytes .../postgresql_manager.cpython-311.pyc | Bin 2996 -> 0 bytes .../postgresql_manager.cpython-313.pyc | Bin 2680 -> 0 bytes .../power_estimator.cpython-311.pyc | Bin 7764 -> 0 bytes .../__pycache__/scheduler.cpython-311.pyc | Bin 12117 -> 0 bytes .../__pycache__/scheduler.cpython-313.pyc | Bin 10125 -> 0 bytes .../segment_matcher.cpython-311.pyc | Bin 21837 -> 0 bytes .../segment_matcher.cpython-313.pyc | Bin 14196 -> 0 bytes .../__pycache__/sync_app.cpython-311.pyc | Bin 7002 -> 0 bytes .../__pycache__/sync_app.cpython-313.pyc | Bin 6541 -> 0 bytes .../backend/src/services/activity_file.py | 91 ++++ .../backend/src/services/activity_query.py | 107 ++++ .../backend/src/services/bike_matching.py | 21 +- FitnessSync/backend/src/services/discovery.py | 13 +- .../garmin/__pycache__/auth.cpython-311.pyc | Bin 13783 -> 0 bytes .../garmin/__pycache__/auth.cpython-313.pyc | Bin 12744 -> 0 bytes .../garmin/__pycache__/client.cpython-311.pyc | Bin 6558 -> 0 bytes .../garmin/__pycache__/client.cpython-313.pyc | Bin 6273 -> 0 bytes .../garmin/__pycache__/data.cpython-311.pyc | Bin 19210 -> 0 bytes .../garmin/__pycache__/data.cpython-313.pyc | Bin 16945 -> 0 bytes FitnessSync/backend/src/services/parsers.py | 246 +++++++-- .../backend/src/services/segment_matcher.py | 52 +- .../sync/__pycache__/__init__.cpython-311.pyc | Bin 151 -> 0 bytes .../sync/__pycache__/__init__.cpython-313.pyc | Bin 178 -> 0 bytes .../sync/__pycache__/activity.cpython-311.pyc | Bin 27540 -> 0 bytes .../sync/__pycache__/activity.cpython-313.pyc | Bin 25720 -> 0 bytes .../sync/__pycache__/health.cpython-311.pyc | Bin 21667 -> 0 bytes .../sync/__pycache__/health.cpython-313.pyc | Bin 19505 -> 0 bytes .../sync/__pycache__/utils.cpython-311.pyc | Bin 2471 -> 0 bytes .../sync/__pycache__/utils.cpython-313.pyc | Bin 2257 -> 0 bytes .../sync/__pycache__/weight.cpython-311.pyc | Bin 13238 -> 0 bytes .../sync/__pycache__/weight.cpython-313.pyc | Bin 12407 -> 0 bytes .../backend/src/services/sync/activity.py | 11 + .../__pycache__/definitions.cpython-311.pyc | Bin 15276 -> 0 bytes FitnessSync/backend/src/tasks/definitions.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 143 -> 0 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 170 -> 0 bytes .../utils/__pycache__/config.cpython-311.pyc | Bin 2295 -> 0 bytes .../utils/__pycache__/config.cpython-313.pyc | Bin 2143 -> 0 bytes .../src/utils/__pycache__/geo.cpython-311.pyc | Bin 8201 -> 0 bytes .../src/utils/__pycache__/geo.cpython-313.pyc | Bin 7057 -> 0 bytes .../utils/__pycache__/helpers.cpython-311.pyc | Bin 2030 -> 0 bytes .../utils/__pycache__/helpers.cpython-313.pyc | Bin 1952 -> 0 bytes .../logging_config.cpython-311.pyc | Bin 1163 -> 0 bytes .../logging_config.cpython-313.pyc | Bin 1106 -> 0 bytes FitnessSync/backend/src/utils/sampling.py | 48 ++ FitnessSync/backend/templates/discovery.html | 192 ++++--- .../backend/test_segment_optimization.py | 87 ---- .../conftest.cpython-311-pytest-7.4.3.pyc | Bin 3989 -> 0 bytes .../conftest.cpython-313-pytest-9.0.2.pyc | Bin 3429 -> 0 bytes ...test_analysis.cpython-311-pytest-7.4.3.pyc | Bin 9235 -> 0 bytes ...est_discovery.cpython-313-pytest-9.0.2.pyc | Bin 6002 -> 0 bytes ...ontend_assets.cpython-313-pytest-9.0.2.pyc | Bin 3215 -> 0 bytes ...gle_discovery.cpython-313-pytest-9.0.2.pyc | Bin 6258 -> 0 bytes .../backend/tests/api/test_discovery.py | 5 +- .../tests/api/test_single_discovery.py | 5 +- FitnessSync/backend/tests/conftest.py | 69 ++- .../__pycache__/__init__.cpython-313.pyc | Bin 177 -> 0 bytes ...t_bike_setups.cpython-313-pytest-9.0.2.pyc | Bin 10441 -> 0 bytes ...est_setup_api.cpython-313-pytest-9.0.2.pyc | Bin 6290 -> 0 bytes .../tests/functional/test_bike_setups.py | 71 ++- ...rmin_auth_api.cpython-313-pytest-9.0.2.pyc | Bin 25093 -> 0 bytes .../tests/integration/test_activities_api.py | 153 ++++++ .../integration/test_bike_matching_job.py | 39 ++ .../tests/integration/test_discovery_fix.py | 55 ++ .../integration/test_discovery_garmin_id.py | 45 ++ .../tests/integration/test_garmin_auth_api.py | 42 +- .../integration/test_repro_segment_bug.py | 72 +++ .../integration/test_segment_optimization.py | 42 ++ .../tests/integration/test_ui_rendering.py | 74 +++ ...est_discovery.cpython-313-pytest-9.0.2.pyc | Bin 11030 -> 0 bytes ...discovery.py => test_service_discovery.py} | 14 +- ...alysis_export.cpython-313-pytest-9.0.2.pyc | Bin 7505 -> 0 bytes ...bike_matching.cpython-313-pytest-9.0.2.pyc | Bin 5790 -> 0 bytes ...ad_validation.cpython-313-pytest-9.0.2.pyc | Bin 3137 -> 0 bytes ...t_fitbit_auth.cpython-313-pytest-9.0.2.pyc | Bin 12423 -> 0 bytes ...t_garmin_auth.cpython-311-pytest-7.4.3.pyc | Bin 17852 -> 0 bytes ...t_garmin_auth.cpython-313-pytest-9.0.2.pyc | Bin 16249 -> 0 bytes ...t_garmin_data.cpython-313-pytest-9.0.2.pyc | Bin 13508 -> 0 bytes ...ect_migration.cpython-313-pytest-9.0.2.pyc | Bin 13340 -> 0 bytes ...test_mfa_flow.cpython-313-pytest-9.0.2.pyc | Bin 3305 -> 0 bytes ...t_new_metrics.cpython-313-pytest-9.0.2.pyc | Bin 4225 -> 0 bytes ...test_sync_app.cpython-313-pytest-9.0.2.pyc | Bin 16737 -> 0 bytes .../backend/tests/unit/test_fitbit_auth.py | 157 +++--- .../backend/tests/unit/test_mfa_flow.py | 14 +- .../backend/tests/unit/test_parsers.py | 142 ++++++ .../test_segment_matcher.py} | 49 +- FitnessSync/test.db | Bin 69632 -> 0 bytes 217 files changed, 1795 insertions(+), 922 deletions(-) create mode 100644 .gitignore delete mode 100644 FitnessSync/backend/.coverage delete mode 100644 FitnessSync/backend/__pycache__/main.cpython-311.pyc delete mode 100644 FitnessSync/backend/__pycache__/main.cpython-313.pyc delete mode 100644 FitnessSync/backend/alembic/__pycache__/env.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/__pycache__/env.cpython-313.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/09c17c0f0e9e_add_extended_fit_metrics.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/0c82944705e9_add_is_estimated_power.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/1136125782ec_add_last_segment_scan_timestamp_v3.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/1e157f880117_create_jobs_table.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/20ccc82af3f2_remove_btree_geometry_indexes.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/24df1381ac00_initial_migration.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/299d39b0f13d_add_mfa_state_to_api_tokens.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/52a16d820129_add_streams_json.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/62a16d820130_add_activity_streams_and_postgis.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/73e349ef1d88_add_bike_setup_to_activity.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/792840bbb2e0_allow_null_tokens_and_expiry_during_mfa.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/85c60ed462bf_add_state_tables.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/87cc6ed8df63_add_last_segment_scan_timestamp_v2.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/8c5791dd193e_add_missing_activity_columns.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/8cc7963c8db0_add_last_segment_scan_timestamp.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/95af0e911216_add_bike_setups_table.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/a9c00e495f5e_add_segments_tables.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/b43006af329e_add_avg_temperature_to_activity.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/b5a6d7ef97a5_add_fitbit_redirect_uri.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/bd21a0528865_expand_activity_schema_metrics.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/cc3b223773cb_add_max_power_to_segmenteffort.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/ce0f0282a142_add_mfa_session_fields_to_api_tokens.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/dbb13b0ba015_add_last_segment_scan_timestamp.cpython-311.pyc delete mode 100644 FitnessSync/backend/alembic/versions/__pycache__/e9b8841a1234_add_segment_effort_metrics.cpython-311.pyc create mode 100644 FitnessSync/backend/scripts/repair_geodata.py delete mode 100644 FitnessSync/backend/src/__pycache__/__init__.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/__init__.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/activities.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/activities.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/analysis.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/analysis.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/auth.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/auth.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/bike_setups.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/bike_setups.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/config_routes.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/config_routes.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/discovery.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/discovery.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/logs.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/logs.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/metrics.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/metrics.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/scheduling.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/scheduling.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/segments.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/segments.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/setup.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/setup.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/status.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/status.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/sync.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/api/__pycache__/sync.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/jobs/__pycache__/segment_matching_job.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/__init__.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/activity.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/activity.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/activity_state.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/activity_state.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/api_token.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/api_token.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/auth_status.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/auth_status.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/base.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/base.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/bike_setup.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/bike_setup.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/config.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/config.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/health_metric.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/health_metric.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/health_state.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/health_state.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/job.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/job.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/scheduled_job.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/scheduled_job.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/segment.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/segment.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/segment_effort.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/segment_effort.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/stream.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/stream.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/sync_log.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/sync_log.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/weight_record.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/models/__pycache__/weight_record.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/routers/__pycache__/__init__.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/routers/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/routers/__pycache__/web.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/routers/__pycache__/web.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/schemas/__pycache__/discovery.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/schemas/__pycache__/discovery.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/__init__.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/bike_matching.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/bike_matching.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/discovery.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/discovery.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/fitbit_client.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/fitbit_client.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/garmin_client.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/garth_helper.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/garth_helper.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/job_manager.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/job_manager.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/parsers.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/parsers.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/power_estimator.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/scheduler.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/scheduler.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/segment_matcher.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/segment_matcher.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/sync_app.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/__pycache__/sync_app.cpython-313.pyc create mode 100644 FitnessSync/backend/src/services/activity_file.py create mode 100644 FitnessSync/backend/src/services/activity_query.py delete mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/client.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/client.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/data.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/garmin/__pycache__/data.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/__init__.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/activity.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/activity.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/health.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/health.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/utils.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/utils.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/weight.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/services/sync/__pycache__/weight.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/tasks/__pycache__/definitions.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/__init__.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/config.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/config.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/geo.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/geo.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/helpers.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/helpers.cpython-313.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/logging_config.cpython-311.pyc delete mode 100644 FitnessSync/backend/src/utils/__pycache__/logging_config.cpython-313.pyc create mode 100644 FitnessSync/backend/src/utils/sampling.py delete mode 100644 FitnessSync/backend/test_segment_optimization.py delete mode 100644 FitnessSync/backend/tests/__pycache__/conftest.cpython-311-pytest-7.4.3.pyc delete mode 100644 FitnessSync/backend/tests/__pycache__/conftest.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/__pycache__/test_analysis.cpython-311-pytest-7.4.3.pyc delete mode 100644 FitnessSync/backend/tests/api/__pycache__/test_discovery.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/api/__pycache__/test_frontend_assets.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/api/__pycache__/test_single_discovery.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/functional/__pycache__/__init__.cpython-313.pyc delete mode 100644 FitnessSync/backend/tests/functional/__pycache__/test_bike_setups.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/functional/__pycache__/test_setup_api.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/integration/__pycache__/test_garmin_auth_api.cpython-313-pytest-9.0.2.pyc create mode 100644 FitnessSync/backend/tests/integration/test_activities_api.py create mode 100644 FitnessSync/backend/tests/integration/test_bike_matching_job.py create mode 100644 FitnessSync/backend/tests/integration/test_discovery_fix.py create mode 100644 FitnessSync/backend/tests/integration/test_discovery_garmin_id.py create mode 100644 FitnessSync/backend/tests/integration/test_repro_segment_bug.py create mode 100644 FitnessSync/backend/tests/integration/test_segment_optimization.py create mode 100644 FitnessSync/backend/tests/integration/test_ui_rendering.py delete mode 100644 FitnessSync/backend/tests/services/__pycache__/test_discovery.cpython-313-pytest-9.0.2.pyc rename FitnessSync/backend/tests/services/{test_discovery.py => test_service_discovery.py} (93%) delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_analysis_export.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_bike_matching.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_download_validation.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_fitbit_auth.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_garmin_auth.cpython-311-pytest-7.4.3.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_garmin_auth.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_garmin_data.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_garminconnect_migration.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_mfa_flow.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_new_metrics.cpython-313-pytest-9.0.2.pyc delete mode 100644 FitnessSync/backend/tests/unit/__pycache__/test_sync_app.cpython-313-pytest-9.0.2.pyc create mode 100644 FitnessSync/backend/tests/unit/test_parsers.py rename FitnessSync/backend/tests/{test_segments_verification.py => unit/test_segment_matcher.py} (72%) delete mode 100644 FitnessSync/test.db diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..add3e55 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual Environment +.venv/ +venv/ +ENV/ + +# Databases +*.db +*.sqlite3 + +# Logs +*.log +test_log_*.txt +coverage_report.txt +pytest_output.txt + +# Security/Secrets +*.env +.env.* +*.pem +*.key +id_rsa +secrets/ + +# IDEs +.vscode/ +.idea/ + +# Tooling +.agent/ +.kilocode/ +.qwen/ +.pytest_cache/ +.mypy_cache/ +.coverage +htmlcov/ diff --git a/FitnessSync/backend/.coverage b/FitnessSync/backend/.coverage deleted file mode 100644 index 68f392df0beb122e400881ce716e7d72b5dec179..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeI)Pi)&%90zba>5@84 zJgX`_^_qL>jpe1)WwE;S;;Ch!_K71ILCeB|SQ4IlLA0eO>UL8K+o{=AE3ln45j12R zy5q|l&snsOW-Si57{=$dvR$KCfn1{`+MeCAye)BFZWY1+(b)pI8K@nUh_u%n4k3<2 z(dUIH>(Y}>Rr)FyN9@{sX8xm#nRNc(LH&vh%Vc>~dQ1$JhIaIeaqt1jhpGf<`V+*UDgMbmb|VmiJZ*sdewrmS`XS=+UM1xAY(!W%3NrFE7I zbXLWT&NZOZkGxCFD0mdPPMLGun6)2~Pfd}-JUg9Mg~-o!T5YZzilI&%xT9i@iW|65 zVeh+ccB#vLd55YqCg&Peu{w^u-jTh^FNl83LRbvPEeI|IwSdDDsr>PSx<;*1Zu;v@ z`sh@)I)NK*m#Om0C3?wTer!CQpPkjOtcMMSdCC<#@Ovx9P^0PX9?^98_~>@Sy=1tN za4%{$g)*vG&8C=QMhs`S{d)A z$I|(!DZQ(D1dmJnJTO!U-qY^_J0^nr&wkqq8shG}^KQ!c+<{d7`KeJE=PZ;<{F=Hv znFzD|Nix)L(V)-I=9PQ1fAM>fS4^@7px3^0ehY7w;8w4a?_I$e$Ax*KJD6QF8;uIO)?l zZC`|WxO-MQ(NDwQ;xyJa=E6M1lM4^?tJLY@{zWUTmgUr<`HH7ul`4(>+&TF?Y7n7_ zVvahcPhE6JnsK7hQ6914^cUM?!l|~bn(FRcDFZ29Xvn*gQ?t>_Rv-hrB?SiwGZQwf z3zjdco}`1(TpDJK#2PzurILA-j>KcAD$V>{@?LF+tGHa^SH4Of=Z|vTSv{RUdQ|Ur zq8_XUr?O9<1X@;H)@U;^)UtLQ>^HL4X_TgqNP~@w!3PX^Q=NfFL{;q-MHh#PJ|Jc0 z`2t@zw>5fTfdB*`009U<00Izz00bZa0SG`~{|O}Zgr4T>|AhIQX8u7hSReoa2tWV= z5P$##AOHafKmY;|cq9d~iR2+O{&n%XXEtWD=s)Tt%GjEu;9?1eC z(-43F1Rwwb2tWV=5P$##AOHaf^aQfWLwfu*Kq8ZzF`{n))ZhPK)68qVpjd$b1Rwwb z2tWV=5P$##AOHafKwwV=R`fBgd$`zeTe9f;fpmi6iszn_)xa;lVh5}AD@*5}<~91k z82`+cQ!Q3#k92B9->VjV>228bn?^;Sj+Cu-n|@@0@Bi!OHyS;#KmY;|fB*y_009U< z00Izz00bcLa0sl7bq^c==k-5+|L@_bSmXi%5P$##AOHafKmY;|fB*y_@PGu8dQ!`& z`~SB!^Y#Ne3zCHZ1Rwwb2tWV=5P$##AOHafKwwV=lF6K*?*BJ5v$3aH!O0;20SG_< z0uX=z1Rwwb2tWV=`$C{Qr5`YiOND>${CeGdT+@DN)u+CF_ld8>r~iEM*Y`gs%%5g| zY~1|p?@Y$X{r=s@?|gpZ`t{>i&$P#TrJtlVeyXLnria_T&G>lu{>z;cH;rh|V2BUH zeYd{8dNHZ)|8HyNb`%b85P$##AOHafKmY;|fB*y_009W>CxNjs!wB#H4}7h#pUQ`_ zKmY;|fB*y_009U<00Izz00bZq3Gn@YT>qmvKmY;|fB*y_009U<00Izz00j280RR6# euK)LU9iwy*fB*y_009U<00Izz00bZaf&Tz|JdO?k diff --git a/FitnessSync/backend/__pycache__/main.cpython-311.pyc b/FitnessSync/backend/__pycache__/main.cpython-311.pyc deleted file mode 100644 index 95f86ce6c2aab19ade83b7fd11f49c255ef580a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6242 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 Z=7u{|)6AiJM|IR`piZp<^3UMD{|_Fcvw8pk diff --git a/FitnessSync/backend/__pycache__/main.cpython-313.pyc b/FitnessSync/backend/__pycache__/main.cpython-313.pyc deleted file mode 100644 index 3f660c4a3bf8f1e35d62f8c2df7e34d734ba422f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5560 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 diff --git a/FitnessSync/backend/alembic/__pycache__/env.cpython-311.pyc b/FitnessSync/backend/alembic/__pycache__/env.cpython-311.pyc deleted file mode 100644 index e8eb25a90dbbbc3e2da86597e5bcb60e19a5c6fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3238 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 W$~P5Bm~5hxkdTB?zV=RNk?|jI^{j&c diff --git a/FitnessSync/backend/alembic/versions/__pycache__/1136125782ec_add_last_segment_scan_timestamp_v3.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/1136125782ec_add_last_segment_scan_timestamp_v3.cpython-311.pyc deleted file mode 100644 index 5b99a666fb7e3791678be49f77cddc4d8787fe81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1133 zcma)5y>HV%6hD6?aol{gg@O>Gjami*%9qomQB)zJmVu>0R2}eQIlgNfVLR^GDHN$v z28NCqkjlW&4f=nuu{ctP=%z|cY>~Qk;$5141SH_}?sxC`_wK!S@6KP6Nfp6RS4i`_ zh|mviTn>4poP7i35N#lgbc6*g+JYnMq9f^&z-`HvoroS8>arcxV>qHKBu-QuU51@F zrcV%w#Id|7-n)#AfK`U9tS2~2L=wMd!B@Jrz&AefP5y_kI`mE9#0ObV;S^57n#S@v z%BJ7%Kf^dOYWZ4av0PeI)t~(M zS&=F0WT#DBi?GOs3yHD<6I#FOZ2rwm>XHkGdxYKoXEUX5Imzx6Zk?Xg(f+oC2WbQU&MKV*{a-cG6gUlQ zya2w3P64nuZ^uP+9{D~eZgJo)S&=4SS<6ncm|@_SWf&|P?0HSt!Mi~DBWJPE8EJ%D zs=s5KwzW;1Jtq1l<)t#o4=76;hUvPkzzldJ41>mb2>u7r2@d>plo#<^jpxd;)52|= zJf#nSfpBX@jUJ#0O{`665ALJG_fuTlW}+ diff --git a/FitnessSync/backend/alembic/versions/__pycache__/1e157f880117_create_jobs_table.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/1e157f880117_create_jobs_table.cpython-311.pyc deleted file mode 100644 index e18edf271c8b8d8d9f78a4b651095d0e5e292088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3243 zcmb_eO>7fK6yCMRe;eBgX#fSH5CTOc@8VUrip4W36mnxup#Rj^HXA$sFrPPGBnztc%i(ShvR%AnBunZcB73& z)3>9a>sJ!?xcciCLRbOmT1^KI*t?EaV9Z)$oNH907yDfO?~CUDplAUXT4OhGa6PmF z`?R*bS9`Tq+B0HskNel;LIiiMrd_A8SG2GTE%2Ub5f@tUJ<*~rw9tE^HGfdF78lw( zZi-8Zi3a+=VfG?~y{J}MD+j~B8^}l0YxU=u_$ENyjVvlx*E2%(eDq$hLNT^~0 zOESM)JuF0hQ zgKG51V_1y8q~!s(CrbH&uy8HBR3Z!W7z*=W)YVb}jF~iPUdyo{4;xcp0SjE#Op+s% zp(*mfWa!h$YZEMRLDyBHXbhRWv+XmQFDP{O3YopAYlcacyk<6L$!nNAVB*XV!Yh6b zuRj@7ip9ZcC3^=pW>8T{VLG231Z#M7GX{4?8~KemI8dBrfl@I?6-;Oh;Pyi?egxi| z6aGa0N7oj{euK~DdHndo;^l9yEM8gt*g`QI#T*o?O71Kt%4e3&md|eNx6rVSh8;9q zmE2nPltW8R<)&3)p&=U$IcTUVQI{{2uWYng9Vxpb<#eQehN0s&8h6lmRpIt>clp$+ zX&oA}4-GkohF+K!8nw}=gGRR%dYAgjeSm^eHcB}tRh8tITgwNR+RN>$Qx;0tDB++) zRl?U3SPGRxtD_c*+bHg!ctv7GyT0pw-urFe^S&1Vciu+l9dv$skhByohha7EHsTlh z^8T;)?eQDV_zi1%#zHw8!Y;?&%m!MJ2bO4So3#F0x1?6n=>T9Up z_7ZS;x2HZ9i@Utrv+i91=~_c$7h7zz)-H~z`9GSVod8Zb+kh8I6@QU6r9gU6)srMl z^`cz4;j|C5;Gx4iDvGq9kL3o^K`sjM7gF`&CgHyqiZKjT_2OQA+`V{w;Y+*qxYK%k zv35_Z$h{r6U`_25jaKLisP2r$b&s#xZ-;ufC zJdEvxYzv*6-LbjId}(3w>G6e|PV*59@-M#QdJJ*e+1*X A$^ZZW diff --git a/FitnessSync/backend/alembic/versions/__pycache__/20ccc82af3f2_remove_btree_geometry_indexes.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/20ccc82af3f2_remove_btree_geometry_indexes.cpython-311.pyc deleted file mode 100644 index 2019efd55fd8d27c67ffe5aca167b6ea37149861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1123 zcma)5J8u&~5Z-&(K41Ju0s&EwSP2CN`HhKfMKpv0A*H}d!8NDz?KrWxhqHGMF%pss zij*#pLV-j&$p7F6oTU`jR!CHImeNHCvFkVwg9NN*zn!^nW_EUV?^8UkA~t@0Y_@&~ z2z}$m`H&~d$rq*^piP94hOmG|ORz;vv?WavxGh<-9nwN$UADqn1cx*QqM+jN8jHjc zZ3ZNWV!0{aI?s(5tBhG$i*Xi2h+eYHSGu&AZ*<}t{|{ev?3=)`x3ZSN2^?o@63caz zPQKnFV7t4ZH+%x1Z-HxrPr7=`!LSFOsy>I^me+Ef)YJ7^s+c!Tvr;sgrDpMr0k4*- znB~=K0pmio1nOe~h7YNA2Hd~+Fq1E23Z+z`T6<8amGjwBWwlzVsOooq^0Y{mI_z}7 zF@c6Q9kx+gprYH}ps}l)QH4zEps}ml(KvQrIr;?|ZxF*Vw{^>CfaOsYLmM3I>8?Y= z1pE$h%!`IIg@%|EoNbU{2%m&Va{|IR-S! zJ8_nsXXcNET;sr9(jtkmWg|UHBf5@VQ`c$O@3vbkf;WKhr%fZ1$}PQU*C zPXEPmaw$N0CIgfo7RnRi?qTUe=JWMnA#96$n4yAW*4skGl c?>KfpKt(14R2+o`Av!|SpiG<7?D#Hz0p>v%P5=M^ diff --git a/FitnessSync/backend/alembic/versions/__pycache__/24df1381ac00_initial_migration.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/24df1381ac00_initial_migration.cpython-311.pyc deleted file mode 100644 index 38748004d5a0ede651b3302a515979ce3b7eace1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11799 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 diff --git a/FitnessSync/backend/alembic/versions/__pycache__/73e349ef1d88_add_bike_setup_to_activity.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/73e349ef1d88_add_bike_setup_to_activity.cpython-311.pyc deleted file mode 100644 index d53f2629c4756fb7cfb61d6cdd98a4640282d499..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1678 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 diff --git a/FitnessSync/backend/alembic/versions/__pycache__/8c5791dd193e_add_missing_activity_columns.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/8c5791dd193e_add_missing_activity_columns.cpython-311.pyc deleted file mode 100644 index 41e919cb27c1a471bd8a0718daf4022846919b91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20080 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 Oii@*s=%S&jv;PN{z;lKG diff --git a/FitnessSync/backend/alembic/versions/__pycache__/8cc7963c8db0_add_last_segment_scan_timestamp.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/8cc7963c8db0_add_last_segment_scan_timestamp.cpython-311.pyc deleted file mode 100644 index 6167835cf97ba2e0fd802f65f6cd665893c7d98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1127 zcma)5y>HV%6hD6?aol{gg@O>Gjami*O5(Upn?w~7PzDA%5Ou(d<@k;^!gk!VQ)nfm z3=ADRAeDik8}$ERU`(VA(M^?@7?2`$>%_Y>{Rjxb>D}+%^Y7hz@7|q1CzC3I@$)fh zd=nA+&W-aS50#UzpzNbHgpq-;fJH}eMMHEYLlU?xIkFouA_HA^qDBly428srilfW0 z6UU4(B9SoPtLh7~)d(6*FY|1rnkn1%Qe|=8F5|j( z#*mlZt3{d?#*q21&CL7TEY|YZsf7uhgy2&=OAMfmj%B62LdQY>SAjGIPJ;r^ zfbXFb04&aXaTc9NzRihi9JotXqzPD7v*Rpgnz(73CX0sKegk&!7Eu1YS!{Sf8sU~2 zY&w=>ZxDBziGf9VsZ0t&%F?E3d0sQLLf!?_q;VdC|2uSy13w+*Mf_Idsj}=gamyhO z=^bEs{{#LI`jQ|BeK9J?eRKgSB+PZt?4NRsZgfVahi-PxrLUlgnYOYEd#6FVXu3D6 zwUfK8z1qjSdoPdDGaaOXbdlC8mWIT=gZWRnFV{O$xubNxgGwM>RO;pRwz~UtZ*K4H jf%M_s0q#uRKT164ARVNO^nO$n;(as7fK6yCMRzwr;Gp@wf2miCHC5k*CYX@ z%7H_UL2?9<9EnOaO_dzdTaG|?*7`eg3~OrCJJIm{(E%wt=Y&)E{ToIPRZ*|$B5 za*l+`=SFi4k^Y%Q4);}riX?i(deLej1o~Hp>ZJbP+z2PpgR)njtqvP z(fFl-cyzdD;L>m`67hQfU=fFHhI@+KD-k(G499I5HVX5GEnk>4e1|tP+_dh8;XAyY z;m7$|S!gi*Nh->zX(1~nNw#QsF)0uk7lpiRI4Q(MME+W#E$STWB40HXC{tt;Q;LSk@am{zq$0i?#Rl&Go-p zb6c!Ian;(9NIma(ZeEKu*LzxPvRHdx-+UHpZ@SZWjnr?k*6&FHj`(KA{38X|a@5=rM@P@RkZ}1Eyshm*#{+4hs?nL(Y;c z0ceJOl;xD+tL-9~kZstCqTw9NXG=NRa9x!Zk|ES^PARou7%<-gHw?!_HV^iZLgo~s zeqCz2frD0c+F_|;?^!MBzJN8#&y<(xzn-o(s0It1amgJIBsu#jw z4@I%}FmMa-tXTXvee5aB8?I6zLq$wz7nnQ&qsT6Jk^3DvAKhHO@iY8fUBWAu%b!2K zUcSB&Q&ChyQ5{8VoXiR>&p&=xezLC(w~>ls8j9&C zW^&X(+qccnPk(df`I(&-6^&|WR7ayVrSwX&EIpnn&uokzaXY(qxpHm0MQt6>S_kyj zfuHD$*_X50l{@;CJ8CkmqKt+zI?B}S9F_hNHk#1TgpMXaKu4#aj%(k)0^3O+{!}aJU9NxHks!MC>)?2za7Iu`K^h-FcDGg2OXbL8^PCMZAQ!pBhWfiOc zy|011>0PwcqitUo^GE8@wq;)j?q);cNPQpR%n?+mS1g*Otzeu6fI#Yd%>)uyb%jwa z{k@px3xb)X^dd;Xv(FYxK^kVdEI``HSRVF&p_X@1_-5k8At1H9yRp(Wque`YYWVE$WGGJ=mjiG3Xi>+wJLF w^e%n2e13WEnZ3O546Dr@y025^`k-rEU)34pZ}C;`HTsF2KUd}6K+FsI7wbHfcK`qY diff --git a/FitnessSync/backend/alembic/versions/__pycache__/a9c00e495f5e_add_segments_tables.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/a9c00e495f5e_add_segments_tables.cpython-311.pyc deleted file mode 100644 index 96dbfb70fdc2ec649748386407b36a5a8f181bcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4824 zcmcf_OKcm*bx97tq9{k9>^hcZ#a0kWiGGx*53L$@tk|$(NkwEM2<2e0;tc7vmb=XC zQnC~j@WBTk6+lK!UydVI{Um1bFd|7I*g zcjaL5{oAo-tgWbG1K7MsB{g?fRHQ|s=q!dwiKti?HI;=ZG0IfUHOvf?x8VuE^Qtw% z-DvpsfcF}6>@$M<);WHyVZUd+ek6n~fIi#B0T&0Jqb;C$)}ZrHHCA!Zv)R<+>{z)qdANmtq^9v><<{)s_G3>-!ov;DzuR#5dCL}@ z{b!By@4<^U@J@KKfbOj=h=FH~IPlQbQYoj!elOit9BANio6j4AP4#t8WHzvItCtr~ zzy(OU&)@b+a)4_?Go19uxEG7Z8`*81T^jaz!{|AAtlUl=E4QC`xHZny8)|y`Sh>C9 z;dYo8j+%AO94oi>W99b$jqK)njN+3JduI#2Ek8swJZ|%7wujpWxE=oy_wbC70RHf} z?Lch*w~TS_K*mTOmNBpZMN#K0i_|M3=9lp`C{7}3S%LCGAq=Tfk+3FA^c?OAv)DOB_KgNHUZnB~6AJi-i`oGE^t5S;`smvTUr1#%hVM zSguw>VNo*peui8mYnn>df~vOC-2)|4LML>YP!W^7R8|an0!+aY@_n%`t0-fj43$+G zN-Nf~yDXA?UZb#YtiB*)*3{S=UgAWNN;<(J-xJUbi5l)a0%epttLatJRtRMwuHs$F zB1>9Pgu-iSt*(ho^nMwyHPr=z7uL2XU|kX}XM*yZjKy80#ai9T{JO+KS2d+vR9X0j zYLEioZr-4>T42FziY6HhP0!DPe|V*Ni;Ig4a^GOdpHaCe(bZ4L>QznE4GIP~8r)?S zll#n(hULpBs@_!TgW$c?+^_GP)Hp)0C;}YH7^qb*I)Qr9+ z!r>5YlbWlQugtHiw=HzhMi(7)(dDLWeq?@9O!5f4b}AkW{at`zhY#PsBLu?_=fG-H*6AKQ+3O^Gx2L~N zej9oLD$m$x#z8YM;akpG$@ko?54SQGYPxdMyjcbNPuOU}K@%No3ys-m%t2$W1l-86O5BWZ z8x|U|(TIaaTnOjZTlvuZ5X^~2Z8YkjQ5W(*8u^PSbK9ELcgaRq9CQU(aLeC$GQ0i7 z_MD9_Iq1^vTHPCG65Jaw?C|0Hj(y%3w39yE(xJCIPCMwQ~EWo73@2Z$o)Bp;`JqXiqy}fSetxr4W(dEVP}k^NX$rxj8b1sa6teIgAd&I(*;qg&GM> zb8K#6I>td!{$cEe8cb61bX%ENYpJ6Njxtz6#qNJ*tQM*ia zQKbBPgz{2>@|(YwZ7J9HfH{7MOcpg&nf1yJr}{jV_W1bjZJ3?bf2)+xJ zaQ^lFN8zO9?JtE>R=w{;gtyK;h&%$?4(PVf@$&rOgXTx&_4y}V>z_L<=PY3mx-AU8 z97^v3x}Of4ecMT^tl|G*Mb&}|{L Z6FTR+8DL?(yUear zf>bF7RB?2rNNpt!Ikah`R8^0yME{4ij&`aN}?M)n7`XMoz`FZBO zH}B2P`@KoNOeSRn?ITaqs}Y2L;)_m`+LNaqOg=%^5Jn}01uPmuMJ$PxP$?wvb;yt^ z;ZoS2OGcy=1zFgLRpO;M$RZ_~BuEdAo&zs9R!Wi(Nnq)w_(~@Z0&U#aN~Hr_OGJ{` z)q-tkcLla`+cxztY!kk13MU^*rGq$y55VssEX||r!3Pg6V4P8xZz(RR*o3NXl@i6Z z6jgKeW!+to<*Q^_cXZ3lT)8xpDHq3cxk>frcww5fG{l+7sMA_5M~c%EHz$aEkrLG< znM(jOnL@5GIg-nd9mO(P zgcA5xQwtIRlNgK;jHkB1lkEa_+MQsI1vlK0B6Nq_`wfd-@(yv(257h1Hjw<#*U|>; z*$Vb;h_HguYC?C^AQBGah@0$KLELC(4j!W$aJsGFgk9(0-{iOF&Jo)H?^{8H7etP~ z?8q1a8Ra=9w`r#nho$zhasdbtGph#V(jY8R*6$La;~SqXJzm;L_czknZ;M`fs-B)|q^JIgLY#j8Ywuj` zoHtOYOXCe`-0O7z*jbVC7jrJ#%c6>cElp8a1j--Y0?IQ+`5Vom?HX(sJN&It4ed6m ztoRqi4(|#^u@1JH>$EP6laz%Vm$H^FwQ7Hd^f+jfhaNxB``JK`3D}5F_ zSFv!_AaBwfXgR-}KLDB`K@gf^M39;&fCESv^3dS({YP}v>+aj=nAhps=#1Chn-O%V ze>L_9yq$nvM<=!ibF0Zm)!O{0!?pJtseTXTpx04uJ3rA@oL(P)Jo42MFFn#oje2MT zdL2z{j}}(tN0)0uwfpO#wGY>^*L$YX^O}bW(CetsjK~5!72R-L7K&WHuA5P$p-MbY|5oF-|}A`xsCh+0^pq$-INqeGnx0a^`lJ%k<@itou`N|DMV znZ!j4c*x+<0Rp5$2M?{=BK;G(6mWM6&|ti&K+&N?0Ri4J^`1m2PT~MP+&kWTclX}i z?+*Mam(vi?li${z&n1NZ;+rYSiE?xR$}_Z%FftGpu;>as(GYu*AqjjhxpFUMq{h1J zDn=To43%VvhLshF#A#!WNF;;huK3>cZUk0!Y?X~Hw-S+LURuFddbtDNOyZmSAHLey zH;=QAWh0OCI0xSXme)|J@HMqCHoH#PaYB<4>`-EdW<(uLyG0&2f#Z9{o7Y>#PQ$v4 zuaIu@iq)7{NYEH`B2YrlzL|-Q)ga!s09E z)3HGNV11tWK%1ps<$Z{GK8xEIVFznMFdhh6kZQBM?R#BkGon@qFa+$(3H|sI&{4g} zh5B4lN>QE|(|Gf2-;H`669bDWs}o&W3#sF6{(_G9Q!j2*tbV`JvFxt^l8WV$UdOR3 z4+!P$4JyasHs3N1<^C2+NBvD07ee2KOV7dzJ^`_f{+5-;U&QkZKYsSZ&A7b!$E}0g zzi%9D#2aS3bZ4-1X9!ZZhO!k;nVy3{8`g|Ch8(9O9mL!FfyEOsl-e{8akK!UBu=oI z!_@C5;833J_)&TuG?wABGpXf$*z*;90Af;0J3g}*f7lwx*M{=7c*^5&xI7Df?b0ch zHcjl?rpc6Ws}EpPo<8Muuyg`((xl+NYq|Da(%Yi*+$YU_q#&fMV49Za`QfDRrb#p0 z&VN93jtdSn<=MSfzzcPy=i|sFpV9@e@_`Nh1u>EYK^TdOAdk>Yt&Y! diff --git a/FitnessSync/backend/alembic/versions/__pycache__/bd21a0528865_expand_activity_schema_metrics.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/bd21a0528865_expand_activity_schema_metrics.cpython-311.pyc deleted file mode 100644 index 60aa816f522af0c9b15a6b7e010a03cbab7ed32e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4995 zcmc&&O-vg{6kglUe~XO+A%BFB&0oO~z?c{zgnCHQs!1pTj7jUuYVi)lt-W@37Xm1i zIOLEchf3`s2M%qTD!m|?1Co(?=z-&`vT}hXN z)m<6Lx|8lw88V)vS9T|T#7}tHGlVT=Z?cZKh+l?j=ebJX9D02vFC+uZOPs{N??tX_ zzlL0YnH#jhV!&#NUt%aV{KMTp;s#Ns&b8KC3FJy%EQP53>vN z&a{`!sP5QzezsSZ9lE>9&iJKEb{?=-RtNV2y|2m~oNd<+@B-Vs+H3d1i8ai-m*c3a z?wY824yf*p$N&6ay){ww)kM`_6IK3z>T#{%x|*m4YN8rEpn6R znN!OXB3piD+AY?T44IR3j1|NgDXmyl^-NCFtUA^zCCR0rqK>tzRNR_Q@)#CKM9od5 zQ=(3+fTUE_N`m>^V}jbO;ck&va%#3*cIl|#oy$c<^oKnvn*!`mmc>*qGn-W`rzTmR zTf1fN9YrTI*qQsoOit3j=XThk|9ZGb%IABgq}1maob*T;lEs_pnIkF-w6vb;z(@T1 z_^dm>V0mZrGb;XDwH^CDg;`s{=wgZcljq#trynn0|JM19|7H8y&BEQ);ll9d4JwQp z!l;P|Vw0^gE zmyRW zv@p0jR2bU4N`?D|aNk6PQ4>Zfj8=DfeZyJwt@A~G6Sc<;VcbN7xCwCz@oHlC#^qxB zdPlKiQ>Vg&AxxNvkT4-ZAyG|aqq(^Hr0`@@rb65h;wBo zudOu}&aO5Wntw#;dxmh&M1)}zhA9kJONZCS3!khe3(0p44~`Hf^*vmvDa?BpJ1$s| zyu$+I!-H|zX*YnDUACEEo9VXA^w?&4Z8LqgnSR?$-Zrz&HZx$G8MMu;x6KUMW}dLk zYO}^v3@$KeVQ`*7GXwVKuAXIZhQVnDY@=427@TC#$e@8i2qEm; zJy+^vHJ2|REb2ApWlxRThG6;GoA2(%---1u%vuM&v@UVK;ch;%JhXDofKC%SDRi=D zlUYs~&}Kp#g|>>N#ei-Tx+!#5EawgAGNFq?*Ws2{10p6wC`2lpxBEF`K-h#Zg>Z#) z!GInUdMNZ9YN3~U4Tzc$r4TKX-eFp?bB|{Y=rEy!LPtey--1R=rNP9Z#_v4bNce>1 z6-7Ch5=G0SFXYoWwrn?2*|ubP%ZGINxYr(KqzwB|vY=jK9Q=B~SuRait&k{6ijvby z;fW@Ss-OAUHzl=>0Xw5rHeYW{=WE|kHYd+!$opy(z3k(I_6NeY%i(ZrJ3S8A=JueT zb6la^<+sx>+-Z6+ZE@ZFNVN_-7w1Us;}Caeev4icA|j%s?mQqL>UW Yy6tIlj5)Tsw=mM+=-lQGfzpKh1=Op*MF0Q* diff --git a/FitnessSync/backend/alembic/versions/__pycache__/cc3b223773cb_add_max_power_to_segmenteffort.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/cc3b223773cb_add_max_power_to_segmenteffort.cpython-311.pyc deleted file mode 100644 index e0748a2918ef5703aebcbf4c0ba385ef2a926687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1460 zcma)6&2Jk;6rcUDz25i(0&PJ^t(CMA1|_z4F%edUL_ZEi!H1fNW-p`Nok{9;zdE~a z8$P5QddM*cq;lYp1B9aT4D_+Z4};pZ zE1jC_nvP+ZYip+KOg%L2)QID>OsDDC%~o5#%&48v+7*CK&1f1Qt~6UKEd$I>%j_8D z>PKsB^Mkgo|0S+om$}xXcLp?YDbH;La8O<1au{`a>EvNtV_6-%bn-Y}CgHsR&z)t5 z*@1f#d$vQpnCpZ_G$1h!1DuW zi4ggP_1Wt{hv0pj#Xz@}U(`d$c|6ZMlwk&AD)34WbRyT~)p*K0rW5L8UYz&kb09?v z1|D3?qxBpU^>E!L1iPU(@B=Q#HqT$4+J$RDLboaV86Arwo~<|RC~7#idmE@|*dFzr zzT3DiSRt2cbQ;HS{3!{u9CW@UL%Fckri{j->uksGe#fSw=uhLE5IDc?^s2U^HNM}09 zhP_J=)~&zB3mB8o#hB-lov06+iRziS1}|hhXRV6wc(&)>r2Y=OuNF=1@V> za*CE-)~D!n`l248GwDpn8hZWQuC@ocXF-SP?9ozlx4bvl?|pZEe{)nlm!c-<5H*il z?acA+f%*N)qc_u2E2HXairSz<)IM4@cJ;lh`^)?H50r1eIUwocd!y3(DKbEZ$Qb8k T$&$wCB`nF3DVARelZN~QdqZWQ diff --git a/FitnessSync/backend/alembic/versions/__pycache__/ce0f0282a142_add_mfa_session_fields_to_api_tokens.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/ce0f0282a142_add_mfa_session_fields_to_api_tokens.cpython-311.pyc deleted file mode 100644 index 7562a62eb6ea50fc768e0115c159cd7b5686ff71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1968 zcmc&#O>Y}T7@pl7ukDRLXw~wqbZJ4tg(T~Bj6#Tzpyg17H5Ft05>~e)nNb#t8i(I>Q3}UOD;|K3}7oh#(6QiO8N*mo2%jSc)Y2iihh7 zE75CXPqmUHVWnuAYDArbnIvhAQH7=n-jHADuLuagoKmFVx#IA2Rc0hxm*6{6(8udtEhYj0l*5LCo^#e^? zqIYY;t>3sltGm?LFw7a#DNdVx4-IB@bDC@vOEX2sH4N<j2;}%<@FhoG?wj zI5TU!HESA^WwZSDw4rH#i3Aj6o?51NTGV$bPu%n&P(k8yqq)d4Cxh`68|;H;PKM)I z()h%;N6zdzb9{Hx_MCO<1zaPvNqsm}!{;iaVT<|hDDTinK~PemQ&<7v-I z5NI#C$hBjM@!Uxf*2oG7Amz6_xI&Neyl^rawCdC*PU!U6^j@{G+8Qr`eoZcU+J;nQ}Z@U$41ScPSHM z52j9v&pyj9WwN=&lda}0<`BwWf(RF(244Vdqd&2_v(SF?2l@MSbanRO`v*53%pc50 zOCLr0YDZs<0dXb9l?YdUJ4t=#;nG3%!P>!Ew7eSWm5yGC0dY0P)d*KlQN^nB4;Bs< zqLoUdS37z&2E_q^c7B4|R{o~Mo8EWtzKtKJ9?YZccVh5WsHY03` z-1Uac4lc#G6yefn=$HjWuwD$!9-Cq`9r_e$c+s ozPG1*_1PYY&R>l)Z$!uh>makMVrfn4q9-tirIHx_SLj{HKS%P!o&W#< diff --git a/FitnessSync/backend/alembic/versions/__pycache__/dbb13b0ba015_add_last_segment_scan_timestamp.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/dbb13b0ba015_add_last_segment_scan_timestamp.cpython-311.pyc deleted file mode 100644 index 01a5a33e29302988f8e6f98ae1a9091dc3e84349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1482 zcma)6&2Jk;6rcUDz25i(BKm=%woA$Z7ZQ8db!e@q1+@rqs4F$?fjzKV?@W>{`_YSp`UKgC${>^QMvvf+~ezK$JOiR+U%vHeI@Z;&lFcEdpX;%ZyN z-LBs3HoA60Z%sTTZfm;UT+xlz#}^FZs8=Yl6QW%OXlq8pSXpZ5OS+-y7u)Ao+Rf(j zg^SJBc|%qI<#(@%Oj#p$dL(cN%iRj#pqjwMFzT?<(ZiTRvpQJm=y9x!!*2p><}7!q z9XOkoXLpGgGZmAF1URoF{f~YUe=MfwKL2z6 z$-*C}o}5Z;l4|P%ZG8wRZw%#)bgJ|?WkaP7tw0{F0@TDw zljblDqpVAm7dt+bo&bv#`9qpqWdY`V#2hA9>GW6A_bv_O%R~8cI@NJD>|KJePVFsL zuq+%pmc{bPcI3ilyn4#7!3tTUGqU14p6xlC#NVd#Jf^^7q&T6hYFTy=go&MSIxLG8 zxu5@(=o|;$X3Fb&q5h}JsvqK>M=sGt@bbqSbHYcGAP6HdFUTV_g9;MPrfBhH{Rvl{r4xYyPnG z%RA|@rD1hBMJ><)Y8@;aJL>Ld{j>dV_oVN?+r#Pnxnb$U6d9lcWQ_8nuqlktOIQ+x MPsZ!7$1yGc0T6p@bpQYW diff --git a/FitnessSync/backend/alembic/versions/__pycache__/e9b8841a1234_add_segment_effort_metrics.cpython-311.pyc b/FitnessSync/backend/alembic/versions/__pycache__/e9b8841a1234_add_segment_effort_metrics.cpython-311.pyc deleted file mode 100644 index 7bc0cd5c963d6144c128249b53673c47a85581ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1592 zcmcIk&1)1%6tC{C`A8?@XHf94JFt#02c4Oo(Zs>*LES}#4d|-Dj?i{@Rg#H4-EDPG z)GR^{Iqg5N*F9)fiDyBG2SM*O(1%d4Cr{o6a`WV?`C=v@sNkdO*RNhx_xt*F{g=z> z2;|khrN*>|&Y)6C2r>~-i0Ua#)l?O!Yo2Ceg3T03nQ5Y#8JJm;-bCgE z$pGp^`x6zj>n)oQE27Iy>ceovoM4XUbjC^^Y?C zq9W8FoEKB0UlvoYTXhVhIx|ys9k-un_mKsJLZH1BMJ62s4rFzx6D3X!tO%{j^Iak8 zm>m!7TcB(Y7Kmss@fN(ZJ$!EqO1(WOH&VXUYii8vFtQ))H9h9_yK^N7D3X~M2gmsl zi3xjc*@{9+$xUct)^B;9?RZp7O1obq1-%LSuR*kE=HB(mT^i)kiHD|AUaH}G0b zU#O8S(wBOA>US@&W0AS)$8?#p7idrR=F^pu9fl>xcJEW4lx&YSorYUlqfD|hDvc7z z`ZA%=wuN1wcLc2-||J08DvhZoFt!At=0VuBYrUK~BjOTWEm?;gEff49!> z-s1(kU9b~C>?GLXgTanKI4;bg$o9#a?QH^lnf65eTB;K5t54$nC%cqL&9e-|!X_oi zONz-~v#9o3J4sj&_It}@g}W)Sqo9ci5$ z=VbMy?cZh_*AiUgxHdH1Z(}3D1|N*Blj5YvSQZIf%MzJBOZt3^9(cCruF&RVmXncW zS^sVmIT;fWwRhEtoWpG2U9o`C)Qf~pXb7B(tibP5hRL}1rS&O$p&5{tM}K8M!>+uG zq7a~?DT>lj(+ch&2?vmJoTFo-V;6y?KRRhNbz&pCd+4W)-0q=ifZX8?y@NHyRXS({ Nbxo;C!+z-2;4_f@XpaB@ diff --git a/FitnessSync/backend/main.py b/FitnessSync/backend/main.py index 2312e19..f7c05e9 100644 --- a/FitnessSync/backend/main.py +++ b/FitnessSync/backend/main.py @@ -21,29 +21,33 @@ async def lifespan(app: FastAPI): if database_url and not os.getenv("TESTING"): alembic_cfg.set_main_option("sqlalchemy.url", database_url) try: - command.upgrade(alembic_cfg, "head") - logger.info("Database migrations checked/applied.") + # command.upgrade(alembic_cfg, "head") + logger.info("Database migrations skipped (manual override).") except Exception as e: logger.error(f"Error running database migrations: {e}") else: logger.warning("DATABASE_URL not set, skipping migrations.") # Start Scheduler - try: - from src.services.scheduler import scheduler - scheduler.start() - logger.info("Scheduler started.") - except Exception as e: - logger.error(f"Failed to start scheduler: {e}") + if not os.getenv("TESTING"): + try: + from src.services.scheduler import scheduler + scheduler.start() + logger.info("Scheduler started.") + except Exception as e: + logger.error(f"Failed to start scheduler: {e}") + else: + logger.info("TESTING mode detected: Scheduler disabled.") yield logger.info("--- Application Shutting Down ---") - try: - from src.services.scheduler import scheduler - scheduler.stop() - except: - pass + if not os.getenv("TESTING"): + try: + from src.services.scheduler import scheduler + scheduler.stop() + except: + pass app = FastAPI(lifespan=lifespan) diff --git a/FitnessSync/backend/requirements.txt b/FitnessSync/backend/requirements.txt index fa119d8..9fac272 100644 --- a/FitnessSync/backend/requirements.txt +++ b/FitnessSync/backend/requirements.txt @@ -3,12 +3,12 @@ uvicorn[standard]==0.24.0 garminconnect==0.2.30 garth==0.5.17 fitbit==0.3.1 -sqlalchemy==2.0.23 -asyncpg==0.29.0 -psycopg2-binary==2.9.9 +sqlalchemy>=2.0.30 +asyncpg>=0.29.0 +psycopg2-binary jinja2==3.1.2 python-dotenv==1.0.0 -pydantic==2.1.1 +pydantic>=2.4.0 requests==2.31.0 httpx==0.25.2 aiofiles==23.2.1 @@ -17,3 +17,4 @@ pytest-asyncio==0.21.1 alembic==1.13.1 fitdecode>=0.10.0 geoalchemy2>=0.14.0 +testcontainers[postgres]>=3.7.1 diff --git a/FitnessSync/backend/scripts/repair_geodata.py b/FitnessSync/backend/scripts/repair_geodata.py new file mode 100644 index 0000000..a85d8c5 --- /dev/null +++ b/FitnessSync/backend/scripts/repair_geodata.py @@ -0,0 +1,96 @@ +import os +import json +import logging +from sqlalchemy import create_engine, text +from sqlalchemy.orm import sessionmaker + +# Configure logging +logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') +logger = logging.getLogger(__name__) + +# Constants +DATABASE_URL = os.getenv("DATABASE_URL", "postgresql://postgres:postgres@db:5432/fitbit_garmin_sync") +# If running outside docker, use localhost:5433 +if "db:5432" in DATABASE_URL and os.system("ping -c 1 db > /dev/null 2>&1") != 0: + DATABASE_URL = DATABASE_URL.replace("db:5432", "localhost:5433") + +def repair_geodata(): + engine = create_engine(DATABASE_URL) + Session = sessionmaker(bind=engine) + session = Session() + + try: + # 1. Repair Segments (Populate NULL geom) + logger.info("Starting segment geom repair...") + result = session.execute(text("SELECT id, name, points FROM segments WHERE geom IS NULL")) + segments_to_fix = result.fetchall() + + logger.info(f"Found {len(segments_to_fix)} segments with NULL geom.") + for seg_id, name, points_json in segments_to_fix: + try: + points = json.loads(points_json) if isinstance(points_json, str) else points_json + if not points: + logger.warning(f"Segment {seg_id} ({name}) has no points. Skipping.") + continue + + wkt_coords = [f"{p[0]} {p[1]}" for p in points if len(p) >= 2] + if not wkt_coords: + logger.warning(f"Segment {seg_id} ({name}) has invalid points. Skipping.") + continue + + geom_wkt = f"SRID=4326;LINESTRING({', '.join(wkt_coords)})" + session.execute( + text("UPDATE segments SET geom = ST_GeomFromText(:wkt, 4326) WHERE id = :id"), + {"wkt": geom_wkt, "id": seg_id} + ) + logger.info(f"Fixed Segment {seg_id}: {name}") + except Exception as e: + logger.error(f"Error fixing Segment {seg_id}: {e}") + + # 2. Repair Activities (Populate NULL start_lat/lng from streams) + logger.info("\nStarting activity coordinate repair...") + # Join with activity_streams to find valid coordinates + result = session.execute(text(""" + SELECT a.id, a.activity_name, s.latitude, s.longitude + FROM activities a + JOIN activity_streams s ON a.id = s.activity_id + WHERE (a.start_lat IS NULL OR a.start_lng IS NULL) + """)) + activities_to_fix = result.fetchall() + + logger.info(f"Found {len(activities_to_fix)} activities without coordinates but with streams.") + + fixed_count = 0 + for act_id, name, lats, lons in activities_to_fix: + try: + # Find first non-null coord + start_lat = None + start_lng = None + for lat, lon in zip(lats or [], lons or []): + if lat is not None and lon is not None: + start_lat = lat + start_lng = lon + break + + if start_lat is not None: + session.execute( + text("UPDATE activities SET start_lat = :lat, start_lng = :lng WHERE id = :id"), + {"lat": start_lat, "lng": start_lng, "id": act_id} + ) + fixed_count += 1 + except Exception as e: + logger.error(f"Error fixing Activity {act_id}: {e}") + + logger.info(f"Successfully fixed {fixed_count} activities.") + + session.commit() + logger.info("\nGeodata repair complete.") + + except Exception as e: + session.rollback() + logger.error(f"Critical error during repair: {e}") + finally: + session.close() + +if __name__ == "__main__": + repair_geodata() diff --git a/FitnessSync/backend/src/__pycache__/__init__.cpython-311.pyc b/FitnessSync/backend/src/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index dff409bc1ea3cc965658cb3ca3e4ad7995b3fba7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmZ3^%ge<81l@CeGC}lX5CH>>P{wCAAY(d13PUi1CZpd4BO~Jn1{hJq H3={(Z2cH}h diff --git a/FitnessSync/backend/src/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 151587e223be20088a23eb9c496858810ccb2aee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmey&%ge<81l@CeGC}lX5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~ieenx(7s(x{C zNorn+en3%vR%&udvA$boNk~y*a<&nOm6uvv99)@~te*rFNzF^qFD^>fkB`sH%PfhH k*DI*J#bJ}1pHiBWYFESxG!tZJF^KVznURsPh#ANN02Uf3)c^nh diff --git a/FitnessSync/backend/src/api/__pycache__/__init__.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 7593985b0008cf1e3e9ca95d061dd14db54fb2ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 141 zcmZ3^%ge<81l@CeGC}lX5CH>>P{wCAAY(d13PUi1CZpdNy9e@A; diff --git a/FitnessSync/backend/src/api/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 1ee0b4f7645238db28a091f7729150f8a0aaaa83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmey&%ge<81l@CeGC}lX5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~imenx(7s(x{C zNorn+en3%vR%&udvA$boNk~y*a<&nOm6uvv99)@~te*rFNzF^qFD^>fPb|pPkB`sH o%PfhH*DI*J#bJ}1pHiBWYFESxG#6xVF^KVznURsPh#ANN0Mtw>LI3~& diff --git a/FitnessSync/backend/src/api/__pycache__/activities.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/activities.cpython-311.pyc deleted file mode 100644 index 4f41bca603cea417de59ba12b5ffa3177affd78b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51799 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 R%1t#vn&yo8Kk0Vye*tf(ja>i$ diff --git a/FitnessSync/backend/src/api/__pycache__/analysis.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/analysis.cpython-313.pyc deleted file mode 100644 index c8836a0e859aa8a23b5aec517a187314a3aa4404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13336 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 diff --git a/FitnessSync/backend/src/api/__pycache__/auth.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/auth.cpython-311.pyc deleted file mode 100644 index 26a76459bebff8febd417c8e402ae1a3591ced81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20365 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 diff --git a/FitnessSync/backend/src/api/__pycache__/bike_setups.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/bike_setups.cpython-311.pyc deleted file mode 100644 index 4aa8edf76781bd2db45d1bc3f70910dd240f224d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9638 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 diff --git a/FitnessSync/backend/src/api/__pycache__/bike_setups.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/bike_setups.cpython-313.pyc deleted file mode 100644 index 8b785873f0021b29047c78ab899647ee1d8d673e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8804 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 diff --git a/FitnessSync/backend/src/api/__pycache__/config_routes.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/config_routes.cpython-311.pyc deleted file mode 100644 index 142f05480a7fd7e9dbf2ddb408baedcee0301da2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7328 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 diff --git a/FitnessSync/backend/src/api/__pycache__/discovery.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/discovery.cpython-311.pyc deleted file mode 100644 index acdcb6a513153952d6a23076ca5517c715e002fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3748 zcmcgvO>7&-6`uX&KP8HiNQu_3?HCLiDQ+86PV5#+?YMDMLp9~1W?d5$cSNtUOER-7 zJ2EJgC=Aps0yHfIB!{9;Oi90)20nT#1&Q z`qbg_3ojY zg`B{lj@Lw8%1MqaXtFNnWROKg(tNr<=XYdT3+TaI(2;#wNDt@2j_lVWdNdbx63?{X``q?pG~Tw~cffv9iDyZ={{cFa7VN<6 z+?y9G%O+*E?+mTdvSQegAI{Iuoqe}RtEO5hr#ah~rH0{(ex+biQ`PAMd`RdMUoRLG zeq(bL!z?kH{mENDE|d!;%0MX>E9FJC1X3bPOFAu^XH=tDxlY+ima^+=k)}nv$J4!` zYUs$G;vzMcHPasaL7}XuxN_S{ws?)|1$!{7mP;D-=3k`mEK|cQx*P2x=F(yKKKv8F zj|d0(WO}h6#PniC$dV^_M{JeU$hzQ~>&EWby+T&G8uwH30S9^Ie7ds%wOMfHI5ET< z{JX+sasx(Q2A|xXG12zR=> z*S4>%Ht-q7$G@JKE>x@23x(p_5YlOb72#f;Ryw;sRb63mTnM2DzQ!K_{so^pxgVSS z_(b#YiS1aX8OzkqTY>n!z~tS)X&x#J*j^L*yz`dh%U>Ca|A?)d% zDLsDt_?dl9hYI!~5jOJ~`Tvx5N$DhfQxUx}St2@0~WsI%5f`$QakL~P!$6P2a6q6GVE}PmMH^sO1@y)QEz0ivRpRp zkU|%hOZjTSyk?|h3^$RDB4F@rp36~GV<Hubi@gIOX`6@_yURYn)j;5Q@bp2e*Pa^SVc%%`&^l|c|Lw_FqX!PDh=I%u1 z??3zO%HOVjcC~qWu92PJK0V)<$ZStsYEE3LpWPWfdT%sycQj)S9%>H0XvLFOEU`A$ z@{zHbT_TRjj}W%SRQ>$>p;j;HiPg_pkwlBgQpkbZoaOKNUG%rnFA^_V@&2_LYcR3) zwly%gma~S2|2WzTNXg(X0eFM}QXm9U0A_dKt0)PltoZQ#fswTevP=qKWz3ZcCWSPU~h=MNr6-d;--iT}VrI$SW~bv3sh8 zWuSla8YJ?yil*2hrd0E^YN%SJY)8#yR^Hbc)YWnxs-pzs$6;B9j0YNc?F773 zwUwJR?*=*FS&N;(kr{*;gp&xbBD{p~jRon{I(reurDgVA9FA4VrV*S{JdV=00SpYI zTY^pn+Q~gOaFTA%pHnaroiP3ZaG)%AV##~4m+!`2w)#`e{$o~hteKo{%Zbq@R?ToT zezX-LeaCl++y_|>P(R=5`~MW1l}K9s$)^<=`wl$Mh4hf^TPy%uRaJ)R&oJ*9CbbL9GIP$;&e6&iabcH3F<74x=h2+Fe(gU6zAkI@ zd+Z!^Aqg0_0O3HzaTa-{@$AbYla21nA|s9NYljRqx-W~o*66-0GSTS1cF0Vl`?5&2 z@xQK?OoH*-L%&JAm#WJxQQ+Y4=Ruh8{$HnlmAd`&J7e|KHg~egorDST;rEYyIJMoE zZuX^H(l`h73Sfm(EdhRa{5^Y0r)O6n{Hr*X$FXm~Uo_Y1<@H~p)l8Gi9I!fqRspQY X;g$fuj@6FR=|QVAIF;{GJ5l;Co?1+r diff --git a/FitnessSync/backend/src/api/__pycache__/discovery.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/discovery.cpython-313.pyc deleted file mode 100644 index 0a8ee2bd09aa85047a918f2ecba928665911392c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3225 zcmb_e&2JmW6`%d&he%2kC6X2`k&@*!G-5GMEK5qN0&*nBr4mEsia;9?Ay&%~y*9OE zW>#+KOW7XUv^^9~5h(4YK^veB&_jDo3l#kiOeiRcsf`#Yg2FedGTKWHeY50}vMU!k zbO^qA^Jd=LnfLLVISK~-2wLe~-Ta3ap}+Hi+teO&loAm70BJ}Q)=^dqFT92{^oWJ(vxVki+}dhqEJO zBpW8->?j${Mo1)u3c?JU?`?yOY5oaB#tUP)^X?W0y*5+`Yk?)PAkLt|_&n^Gw~K-n zER1NOf^t#Th9}Ss`G(N97kh@Kk!M&67a~1Nqfc3imm}%1NBo0niTPGGzL~4;*_bfT zDz0IxL|O3a=H|xQy9Tb=X4Ogy%%fpSyR5gQ+t@aD@gtEN5SV;frx^P1MwQxSg0*kG z@uqI+WlTV*8dYn@ECUzQaCsM7_NqyZ>Mcy_8YZ_)1E*y++?QQ3D|{mZK@QWsip`?0 z=~l_)U+!7ajO%z;XHm_x$`#z#&*69WFtrVSHn;J-I0OHqUph<*a$~FKZ-ln^A)JMz}_w1%n8BL=X(DOZ&5`1|_Ora!7!LN*# zr6k%B7Ni{^EnG{>gr_$d0>T2TE1N5qSG2WaKKBL-m9bqcZ5L@T4kGizXt(QU=IMzk z|7t45u4b-RcX5VN8yue5Ak`b#uxaLsX>StUxcL(2EU={2EhDoH5{P<+5+kG6%uLA* z&|IxfB78rb48xzk4CE1Np!?yOk1w^(Txy=VbP!%>WZS+-%Qw^X&3xvYz3XX*#(xt0 zw}kv>TfW)9`ewhRr$Fxq=T?S<-zl$1fA9hGsei@m`HSoU_O>rWyQx7TO+p0ITGgVs zxLYmZ3R8EwDIu1&jee}a9Cwri|D!L#qsJqf7y3~XA!^5UU^#EgLO&Xp!Ch#pANib% zA>D-z9aMDAcTC)4zp}1_TTkk1!g-Kt;*wxVc`+A!a+Z%^|DhA4639pXTdqk<(jJ_* zww6JbnwKN!>J@}6PhQRO2tL)e#$7?)lZ(3ipa*GuFmgGNPPqJ_2kGg-$mKM7Np@qA zLT_G0Xo!0|>CWfXuj;+6>AsHQTFfh&vLw%^4)=-7)LPZFY|4B)gu{kq)R`BO-_|Vyvq0a5S)#DmZ@36VS)hz9 zOu$^JsM{>mUujhLESn9L@b+H0Skvw6G#w@Z*c+MRgaZhZtm=1}hu~U8H!$H|V_~=A zpt>E1q-2t>=Z<2kUgMZdc>NLX1~S752Q)Iv2~Q9vRj`%z5*{$Zi;W|KgRV?*4o{xr zGihfA3Jf5XGQps5g#ui38{s)XUT_J|4%!CNK#%=s__>d^4?^k2>m4r&Mp}W%W?-@v z$bTIF?de~i{>@ZtdZ9VJ@TYJ8x$tS>k8ih@H=4^E_q5IC^5(tig?rQa#@fTFv#qIx z=F~zvdb$-o*NmQPN8;^pY(IG?+3}#{Vh71dwJ9eW+0Fv_>!03a_^N?ZB z1Q{{Mf#|6QCEACT!IYc4mINg#=cQhWDtY;&>t(ACIC&*^0)T*&XV+5=q$h!faw231 zCzfa*F7oo$m}~wdkQjiYCc?!hIRz|>5guj;lce*>3M9y)`D!Is)^PDFcPMk!)z`2)zP!8zF@|(p6wdTaVzX!4iE0?&+ z4}mS*(Ln6U6@gw+mjNWK`hY&13FjhKG8tUeLFZW4i?z6 z%?h3CKGwSLkI}x8>#}+`iec)!z3ALP&aW;9h`Mp(cN0^I^Qd$l4@~AC?t%;V^C!qT zngcn^`*qmsUIl-HyarPo%IRGo9Z3*`&(VAn%|Adh576Wn=+p!B>H{?W1zP+Z)ecbY zP(}X8PZJIGpRy!GI{_qmf0X!s;=QfA$wuOyumtmwi4W%vM$?B%N>JN@L`Q=Dp?CN( tA0J6be5E4-*SR9Ny5ITedt7(nxNZz|gJ(Jt^o}m{TzBzM1kO3he*i3Co@D?4 diff --git a/FitnessSync/backend/src/api/__pycache__/logs.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/logs.cpython-311.pyc deleted file mode 100644 index f9823133f75708d61ac483deaf7df37435310756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1390 zcmZux%WEV>7_aKrbkB1qCY#-fxVsV|;~_b_E`kpjmc)r}@Y1j}ZCB0E*e|Pk!12`4 z1y{^r1R=QyIYnjj$IL(uO`QT>40xC&d)kv<^<)yGsjmLj_o}Mj_f>WOR;!f}w4Z+6 z@^=)3{*=nR85hF&-yrNGf(Q;!h;1Aywt}Uu1Zt?+S|O`}9vZe0mh2Kn3ZnQ3X1$oN zg=|wn9YnNei0D*1Qo#rBtl1Vd4+|c1%X}mTHK=uWuA<}85wLs#@2tT-3NeXA%Ey)K zYZe~hcwD_cqot&lpc^fc0VrvHa!mE77v?dF+WzO4xB!_OW+i3cfVLjQa~*|3d; z^^wczr!k=c1ZZ16PldUiq<$Q^fp@{H80Pt%e*@}1qR7Ss*~%A)s#GKR5m+hIf+&}g zT1W=fuQCR|cInq|^c#g$u35U2Oeqlyaw&_(&M@+};{FrLlQ`m3C_WKZoKWUU*23Va zn+~`rg_Lu*PemCFEOk;pq{5^TnMqAXy_ga1BrNtIk`hs$n|iJvP||Iegy}eu8&by+ zWyc9)G6P6pK%ZzU`Lc|-2wGeoYqC!Y1cAvjDhPb57o^~7 zKs{z9mYLJwY!O1vuml1C*F}NqDgkX{b`K0f5B$(ig%S69oTlF8wFaM@^*y}j^1Ijs zbszN+94GFwJ78%m>;VkyZ2&Ik-M`OTFbK0xQ%BZ_t%BN=?i#>f@MLION7Z`vxS-x` z*F>r3!ciwalUJ2#0K!a$#EnwlW4ct0beQ;2pUHngaX7+Y#rIHTE>zf!ElHo;tzb5* zi{$d!d^EcNAFy{pl^O9@08jTgi;6X5u?j z^nV!nFQxU>m1_|x<`1p!TF*O&pZtFBWc9tQHNg*0@Wa#Q?a|VR9k_=dkDF_g=GsYf zEniq3y>oyM+|l~a>%Xi|bpzL@2q3T2rz(u6)y9>v@Vr!!@;)p#RpzmUxv0uNJ&{xO diff --git a/FitnessSync/backend/src/api/__pycache__/logs.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/logs.cpython-313.pyc deleted file mode 100644 index c7f53a65d416852f22b1fb7106e5967e2c3870ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1228 zcmZ8g&u<$=6rR~%-u2HqO`6E%hY6{`2Wknmpa4RGBC0xRS~46Lt+wm2*|6R^n(A3ZsL3JWm%4Z$PA2%|fsLxFY-Fq(R9?3f)3tQ?y=cEZYm1bZ2IlyV@7c((!nWZX_@&D{R%E4ZGoR^w%iG2^gH`+z ztNNvD7OOSLfptKaJC^$wTJ;mXYRgdGCwFh{XCui$*)gJ6(# zM~TMeAoz9^CJUt&1icu9OyZQM8OmmyN`-8grWv|HTSBu!0_2w0f@YPeRF}-kca%Wn-bR-@O zo?4fu>kUn=uK!`J!zLvmUr?yJ3oV0lGt# zBgexy?SrEe^2>4{|6}q>Dib$^4Xx=7b93|Z%TmzKvVKgD!=J9cupL^Rma3;Fj(?YHXL>#}iSgkJ15xhgKX3Rl$p8QV diff --git a/FitnessSync/backend/src/api/__pycache__/metrics.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/metrics.cpython-311.pyc deleted file mode 100644 index 9cee51bdfd4510c2f486767b48e40df969d55eb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17932 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 Oz^-cU=^#Xy`2PYYfkiI> diff --git a/FitnessSync/backend/src/api/__pycache__/scheduling.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/scheduling.cpython-311.pyc deleted file mode 100644 index 036b8d4c0f11bc2de87b59bc08bc3784fbba31b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9479 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 diff --git a/FitnessSync/backend/src/api/__pycache__/scheduling.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/scheduling.cpython-313.pyc deleted file mode 100644 index 1af445ea4884385dfa135ed86eb6487c85060c2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7911 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 I6upoC8~U(EF8}}l diff --git a/FitnessSync/backend/src/api/__pycache__/setup.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/setup.cpython-311.pyc deleted file mode 100644 index 39e393e247f830949ecf02ec93d94450db76982f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29689 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 diff --git a/FitnessSync/backend/src/api/__pycache__/status.cpython-313.pyc b/FitnessSync/backend/src/api/__pycache__/status.cpython-313.pyc deleted file mode 100644 index 5a1e3d60e124d5eeef313fd225f4b392810c2e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10173 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 diff --git a/FitnessSync/backend/src/api/__pycache__/sync.cpython-311.pyc b/FitnessSync/backend/src/api/__pycache__/sync.cpython-311.pyc deleted file mode 100644 index 220b6cf2504b1ed7fc4b73e5c031186e43a47287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20721 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 Z^?}ue&0B7N3^SgGMUS(O5JDyB{{=gKh%f*E diff --git a/FitnessSync/backend/src/api/activities.py b/FitnessSync/backend/src/api/activities.py index 691ff52..5bd8246 100644 --- a/FitnessSync/backend/src/api/activities.py +++ b/FitnessSync/backend/src/api/activities.py @@ -1,30 +1,26 @@ + from fastapi import APIRouter, Query, Response, HTTPException, Depends, BackgroundTasks from pydantic import BaseModel from typing import List, Optional, Dict, Any -from sqlalchemy import func -from ..models.activity import Activity import logging from ..services.postgresql_manager import PostgreSQLManager from sqlalchemy.orm import Session from ..utils.config import config +from .status import get_db # New Sync Imports from ..services.job_manager import job_manager -from ..models.activity_state import GarminActivityState -from datetime import datetime -from ..services.parsers import extract_points_from_file -import fitdecode +from ..services.activity_query import ActivityQueryService +from ..services.activity_file import ActivityFileService +from ..services.parsers import extract_summary +from ..models.activity_state import GarminActivityState +from ..models.activity import Activity router = APIRouter() logger = logging.getLogger(__name__) -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session - class BikeSetupInfo(BaseModel): id: int frame: str @@ -85,39 +81,17 @@ async def list_activities( Return metadata for all scanned activities, indicating download status. """ try: - logger.info(f"Listing activities with limit={limit}, offset={offset}") - - # Query GarminActivityState (all known activities) - # Left join with Activity to get file status - - results = ( - db.query(GarminActivityState, Activity) - .outerjoin(Activity, GarminActivityState.garmin_activity_id == Activity.garmin_activity_id) - .order_by(GarminActivityState.start_time.desc()) - .offset(offset) - .limit(limit) - .all() - ) + results = ActivityQueryService.list_activities(db, limit, offset) activity_responses = [] for state, activity in results: - # Determine logic - # If activity exists in 'Activity' table, use its details? - # Or prefer GarminActivityState metadata? - # State metadata is from scan (Garth). Activity is from file parse (db import). - # Usually Activity data is richer IF downloaded. - is_downloaded = ( activity is not None and activity.download_status == 'downloaded' and activity.file_content is not None ) - download_status = 'downloaded' if is_downloaded else 'pending' - # Or use state.sync_status? state.sync_status is 'new', 'synced'. - # 'synced' usually means downloaded. - - # Construct response + activity_responses.append( ActivityResponse( id=activity.id if activity else None, @@ -125,7 +99,7 @@ async def list_activities( activity_name=state.activity_name, activity_type=state.activity_type, start_time=state.start_time.isoformat() if state.start_time else None, - duration=activity.duration if activity else None, # Duration might only be in file parse? Or scan could get it? Scan currently doesn't fetch duration. + duration=activity.duration if activity else None, file_type=activity.file_type if activity else None, download_status=download_status, downloaded_at=activity.downloaded_at.isoformat() if (activity and activity.downloaded_at) else None, @@ -142,8 +116,6 @@ async def list_activities( is_estimated_power=activity.is_estimated_power if activity else False ) ) - - logger.info(f"Returning {len(activity_responses)} activities") return activity_responses except Exception as e: logger.error(f"Error in list_activities: {str(e)}") @@ -166,73 +138,11 @@ async def query_activities( Allow advanced filtering of activities. """ try: - logger.info(f"Querying activities - type: {activity_type}, start: {start_date}, end: {end_date}, status: {download_status}") + activities = ActivityQueryService.query_activities( + db, activity_type, start_date, end_date, download_status, + bike_setup_id, has_power, has_hr, has_cadence, is_estimated_power + ) - # Start building the query - query = db.query(Activity) - - # Apply filters based on parameters - if activity_type: - if activity_type == 'cycling': - # Match outdoor cycling types - # Using OR filtering for various sub-types - from sqlalchemy import or_ - query = query.filter(or_( - Activity.activity_type == 'cycling', - Activity.activity_type == 'road_biking', - Activity.activity_type == 'mountain_biking', - Activity.activity_type == 'gravel_cycling', - Activity.activity_type == 'cyclocross', - Activity.activity_type == 'track_cycling', - Activity.activity_type == 'commuting' - )) - else: - query = query.filter(Activity.activity_type == activity_type) - - if start_date: - from datetime import datetime - start_dt = datetime.fromisoformat(start_date) - query = query.filter(Activity.start_time >= start_dt) - - if end_date: - from datetime import datetime - end_dt = datetime.fromisoformat(end_date) - query = query.filter(Activity.start_time <= end_dt) - - if download_status: - query = query.filter(Activity.download_status == download_status) - - if bike_setup_id: - query = query.filter(Activity.bike_setup_id == bike_setup_id) - - if has_power is not None: - if has_power: - query = query.filter(Activity.avg_power != None) - else: - query = query.filter(Activity.avg_power == None) - - if has_hr is not None: - if has_hr: - query = query.filter(Activity.avg_hr != None) - else: - query = query.filter(Activity.avg_hr == None) - - if has_cadence is not None: - if has_cadence: - query = query.filter(Activity.avg_cadence != None) - else: - query = query.filter(Activity.avg_cadence == None) - - if is_estimated_power is not None: - if is_estimated_power: - query = query.filter(Activity.is_estimated_power == True) - else: - query = query.filter(Activity.is_estimated_power == False) - - # Execute the query - activities = query.all() - - # Convert SQLAlchemy objects to Pydantic models activity_responses = [] for activity in activities: activity_responses.append( @@ -259,8 +169,6 @@ async def query_activities( is_estimated_power=activity.is_estimated_power ) ) - - logger.info(f"Returning {len(activity_responses)} filtered activities") return activity_responses except Exception as e: logger.error(f"Error in query_activities: {str(e)}") @@ -269,52 +177,20 @@ async def query_activities( @router.get("/activities/download/{activity_id}") async def download_activity(activity_id: str, db: Session = Depends(get_db)): """ - Serve the stored activity file from the database. + Download the original activity file (FIT/TCX/GPX). """ try: - logger.info(f"Downloading activity with ID: {activity_id}") - - # Find the activity in the database - activity = db.query(Activity).filter(Activity.garmin_activity_id == activity_id).first() - - if not activity: - raise HTTPException(status_code=404, detail=f"Activity with ID {activity_id} not found") - - if not activity.file_content: - raise HTTPException(status_code=404, detail=f"No file content available for activity {activity_id}") - - if activity.download_status != 'downloaded': - raise HTTPException(status_code=400, detail=f"File for activity {activity_id} is not ready for download (status: {activity.download_status})") - - # Determine the appropriate content type based on the file type - content_type_map = { - 'tcx': 'application/vnd.garmin.tcx+xml', - 'gpx': 'application/gpx+xml', - 'fit': 'application/octet-stream' # FIT files are binary - } - - content_type = content_type_map.get(activity.file_type, 'application/octet-stream') - filename = f"activity_{activity_id}.{activity.file_type}" - - logger.info(f"Returning file for activity {activity_id} with content type {content_type}") - return Response( - content=activity.file_content, - media_type=content_type, - headers={ - "Content-Disposition": f"attachment; filename={filename}", - "Content-Length": str(len(activity.file_content)) - } - ) - except HTTPException: - # Re-raise HTTP exceptions as-is - raise + return ActivityFileService.get_file_response(db, activity_id) + except HTTPException as e: + raise e except Exception as e: - raise HTTPException(status_code=500, detail=f"Error downloading activity: {str(e)}") + logger.error(f"Error downloading activity: {e}") + raise HTTPException(status_code=500, detail=str(e)) @router.get("/activities/{activity_id}/details", response_model=ActivityDetailResponse) async def get_activity_details(activity_id: str, db: Session = Depends(get_db)): """ - Get full details for a specific activity. + Get full details for a specific activity, merging DB metadata with file summary stats if needed. """ try: activity = db.query(Activity).filter(Activity.garmin_activity_id == activity_id).first() @@ -326,9 +202,9 @@ async def get_activity_details(activity_id: str, db: Session = Depends(get_db)): if activity.file_content and (activity.distance is None or activity.elevation_gain is None or activity.avg_hr is None): try: if activity.file_type == 'fit': - overrides = _extract_summary_from_fit(activity.file_content) - elif activity.file_type == 'tcx': - # overrides = _extract_summary_from_tcx(activity.file_content) # Optional TODO + overrides = extract_summary(activity.file_content, 'fit') + elif activity.file_type == 'tcx': + # overrides = _extract_summary_from_tcx(activity.file_content) # Optional TODO pass except Exception as e: logger.warning(f"Failed to extract summary from file: {e}") @@ -360,14 +236,14 @@ async def get_activity_details(activity_id: str, db: Session = Depends(get_db)): elevation_loss=val('elevation_loss', 'total_descent'), avg_cadence=val('avg_cadence', 'avg_cadence'), max_cadence=val('max_cadence', 'max_cadence'), - steps=activity.steps, # No session step count usually + steps=activity.steps, aerobic_te=val('aerobic_te', 'total_training_effect'), anaerobic_te=val('anaerobic_te', 'total_anaerobic_training_effect'), avg_power=val('avg_power', 'avg_power'), max_power=val('max_power', 'max_power'), norm_power=val('norm_power', 'normalized_power'), tss=val('tss', 'training_stress_score'), - vo2_max=activity.vo2_max, # Usually not in simple session msg directly but maybe + vo2_max=activity.vo2_max, avg_respiration_rate=val('avg_respiration_rate', 'avg_respiration_rate'), max_respiration_rate=val('max_respiration_rate', 'max_respiration_rate'), is_estimated_power=activity.is_estimated_power or False, @@ -432,10 +308,7 @@ async def redownload_activity_endpoint(activity_id: str, db: Session = Depends(g raise HTTPException(status_code=401, detail="Garmin not authenticated or tokens invalid. Please go to Setup.") garmin_client = GarminClient() - # Double check connection? if not garmin_client.check_connection(): - # Try refreshing? For now just fail if token load wasn't enough - # But usually token load is enough. pass sync_app = SyncApp(db, garmin_client) @@ -447,8 +320,7 @@ async def redownload_activity_endpoint(activity_id: str, db: Session = Depends(g try: from ..services.bike_matching import process_activity_matching - # Fetch fresh activity object using new session logic or flush/commit handled by sync_app - # Just query by garmin_id + # Fetch fresh activity object using new session logic act_obj = db.query(Activity).filter(Activity.garmin_activity_id == activity_id).first() if act_obj: process_activity_matching(db, act_obj.id) @@ -485,8 +357,11 @@ async def update_activity_bike(activity_id: str, update: BikeMatchUpdate, db: Se raise HTTPException(status_code=404, detail="Activity not found") # Verify bike setup exists if provided + from ..services.activity_file import ActivityFileService + from ..models.activity import Activity + from ..models.stream import ActivityStream + from ..models.bike_setup import BikeSetup if update.bike_setup_id: - from ..models.bike_setup import BikeSetup setup = db.query(BikeSetup).filter(BikeSetup.id == update.bike_setup_id).first() if not setup: raise HTTPException(status_code=404, detail="Bike Setup not found") @@ -581,7 +456,9 @@ async def sync_pending_trigger( job_id = job_manager.create_job("sync_pending_activities") db_manager = PostgreSQLManager(config.DATABASE_URL) - background_tasks.add_task(run_sync_job, job_id, limit, db_manager.get_db_session) + # Default limit to 20 if not provided + actual_limit = limit if limit is not None else 20 + background_tasks.add_task(run_sync_job, job_id, actual_limit, db_manager.get_db_session) return {"job_id": job_id, "status": "started"} @router.get("/activities/sync/status") @@ -613,6 +490,9 @@ async def get_activity_geojson(activity_id: str, db: Session = Depends(get_db)): raise HTTPException(status_code=404, detail="Activity or file content not found") points = [] + # Use cleaner import if available, otherwise strict usage of extract_points_from_file + from ..services.parsers import extract_points_from_file + if activity.file_type in ['fit', 'tcx']: points = extract_points_from_file(activity.file_content, activity.file_type) else: @@ -639,294 +519,25 @@ async def get_activity_geojson(activity_id: str, db: Session = Depends(get_db)): logger.error(f"Error generating GeoJSON: {e}") raise HTTPException(status_code=500, detail=str(e)) -def _extract_streams_from_fit(file_content: bytes) -> Dict[str, List[Any]]: - streams = { - "time": [], - "heart_rate": [], - "power": [], - "altitude": [], - "speed": [], - "cadence": [], - "respiration_rate": [] - } - try: - import fitdecode - import io - - start_time = None - with io.BytesIO(file_content) as f: - with fitdecode.FitReader(f) as fit: - for frame in fit: - if frame.frame_type == fitdecode.FIT_FRAME_DATA and frame.name == 'record': - timestamp = frame.get_value('timestamp') - if not start_time and timestamp: - start_time = timestamp - - if timestamp and start_time: - # Relative time in seconds - t = (timestamp - start_time).total_seconds() - - # Helper to safely get value with fallback - def get_val(frame, keys): - for k in keys: - if frame.has_field(k): - return frame.get_value(k) - return None - streams["time"].append(t) - streams["heart_rate"].append(get_val(frame, ['heart_rate'])) - streams["power"].append(get_val(frame, ['power'])) - streams["altitude"].append(get_val(frame, ['enhanced_altitude', 'altitude'])) - streams["speed"].append(get_val(frame, ['enhanced_speed', 'speed'])) # m/s (enhanced is also m/s) - streams["cadence"].append(get_val(frame, ['cadence'])) - streams["respiration_rate"].append(get_val(frame, ['respiration_rate', 'enhanced_respiration_rate'])) - except Exception as e: - logger.error(f"Error extracting streams from FIT: {e}") - - # Apply LTTB Downsampling - try: - from ..utils.algorithms import lttb - target_points = 1500 # Plenty for 4k screens, but much smaller than raw 1s data - - # We need a primary axis to sample against, typically Time. - # But LTTB is 2D (x,y). We have multiple Ys for one X (time). - # Strategy: Use Time vs Power (or HR/Speed) to pick key indices? - # Or simpler: Just LTTB each stream independently against Time? - # Independent LTTB might misalign peaks across streams (e.g. HR peak might slightly shift vs Power peak). - # Better: Pick 'Power' (most volatile) as the driver for indices? - # Or Simple Decimation for speed? - # Actually, let's just LTTB each one. The slight misalignment is negligible for visualization. - - # Check if we have enough points to warrant sampling - count = len(streams["time"]) - if count > target_points: - # Create (time, index) pairs to find which indices to keep? - # No, standard LTTB takes (x,y). - - # Helper to LTTB a specific stream - def sample_stream(name): - if not streams.get(name) or len(streams[name]) != count: return - - # Filter out Nones for LTTB? No, preserve index? - # LTTB requires values. If we have gaps, it's tricky. - # Let's replace None with 0 (or prev value) for sampling purposes? - # Or just use simple uniform sampling (decimation) which is "good enough" and keeps perfect alignment. - pass - # CHANGING STRATEGY: - # LTTB is great for one line. For aligned multi-series, simple bucket averaging or decimation is safer to keep alignment. - # However, decimation loses peaks. - # - # Let's try: "Bucket Max/Avg". - # Or simplified: Use LTTB on the "most interesting" metric (Power) to select the timestamps, then sample others at those timestamps. - - # Implementation: Use simple N-th sampling for now to guarantee alignment and speed improvement. - # It's an order of magnitude faster than full LTTB and robust for "Loading Speed" requests. - - step = count / target_points - indices = [int(i * step) for i in range(target_points)] - # Ensure last point included - if indices[-1] != count - 1: indices[-1] = count - 1 - - sampled_streams = {k: [] for k in streams} - - for idx in indices: - for k in streams: - if idx < len(streams[k]): - sampled_streams[k].append(streams[k][idx]) - - return sampled_streams - - except Exception as e: - logger.error(f"Error during downsampling: {e}") - # Return original if sampling fails - - return streams - -def _extract_summary_from_fit(file_content: bytes) -> Dict[str, Any]: - summary = {} - try: - with io.BytesIO(file_content) as f: - with fitdecode.FitReader(f) as fit: - for frame in fit: - if frame.frame_type == fitdecode.FIT_FRAME_DATA and frame.name == 'session': - # Prefer enhanced fields - def get(keys): - for k in keys: - if frame.has_field(k): return frame.get_value(k) - return None - - summary['total_distance'] = get(['total_distance']) - summary['total_timer_time'] = get(['total_timer_time', 'total_elapsed_time']) - summary['total_calories'] = get(['total_calories']) - summary['avg_heart_rate'] = get(['avg_heart_rate']) - summary['max_heart_rate'] = get(['max_heart_rate']) - summary['avg_cadence'] = get(['avg_cadence']) - summary['max_cadence'] = get(['max_cadence']) - summary['avg_power'] = get(['avg_power']) - summary['max_power'] = get(['max_power']) - summary['total_ascent'] = get(['total_ascent']) - summary['total_descent'] = get(['total_descent']) - summary['enhanced_avg_speed'] = get(['enhanced_avg_speed', 'avg_speed']) - summary['enhanced_max_speed'] = get(['enhanced_max_speed', 'max_speed']) - summary['normalized_power'] = get(['normalized_power']) - summary['training_stress_score'] = get(['training_stress_score']) - summary['total_training_effect'] = get(['total_training_effect']) - summary['total_anaerobic_training_effect'] = get(['total_anaerobic_training_effect']) - - # Stop after first session message (usually only one per file, or first is summary) - # Actually FIT can have multiple sessions (multipsport). We'll take the first for now. - break - except Exception as e: - logger.error(f"Error extraction summary from FIT: {e}") - return summary - -def _extract_streams_from_tcx(file_content: bytes) -> Dict[str, List[Any]]: - streams = { - "time": [], - "heart_rate": [], - "power": [], - "altitude": [], - "speed": [], - "cadence": [] - } - try: - root = ET.fromstring(file_content) - # Namespace strip hack - start_time = None - - for trkpt in root.iter(): - if trkpt.tag.endswith('Trackpoint'): - timestamp_str = None - hr = None - pwr = None - alt = None - cad = None - spd = None - - for child in trkpt.iter(): - if child.tag.endswith('Time'): - timestamp_str = child.text - elif child.tag.endswith('AltitudeMeters'): - try: alt = float(child.text) - except: pass - elif child.tag.endswith('HeartRateBpm'): - for val in child: - if val.tag.endswith('Value'): - try: hr = int(val.text) - except: pass - elif child.tag.endswith('Cadence'): # Standard TCX cadence - try: cad = int(child.text) - except: pass - elif child.tag.endswith('Extensions'): - # TPX extensions for speed/power - for ext in child.iter(): - if ext.tag.endswith('Speed'): - try: spd = float(ext.text) - except: pass - elif ext.tag.endswith('Watts'): - try: pwr = int(ext.text) - except: pass - - if timestamp_str: - try: - # TCX time format is ISO8601 usually - ts = datetime.fromisoformat(timestamp_str.replace('Z', '+00:00')) - if not start_time: - start_time = ts - - streams["time"].append((ts - start_time).total_seconds()) - streams["heart_rate"].append(hr) - streams["power"].append(pwr) - streams["altitude"].append(alt) - streams["speed"].append(spd) - streams["cadence"].append(cad) - except: pass - - except Exception as e: - logger.error(f"Error extracting streams from TCX: {e}") - return streams @router.get("/activities/{activity_id}/streams") async def get_activity_streams(activity_id: str, db: Session = Depends(get_db)): """ - Return time series data for charts. + Return time series data for charts. + Delegates to ActivityFileService for caching and parsing. """ try: - activity = db.query(Activity).filter(Activity.garmin_activity_id == activity_id).first() - if not activity: - raise HTTPException(status_code=404, detail="Activity not found") - - # 1. Try fetching high-res streams from ActivityStream table - from ..models.stream import ActivityStream - stream_record = db.query(ActivityStream).filter_by(activity_id=activity.id).first() - - if stream_record: - # Map DB columns to API response format - return { - "time": stream_record.time_offset or [], - "heart_rate": stream_record.heart_rate or [], - "power": stream_record.power or [], - "altitude": stream_record.elevation or [], - "speed": stream_record.speed or [], - "cadence": stream_record.cadence or [], - "respiration_rate": [], # Add if needed, not in ActivityStream model currently? Oh, I didn't add it to model? - # Actually I should check if I added respiration_rate to ActivityStream model in step 61/105 migration. - # In migration: I did NOT adding respiration_rate. - # In parsers.py: I only capture 'time_offset', 'latitude', 'longitude', 'elevation', 'heart_rate', 'power', 'cadence', 'speed', 'distance', 'temperature', 'moving', 'grade_smooth'. - # The old endpoint had respiration_rate. - # If it's missing, I'll return empty or I should have added it. - # For now return empty list to avoid breaking frontend. - "distance": stream_record.distance or [], - "temperature": stream_record.temperature or [] - } - - # 2. Check DB Cache (Legacy) - if activity.streams_json: - return activity.streams_json - - if not activity.file_content: - # Just return empty if no file and no streams - return {} - - # 3. Fallback: Parse on the fly AND save to DB - # This mirrors the behavior of lazy loading but using the new robust table - try: - from ..services.sync.activity import GarminActivitySync # avoid circular imports if possible, or use parser directly - # Actually better to just use parser and save manually here or import the function. - # But the logic is already in GarminActivitySync._save_activity_streams. - # However, GarminActivitySync needs GarminClient init. - # Let's just use the parser directly and insert like in _save_activity_streams - - from ..services.parsers import parse_fit_to_streams - data = parse_fit_to_streams(activity.file_content) - if data: - # Save to DB - new_stream = ActivityStream(activity_id=activity.id, **data) - db.add(new_stream) - db.commit() - - return { - "time": data['time_offset'], - "heart_rate": data['heart_rate'], - "power": data['power'], - "altitude": data['elevation'], - "speed": data['speed'], - "cadence": data['cadence'], - "distance": data['distance'], - "temperature": data['temperature'], - "respiration_rate": [] - } - except Exception as e: - logger.error(f"Error lazy parsing streams: {e}") - - return {} # Return empty if all fails - + return ActivityFileService.get_streams(db, activity_id) + except HTTPException: + raise except Exception as e: logger.error(f"Error processing streams: {e}") raise HTTPException(status_code=500, detail="Error processing activity streams") + @router.post("/activities/{activity_id}/estimate_power") async def estimate_activity_power(activity_id: int, db: Session = Depends(get_db)): """ diff --git a/FitnessSync/backend/src/api/analysis.py b/FitnessSync/backend/src/api/analysis.py index 04b1d34..88e67d1 100644 --- a/FitnessSync/backend/src/api/analysis.py +++ b/FitnessSync/backend/src/api/analysis.py @@ -20,10 +20,7 @@ from ..utils.config import config router = APIRouter() -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session +from .status import get_db class EffortAnalysisData(BaseModel): effort_id: int diff --git a/FitnessSync/backend/src/api/auth.py b/FitnessSync/backend/src/api/auth.py index 811b7cd..35608c3 100644 --- a/FitnessSync/backend/src/api/auth.py +++ b/FitnessSync/backend/src/api/auth.py @@ -16,15 +16,11 @@ from ..models.api_token import APIToken from ..models.config import Configuration from garth.exc import GarthException import garth +from .status import get_db router = APIRouter() logger = logging.getLogger(__name__) -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session - class GarminCredentials(BaseModel): username: str password: str @@ -151,7 +147,13 @@ def complete_garmin_mfa(mfa_request: GarminMFARequest, db: Session = Depends(get else: raise HTTPException(status_code=400, detail="MFA verification failed.") + raise HTTPException(status_code=400, detail="MFA verification failed.") + except Exception as e: + if "No pending MFA session found" in str(e): + raise HTTPException(status_code=400, detail="No pending MFA session found.") + if "Invalid MFA code" in str(e): # Handle GarthException message + raise HTTPException(status_code=400, detail=f"MFA verification failed: {str(e)}") logger.error(f"MFA verification failed with exception: {e}", exc_info=True) raise HTTPException(status_code=500, detail=f"MFA verification failed: {str(e)}") diff --git a/FitnessSync/backend/src/api/bike_setups.py b/FitnessSync/backend/src/api/bike_setups.py index d485911..f96e95c 100644 --- a/FitnessSync/backend/src/api/bike_setups.py +++ b/FitnessSync/backend/src/api/bike_setups.py @@ -9,15 +9,11 @@ from ..models.bike_setup import BikeSetup from ..models.base import Base from ..services.postgresql_manager import PostgreSQLManager from ..utils.config import config +# Import shared get_db dependency +from .status import get_db logger = logging.getLogger(__name__) -# Reusing get_db logic (it should ideally be in a shared common module, but for now reproducing it to avoid circular imports or refactoring) -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session - class BikeSetupCreate(BaseModel): frame: str chainring: int diff --git a/FitnessSync/backend/src/api/config_routes.py b/FitnessSync/backend/src/api/config_routes.py index faa18e2..171ab33 100644 --- a/FitnessSync/backend/src/api/config_routes.py +++ b/FitnessSync/backend/src/api/config_routes.py @@ -7,15 +7,11 @@ import json from ..services.postgresql_manager import PostgreSQLManager from ..utils.config import config +from .status import get_db router = APIRouter() logger = logging.getLogger(__name__) -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session - @router.post("/setup/load-consul-config") def load_consul_config(db: Session = Depends(get_db)): logger = logging.getLogger(__name__) diff --git a/FitnessSync/backend/src/api/discovery.py b/FitnessSync/backend/src/api/discovery.py index 6b70c1d..9fac77e 100644 --- a/FitnessSync/backend/src/api/discovery.py +++ b/FitnessSync/backend/src/api/discovery.py @@ -2,26 +2,25 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from datetime import datetime -from ..models import Base # Ensure models are loaded if needed +from ..models.activity import Activity from ..services.postgresql_manager import PostgreSQLManager from ..utils.config import config from ..services.discovery import SegmentDiscoveryService from ..schemas.discovery import DiscoveryFilter, DiscoveryResult, CandidateSegmentSchema, SingleDiscoveryRequest +from ..services.parsers import extract_activity_data + + +from .status import get_db router = APIRouter() -def get_db_session(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session - @router.post("/segments", response_model=DiscoveryResult) def discover_segments( filter: DiscoveryFilter, - db: Session = Depends(get_db_session) + db: Session = Depends(get_db) ): service = SegmentDiscoveryService(db) @@ -32,7 +31,9 @@ def discover_segments( candidates, debug_paths = service.discover_segments( activity_type=filter.activity_type, start_date=start, - end_date=filter.end_date + end_date=filter.end_date, + min_frequency=filter.min_frequency, + max_candidates=filter.max_candidates ) @@ -57,7 +58,7 @@ def discover_segments( @router.post("/single", response_model=DiscoveryResult) def discover_single_activity( request: SingleDiscoveryRequest, - db: Session = Depends(get_db_session) + db: Session = Depends(get_db) ): service = SegmentDiscoveryService(db) @@ -78,12 +79,34 @@ def discover_single_activity( distance=c.distance, activity_ids=c.activity_ids )) + + # Fetch activity type for frontend context + act_type = None + # Use cached session or query fresh? logic in service used it. + # We can query quickly here. + act = db.query(Activity).filter(Activity.id == request.activity_id).first() + if not act: + # Fallback to Garmin Activity ID (passed as int, convert to str) + act = db.query(Activity).filter(Activity.garmin_activity_id == str(request.activity_id)).first() + + if act: + act_type = act.activity_type + # Fallback if DB type is missing but file exists + if not act_type and act.file_content: + try: + parsed = extract_activity_data(act.file_content, act.file_type) + if parsed and parsed.get('type'): + act_type = parsed.get('type') + except Exception: + pass # Ignore parsing errors here + return DiscoveryResult( candidates=results, generated_at=datetime.now(), activity_count=1, - debug_paths=None + debug_paths=None, + analyzed_activity_type=act_type ) diff --git a/FitnessSync/backend/src/api/metrics.py b/FitnessSync/backend/src/api/metrics.py index 31cd8ca..7fbc89e 100644 --- a/FitnessSync/backend/src/api/metrics.py +++ b/FitnessSync/backend/src/api/metrics.py @@ -14,10 +14,7 @@ router = APIRouter() logger = logging.getLogger(__name__) -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session +from .status import get_db class HealthMetricResponse(BaseModel): id: int diff --git a/FitnessSync/backend/src/api/scheduling.py b/FitnessSync/backend/src/api/scheduling.py index c58b182..c8b19e1 100644 --- a/FitnessSync/backend/src/api/scheduling.py +++ b/FitnessSync/backend/src/api/scheduling.py @@ -15,10 +15,7 @@ from ..services.scheduler import scheduler router = APIRouter() logger = logging.getLogger(__name__) -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session +from .status import get_db class ScheduledJobResponse(BaseModel): id: int diff --git a/FitnessSync/backend/src/api/segments.py b/FitnessSync/backend/src/api/segments.py index a35c244..9c03b86 100644 --- a/FitnessSync/backend/src/api/segments.py +++ b/FitnessSync/backend/src/api/segments.py @@ -7,14 +7,10 @@ from ..services.postgresql_manager import PostgreSQLManager from ..utils.config import config from pydantic import BaseModel import json +from .status import get_db router = APIRouter() -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session - class SegmentCreate(BaseModel): name: str description: Optional[str] = None @@ -100,7 +96,20 @@ def create_segment(payload: SegmentCreate, db: Session = Depends(get_db)): elev_gain += diff # Determine Activity Type - raw_type = payload.activity_type or activity.activity_type + # Prioritize DB > Payload > File Extraction + raw_type = activity.activity_type or payload.activity_type + + # Fallback to parsing file if type is missing + if not raw_type and activity.file_content: + try: + from ..services.parsers import extract_activity_data + parsed_data = extract_activity_data(activity.file_content, activity.file_type) + if parsed_data and parsed_data.get('type'): + raw_type = parsed_data.get('type') + print(f"DEBUG SEGMENT TYPE: Inferred '{raw_type}' from file content") + except Exception as e: + print(f"DEBUG SEGMENT TYPE: Failed to extract type from file: {e}") + final_type = 'cycling' # Default if raw_type: @@ -382,6 +391,20 @@ def save_custom_segment(payload: SegmentCreateCustom, db: Session = Depends(get_ bounds = calculate_bounds(payload.points) + # Discovery results (payload.points) might be already simplified or high-res. + # For geom, we'll use them as is, or apply a slight RDP if they are very dense. + # Given they come from discovery, they are likely already reasonably dense. + + # Create WKT for Geometry + wkt_coords = [] + for p in payload.points: + if len(p) >= 2: + wkt_coords.append(f"{p[0]} {p[1]}") + + geom_wkt = None + if wkt_coords: + geom_wkt = f"SRID=4326;LINESTRING({', '.join(wkt_coords)})" + segment = Segment( name=payload.name, description=payload.description, @@ -389,7 +412,8 @@ def save_custom_segment(payload: SegmentCreateCustom, db: Session = Depends(get_ elevation_gain=elev_gain, activity_type=payload.activity_type, points=json.dumps(payload.points), - bounds=json.dumps(bounds) + bounds=json.dumps(bounds), + geom=geom_wkt ) db.add(segment) diff --git a/FitnessSync/backend/src/api/sync.py b/FitnessSync/backend/src/api/sync.py index 80565ab..d483d9a 100644 --- a/FitnessSync/backend/src/api/sync.py +++ b/FitnessSync/backend/src/api/sync.py @@ -19,6 +19,7 @@ from fitbit import exceptions from ..models.weight_record import WeightRecord from ..models.config import Configuration from enum import Enum +from .status import get_db router = APIRouter() logger = logging.getLogger(__name__) @@ -59,11 +60,6 @@ class JobStatusResponse(BaseModel): message: str cancel_requested: bool -def get_db(): - db_manager = PostgreSQLManager(config.DATABASE_URL) - with db_manager.get_db_session() as session: - yield session - from ..services.garth_helper import load_and_verify_garth_session from ..tasks.definitions import ( run_activity_sync_task, diff --git a/FitnessSync/backend/src/jobs/__pycache__/segment_matching_job.cpython-311.pyc b/FitnessSync/backend/src/jobs/__pycache__/segment_matching_job.cpython-311.pyc deleted file mode 100644 index fe1541ae3fe5b57b217e9a367b826b6245e6cdf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3836 zcma(UO>7fa`ptO!Kepq8&>PmH) zxL*uQ-KlO0(MUj-ds+$!k=qnPcj3<(sb0Q|4+v2{D8zCMANsR1)yGpwG#-9N4xAsS z40lpcl)PMcMgsxXp1G`=U(c(X*50Zl6jVS1Nx?+tb2%9kLa<3Vmr=8q1Pm1aWqBnn zWeS;9a~b}ftf;G4NWQ;xu1$1h0?QNYzp!Xi0UY;uZ)Yz^Qd!(L1%m4leyjAv>S(|*e zbw@*Xo_InXXzd|X33l)f#yd3x`nqm8>~|>ydF&>?+aU99J4%F_MCv;o4w_%{lpyB3 zrv&etol7|YRs|tS-bz>JMhDYajlSo#ODG35pB5|yz*1k~)Ip?@ph*yo3Jq_q!gRttTFZtaNyg)V}1<c86)x`c-qQc&Ju4?7rjHnVMEB^?&Q}eoQ!Sk!yF>O{do_EzpWmKy2hkK#m<`&B z2Z@!Hqfjk-OJ{r>jI;6zr^=j?%@nwdC~{D~NU6*V3YRJHoJ2|?r(O~yF0-1+7ZlYz zrC60yNtiq^N%c}Vsb;X6FRWV3_2hi34}x8w;+m+Iyj(5=)tjH;#``fT zj+oSGgFQ9(`?+`LlJn_5Tv#%KtAd*5SJH~ra}4LFYXaWHq+%Kl@TlPsg#sq&Z}`@V zd`1=0&;%Nb6AILDx&y)cE0BpA?3GhCl+WbmqD_=$Zj<9u+s*$xewUoku_?-@bMt?jkjaxli^wKJ%^;cjWpkR*Tv zXa;~16jJ9%F76(0j!b5X#mSXS_7kDNPbxS&392iTO)ggaAQgx~iQ=Zwhu7N9v2Eg6 z;7&S|@*(t?64j?{BvyLr`SX-me6B~t%b)!T&3@? z%U>^Voqx*4bate2;{IIqH*z(ZA<&v^vBnm4wpeA0Potxi3$^HB9aK48KQOd)?rD7N zj;9u%(&JMN)E!9D7W|8Eo7z74xF@dnOx*dP)^l9%Io?2Yc<^y#;Kt(h#VR*bSqEUv zT4Yv_%vK|_^~gYD2y{0MFu`+T%1Z(|G!uI@g8Bw;&Q*f71Bv?wYlG9Z*a6@TQJGv(sSpTly?`+T^tF5l+(25d!$qgs=~| z1)s3NFVB2&=JUmCi(8A2NyJAhAJm5v_0eMur(-(UKo$suo+C#f^pXIeHNk60y{>); zqZfkF0*~45FPFYps`ekRxB$SsAGV$~c3NkrtL(HXh^s{Z-gD>uZ=?63HTI~^9$Zd9Wuf%q6-1KT@VcQzUr7?o$h6j(@zHI8D+2JQ4%=z9`(eKmC=cUKpgcS{Hw24Eh+KX|`4(c%NB%i_q1(9=Z~|$k+XLio_BdB~TW<)6I(q=-&5+?sc8X-yM1yM;fo7yHO zUpGduNo|%At5o;eiD|+7D8O!Vp-&O;dOj;C30w7nvTIiHNP8P*!?FKA(68wqm+>;N~xD-cj85;NU#Xm>z)1Kxl~ zK)eWNAFW(DaT{rFbE2w}2rQ-b%l`gSSGE6^f4FXy!3w?&qR$(Q{YJA|;Avg|g4cHz zve1%DS=_RaH{^!0xlL@#f-3SNaY2?;nU{%+(oq#&Auh?Ps_`0eS=N=yU1CQzRFgM} zD{@n{c#F6yx70S@Ca%dHwaa&j>vB)+^L=7h-ckqrfVd%Vt3!TB+>}S^m>&~w$`f_U zPk~!K*53MKL728RFI@PEfVcZJ9uK17RQo21$53#(?_Pe0F9mY7J2j)8@y#>=SN|xY z;mEufL99dC8JOrxWM;tjtGJI_UI<^B(HmiO6o4=HX5-*>JOtc+?rRl|yUQM&isv^M z9k_2*s`rAC2&Ynni=mZ^=u-5AnNDb;7%DL~fNpPr&jy27W1;bHxE8*8+di8Y`Vdpw zka=DTD5)->srZw~GZ<4B(bs%P>LnCam$2e~rL>-=xVnrr$6tQEcF@|N;=ZoX<`L!g z6b0A#PtBbKGI=r{>KfX{s+Ud?x{k&AvJVdy+NDv+D!qr}8(6FM;Rd_}uRu4kP)-)n z^(MN;(s_bzLbtG3N(^3t-U9QJUBi>zoOk@mq|^5U$Q^bP9duM23Yl~~FB(V2^BzrR zH_l@y!tFoN_n`-Wm*gQluWZY*GPalIbyZ^4-IU$=Ul}`1^UBzHnpegiq#HRp`~W8eCIUEoT-4$@C6Li{4JT&Q{7{=mmK5sJ`J zLOS3a5wEBf>4MAbs*)^2nYpAYvIPrVVl`kcjON2Ft^lQxeL3@ZM7%&VV`+b9mqpCJQBlB zckQ=>QM%5obQ&9tPya=p4btHhVw>g}8s5p-+w=TN6W33sb`;v!P7SK&g-(Yf`%x!3 z^!a3B)6c2BL3U-{qa$y0Jhr3v+CrM3u7)>R@-81DuD_09l4d818tO{-x91gfZfP~c zWTgAkvF^{C)=twa9cnwh=8k$e(V0c`!#Tbj400f&^}jjjc=DlpG%NKmCb*b+R!KN1 zlt|R#>ol?y6Uw9;F(!=+M}-PG{ufRg0mp?Zd0xDDd+;L_7#?8lKUy^gJOBUy diff --git a/FitnessSync/backend/src/models/__pycache__/activity.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/activity.cpython-311.pyc deleted file mode 100644 index 178207fcba31149744e45975cc47df432599ac32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4627 zcmb_eO>EoP5vFA7|Cg35|7H_=WjmH*%fC|EZgykGb{c0l2@uDN3TO#Ne3H55k3v#T zyeA!caBsS;jyk0(l0(pw3+!PF?4dv}B*25fQ-GfKmLfgvsq-GKBzD9WC`w7xoB8I= z%$u3_=KV1i3sdkE{!kJ01V#M=6TQcGHh6mkgYPJw;yofIc}gD1Tk=W+r2&a9(UPy^ zll&#W6etCxU@0htN+Bs+3VX1;SByx}Qk0Ab#F!K>#bHeIJ~1IBOGyvqrEXKa|MwIh zK*{F=6!ijr&QoIe;6rLI^b;oM!nXgGBGx6@4&0G-R7I-of2ga1T(yH+oR0Pc3EA`> zdZycvFFCb}HU*hek8R(MsBpR+-ceK}ROP$q*bZzeiikMbrgtCSzc=Txqbd?PT~K80 zK&SytSL$;4CoeVrYqvg4BT_MZ`N$6)jwg{YE;r%GPlQyTD6h(xxXfA~OW(7tvXQT!mc{xUd)IT(#v~k$G3-nk%y4iY&S!c~@k~633563M25tSm?P2&N28o4{$&G z=0=Zt4ucmxf_fRgkmt|;M?H}XdcMGVkPqHB`RI9n$coQ*n++n}@0{BN zxN$xKm3pyrZSxFtu0cDvQPzbcK|i*`oHG)Twm0XsBQ;f!pgpmN(2snA%%f*J!1mW= z;Yl6YLAfr9++z{VdDLMD6ttlLk1AYU)a^hG$vm_@;01MPdfzHCh}m%ssYgg<&%`jQ z$n_czt?}FVW8o078q(`EZBgLu&?e9iF=@wp9zrigoMZ>j{5%G4;*YuVAzM>wb?A;r zvjcSviGrrzo7=I2EGu&oVp%)PvXa8rMLdqO?2|eto*^-o)$t-6QpJs3rQv0J1zyEh z3wyB2sgfYGJ)oE0bDU8?iv0MVOpyp1i`~B zXBbB!IwHo|DksSH2ehbYnjOKj${dfd@(7;SBYc{UY8q4pQkBO-nbnaU<>U`2Vz8z> zg=-Em=nTWMqDqhv%pTCeLf}YQVL`E-z@~I0L5MiLt|B|ED>^5#PZjmhP6}{ik~OG9 zwgS;rR6C&`s7O0dMBdS+Mo2mYjYS%S71DhM*kf3+DpU`2wuX4ns7Z>VAIJ!-U&5G( zDv%0Ag}P-?rGjvsBLaW&erjKwuBw6#mn~6wYNv@T(rSW}O&0!;oyIW(N6&M^SXP62 z1s8&3TvJx;n6qHuD~FK5)R_Hms=)gTDO6Pk~B*v)A`;0!IB zL(A6Ca^qfK-rz`crZo(~8C)_4m#o31#@%i|UUcwer&(<88PS{>%~{c0W4lWN>w_RN z3nsH*F$)mb)M&HNn(kzcRNhSGtyI48rQ_ezPTEK=n#n~gx!8-=1s>5CfVoWGWbzi1 z2Yun>$xL&ooi@TVW_ZR5&opjz_zWohfh$0$FHIx3flM){M+rk=e#pH^O|x1IdZ0R-rxpDr<}v&GDi&4)#a7 zH%6vtW{Os(2*D(q z^*Tg7y=tact@J7wCT<5|Yi5m+yg8D$M)E%df1rO1{x$q#*kJCO%w3DQ3q{aJ@bv0w z_WP@U$$g(Qm~E5UwwUe4?rUPD*xqgL8u>4rRQzqtNIx*s53KY9FbOf;X|KOpGbXN^ z6W6VY>jpjAWiB-*T8Ac+vzT0C7owCHKM{@b`O{tF!6PHSZ^rkn_h@4nHK+^I1O9Z(7f7m4?<+I{|4in8b<&C diff --git a/FitnessSync/backend/src/models/__pycache__/activity.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/activity.cpython-313.pyc deleted file mode 100644 index 67fab09e3d6f88b4166b2aa44f65a46c2c97cd09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3400 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 diff --git a/FitnessSync/backend/src/models/__pycache__/activity_state.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/activity_state.cpython-313.pyc deleted file mode 100644 index dd6d4ae837585f3bf048f764c77a7b820fb0aa57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1082 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 Dnvj)H diff --git a/FitnessSync/backend/src/models/__pycache__/auth_status.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/auth_status.cpython-311.pyc deleted file mode 100644 index f6e4b6a60832417aaca816473eec506b5f0e4577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1532 zcmbVMy>Ht_6hBgw_+iNmD<*OZ6h#5ohzvWjjaFTX0%jgu@kI&dKv-q~i&59LU@ zQ6~)@0(4QQdMV(^bzu)3Qy@cHzmYy=TUCnEs25#*6x%j0Yku5^= z+ImDCe=CgTN)0-{x{*GxqJLJPQS7*$RnW(w6(nlSdpoIY9=8k-=lm zsPKpgq>6dWA6LdsR4XtM3&+(1pgv;s#W18(g#Q;J7l;BewXv9q0;xluakj>V$mE4= z>V+|v7y^rB5)a_MN3hBPR_*Jz&a?v%j?NTxERCJF`9FE&F&-T&P}hlExe-U(>yZ`3 zVLoAjY=(uh(dP4s9(6p6_RSsA&#R7)$^BI*q~yo0Yu$AT$RZ}2R_sR196|NJ4SZ&v z3<=#O)O-yM{J4jqNA9#Q=aOmqmPbr8S4`6jaO^UxQUSJ{ zcQ9q0lh;`i$0laf?~z=JL1oTVWMG5ch4_(ULrzR<%yuaXc8G71`#pz}(6pjlajh^i z-C)b{bIA!!d)x7?Q>(pA>>Vnxz=|JylPfkQjH`$%@51C?&~tD>FJ?Mcuh+S2*^mNv zLTY#5V#EzQuRZGZUZ2*%x!BkpLJ7KH@bVk!?+tGMDXR~z48{G8U-d-prgArvyMyIX z^Xjm>H*@%5(p*fNi&=AVaBHMqey}^-+>a7-6;b#Cy*NPl~{y7$rHN}?~N`ckGZ z4Q`KG?+kbMwt=tJOA^xx*SWyysdj6v6AiDt=M;qL^isCto>T2eGVHt$cXO{xZwwo@P?PJ_FJV z>Ep8JKB2Rqvfp9&18gT1j^jq?M)Ke02)&!UIY;Pf^5#4d>f9=Kg3jNE`m+N0`vSZ; F@;`r1lBfUx diff --git a/FitnessSync/backend/src/models/__pycache__/auth_status.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/auth_status.cpython-313.pyc deleted file mode 100644 index 6d46626628c631f42138d2ad1d5bea16358f7cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1257 zcmb7EO>7%Q6rSC+z3a6d*VL)oN~k5OsuwJ&VJwf+c)1E?MbEL z5?o(?{V;rL5%QNNrz<}PC))^~5RZ7qCTSaBv`sME7Fg{Z#C|^Q!P}93=y;><_qPJqD`aNeFpQIq&(B z?SuoS?DaT~n9rMr%IzgQI5u@El67COK-W24g*iC+2f-84Az*j}OwRzzGa=W>FOg0G z`@;@bEwEGWczLg|YC>_&tdzMaE1}OuUpZwJ%+rwz7g+T|Ebq9iBvyzZ)^cc9-q>NhGyd;s8F2xi&8d2A?pX=e#jbhFu)fH)Oln zP!6TsA23RlOX(o)CXvQvN*^VDH1|{~-3vj;DCCUC=&n#I^>;Hr=sN;A-MATcAw5A^ ze>V&mm7^h3PJ&bigRP?~`gn}XFu*ptpf7;BB;$R?DSJE&feGqMUs6S57Es z&=0vkw+4L{?1Q5dEgpZW+yI!amF8u~OYtI2RSW}k;0@hPB-W;I1rty3A!@7Dj|Z$J zgv5SYA42>w3#4dmgmMS`VE>**oC)ELc+lEK3*+6EfS`p^u}HMe4eIW21ZAw5ZdwE} z!R-t3d;OL1)}O`dfql61ZGBq2KVF|*zBajiv@*T?#`xi^x_Gd6D5ure#_!MS*C%fs zJ($+-jkjivmnVIUZ`}ViSD)1y6X)p7Y3=oKTPO4mlWFx1CY-m|8ecg_x29KHKjnUL zo;p9f)7mD6KR17O>&NBqmw$M5T6^$$8&TiE^a0jV@kGO%`-L9{s%~zSYQAE diff --git a/FitnessSync/backend/src/models/__pycache__/base.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/base.cpython-311.pyc deleted file mode 100644 index 1e5e3e61c7d04a4e5c3521c0bba970db21ce7453..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259 zcmZ3^%ge<81ivzTGlPNjV-N=hn4pZ$YCy(xh7^Vr#vF!R#wbQc1}277#$`a!)iAXT zQA{aJ!3>(rFF_)jjJE_*Qj>EMixNvR%TnW$5{py)G?{Nn6&L0t<|JpN=2q&ZR+Q)= zsVQOx>bu3_1XQ__;WNmPU-J5i1qJ#^iOJcic`5qEMalZP`6;P6#XzCrRK0@AUmP|- yfzq5*yCP1YdPX2F)&vqCm>C%vZ!nl&Kt&JO#V@dnUu2iO!YCK-B=)4?-UR diff --git a/FitnessSync/backend/src/models/__pycache__/base.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/base.cpython-313.pyc deleted file mode 100644 index 8c4c01628696267c324aebf7b0504034aa664e1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 265 zcmey&%ge<81ivzTGlPNjV-N=hn4pZ$azMsZhG2$ZMsEf$#v(=qh8RXA22-eX5mP#o zCi6=WPm}SMKuT(IPGV7FNoHAUd{Sa@s-GtFEve$doWz{ujMUspz0`^lJtQ?n%s_p& zSe$?=S2BDC8FI@_KO;XkRlm5nBsH%@KcFZ-D>b>KSl=zPB%~-YIok-t%1bRS4zA2g z)=vV8q~@jQ7Z)Y#=jNxR<`e^kic|FpDsOSv00l~OQtgU3fyOcdaj^i9_`uA_$at5* R{2{yeWp>F%mLhhbAOMJMN09&k diff --git a/FitnessSync/backend/src/models/__pycache__/bike_setup.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/bike_setup.cpython-311.pyc deleted file mode 100644 index 0493970a395cc7ec903bc6191727f37c42bcab3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1500 zcmbVMF>l*O6h2a!I2Jk-E#O9K6C>$hqbRr#wC*f3A}Qra z#&stS9XzsAycF={y0C|gDUcxr@&ibK194M;PT5?fQ>NaLc8s_-Q1tQc;d}SJdwh5A zk-t`}3ZOFi#V{)c0RCjgxrk@r^>-9J1`t5b0yd{{Hm~t^K`YpTCfK4Ta*X4xqFvHT z6c?aiNw%!X9N@v%0E#~WSVZz6jeksME}8;M>!2gOVrEAq#jmE8Z#$%P$MMh@VNzW8 zu<4A6bldRIhG`=r4y~!-bvPny`OfGS$2L-9)o{@$51Q+@d3)65F+f1$AkcWoX$2l2 z0f~@@{7KMmb~idaDbKKJ8+ccrpj{%G4n#i;X&oiUw=84RLJWJf-ak$qhUZ*_A0ezmv}O1f zE59^#{28QOalbQ9Bwcq58|gYxblsjp-(t9;>koayI%BH3?y<Q#EEYb<-G4kONg0k5qaTWV!0a-SuX> zxI%q1#gcaEw+4c@Pul!Axc5@7?X|+v!N!wjB==*vpUC}SHLcv(8;1RZK~(9+m2Oh$ z27|QT3X9>+(R@@_83M6H#$wUV?}f^XAuW3L~6dT=W$x8rgYpcI$C$hmGy9vkrs#K^bMI+{Uuq_nzb|^wdOVzu+lY7B<$+E{9zm>p5Fmu*Pd_IcLVg*DQQu0;*ftP z<$4ee$miQ)ltz?ai4u5101wE%mxNLQBaV{EKnU|K+U;KC2F8&$ zCKz)I<8eGlLWye_KTf=G;b~yJ9{^=x5RoVr?mEUyzO3+rycM9yZcD)c^0xJT5LLP9 zA9z7jTm~Q>U_Ty0MMj#3Bp4nrJQ{)&o!2J`h+s;v?2R{oumH%IM657q@?BuaP&JAV zx#f#`j0~{HxK$h|$8C%$^H|^uhq#6Pgb|7{v_;~n_#ytWeGrd{O(_$#?N1?oM0`f= z?SSop=a1f%C?b@))5y2`!a|~fO~JRta7ak)b3N83Q>clO`6f?IzY^P*==av!>4R5h zV^%rZd(q0w+v(=Kc42n=Xe+DTNVn$8o!Q}WJ6pEX`}0P7Haym|##;K3v?oU_TfQmm zt;^5fKOSVQ_tFRR&Rfqvd!c2W_4Jc@wK=c8+VF3^a0!yRDS35irD^A6-D_2-Te*SeTlBTM4f-My0Wdz Lw11I&<^}!(d{as- diff --git a/FitnessSync/backend/src/models/__pycache__/config.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/config.cpython-311.pyc deleted file mode 100644 index 0a1674cb64fc473ca04c168018e42fc266977c35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1540 zcmbVLF>l*O6h2avL{XLAl3$}+MLlUQ`jW~my3|tO0@8mEcDdk8e zRVED?I%=y%0|gux&fqZxJfuK=010p)ZYt0zn}ZY`GUbl6oZ7H}qQ|?Z@4fHv-MxEH zuPYS=u(5XV(0Y^u;4kisNB#(W+GOAtfB+I~;0U_lh`Q+H^qeE*FmS~3QD>6pfVbXhCJ{`I|ktt1Nl!;7vA~TgTl{0QI z%^9|47?oy zY4hK%x6u-5xkoI=Abt20_i5g85&nr6(G6_d*t9XnyqGV$F2~azCeJZ}2zQLY_Bq>i zgB~yWT1%xegs$OW2&n?0(?x;J@f3v50>eIHDiHcyIdchbJt8qfMGFz$8T4Go@;5CX znzn^qA6kg2CnKz#2=?juqbR}1BG~j{KrA}5We~@5VZd(6k2ntW49|PfC5ROH85OVZ zn$W|(&$`(o1%3;e6FIm0f+|d(rG%j2Qzc7}SC! z+n$y^@6BGHRJb5FT-p1FnZfawsLjFsKT9(|*M`OIjeRvNEkvb-xU?|1ozyQ5pN~4b zepqiu^>$ouhmxAiT^TKGU)yhob4$_OQara5O0!Ah^61)jZNC{d7Nf>u+*k~ydQ$s# z*cm`N4xTV`^h~Z`9sxhN>2+TC8e=`$@Gvtc~Q6%%ZbeG^@q4+B^B3 z^j`i$d9Q@k)u_4}S62rsXKj3Y{cZE$`tLUmZiLn4sJa|imj^5SBhB$cthJ`7;ytqs z+kA|j{@22%Mb9dbmS+0vrkf0=Wg#UdLkrn6lk!-TT;(V|;yZ>u%im{BcZ;-`%m0Gj yugo0g1VKo^t?<9i1Y8PF&IDWxPtF8f2v5#KsVv+R4#C-Wc=uz<{5^qBllTIJ&6tY- diff --git a/FitnessSync/backend/src/models/__pycache__/config.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/config.cpython-313.pyc deleted file mode 100644 index 32f5d79999948731bd24e17ac8b0ccdc2306a238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1270 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 SF8!<3m5wsm{Ex^pOYlGQXHnh& diff --git a/FitnessSync/backend/src/models/__pycache__/health_state.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/health_state.cpython-311.pyc deleted file mode 100644 index 232f348b00d2a67e3e01b5a369a5433faeb843a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1382 zcmb7Dzi-<{6h8hCe~6|fD~@az=+;C~4OpH$6)lhiPJ^OGT`NXG1UWFev#o|a$wxAg zJSjj1kJ{?dlbXUBGNwTOf=*VM? z>6j9b!CipV=KvM3IZ^<);43$$h_pRW*WZY=t~2d+$BTTz^m`=4hnO;LFQjd9$c#H~ zh?{L6GgU-PJ%~t)mG6`GafEMoNDxxDO~N-^IjBoaz2yeDm474m+AO*JND@cDz>yGe zWF$F?46up|T(CS=uE^6ePDkpvFyf^zMET4dBV)|>FvSlt){N1{`ju)6g5k^N8jKNF zc)?e099{grG|xsnxR@uru^;BfS6f}?yO&TAS!e;-!?_rt zLrj{uKHjNcV+MpGgpd^>^gAf>M7#juapZb4#)dEy+VYf&Ye+>4nA}EG7ukw%;=0pS z;nuig*1Lm80TuU%8Uj{G=P5HiHwa;XF`=da7iV99E@=&6mruxs{k(skt?{ zHL;dXw}zjbUyrR?V%1WsHn=mXtPXFURbSkQE1OAWGp%e6zM9zAPWOk~=l5fKJ+aqQ zdwsAy-*-K(G?Gdqtu*+)a&@Q;d&Ay~<#=TyS=mTeHeU5!g|B-*pS(Van-AjVcWLuM z(tMaUAI4>vlwn$igL_jAm}{}IdR9IE_@xnl@l9;(CdO`R>`oQAsttC;LvPLxxl^}T zF*x>IuXTj|{@(-1N09Y88;fXo-e4_n9JS^(=nWBNC2Kr-YkZau|8x2&PsQITc*fmS jktAsX_T&HmPQY6H?{}&$NZJ(q*A3Ah0{!znR3`B+_rh=h diff --git a/FitnessSync/backend/src/models/__pycache__/health_state.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/health_state.cpython-313.pyc deleted file mode 100644 index 1fb0a2a2acc93a9c1a40557690244d73092f8a05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1199 zcmah{O>Epm6dwPqf7aP-vQ0u#sZtbys->bvh$2NoAhlIQ9T62~8*x}Ma=ep`sdt>b z8PjY}DljoLYnl=BE-gpExU8DK;vn2`lmWP=?wpb0kjV8%pnXENCwsQE6*W z+Peiylq~!R|NK zP~X9pdhB%z+!A}Zft_^|{1P>56#NIx)X2r2`m$A`S=FY6{dJ??{&=-M_oZzO-Kf$3 z#c@;BGT-m0d;y-pEj)|c>-O6QT*7m(Fr4ppWcvdeXJQYJS%QU9=FC>P<@{dB60T^% zHQ(!+GT4W76vLR@r(@Yj*?=ByD6u?NWLdnEQE4&yKoRbM?#4wXbWAACALfjz-)A|6 z&nb{PD!rT)`-5^Cr42?@4J#pHyicXW^8yko+rJ4DDx%yW#Q`N!{7b(k$cj6vM}}EncO@L=8s-IS)2w}C$~>K%g0NPUz>K`oNS)9 zE*)*0+?%$pO*SfiaoPzLKezPN;p2trE7!jf-yeQ^_}#;&y-%L?`akvhKleVJ&XLKT zKON++950<*dEz~N|L)ZL=(%MsIbUo+_oAe&ZXlcdAd9nPkB-Lw>R%~dN?T4r>s#sR zRBb|Vk)xEZO8L6tr1x$${P*Au1r7CbE$(y6FpS^O_A|6SMccokl^6Dm;T#SALTW32 F{~OJ#M+5)> diff --git a/FitnessSync/backend/src/models/__pycache__/job.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/job.cpython-311.pyc deleted file mode 100644 index dc2d865c583e77c501d8911b74a862d26e7d5a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1713 zcmbVMzi-<{6h2ZENztYxCW_=1XeSpiZCC<=XsZpw^^e+a-N8%APWw{O#wP(bCFJ&az|Q0t2iBUvkQ)5C>-FyDuBXI0OpZ$O7ox7nGItMid#UJUNKjfiTIUghmK36H8((e2orHD zz-@Pr$V*m$w%ZOO!Zvyw5NXl#Y-G7aSl{|?lL)(^+j_;ZBpeYIEg!YA0@?bmhd*h^ z6M%rhL16HZGjcpY0?Jdi{6%hrn|O^07x`13vZgZ|hBQQ=cp;7aOJ*3I1)5PlrS;Ak zt#rWmGb#TQ&A(T7EUh~Z3m3`=BQ-^ewB{(+Qi_ysK(rLOMOlqzyZu3=!Vo%d=#DB6Y_-%!za-(7>sr`>N~7D~s}p4eY{Dnx~5TxceR zW_NK=rq6nZXZfgHkIVI>T<@+8)Z51odMo|=PuC)KK33-wb-ueY&}zNviF_iTO-2)q zc%qR^G%ml0w1rq(NVJ9S`k-{@_^`L%+dmVc>TFz{O{%k(LR6ZIOLIwSuKRTsu-89` zN_t$uPtj;9rOn2qw4K$z2&xIHAAIb|Q(l%mkBhfY}-5UZgr!FU-P5nOo zY&z1GV{JLnmb>fh!qda;-PFgaCJt=NZtWxIC{q#J^HfTyW>Pt%2cJqIJ7ZyoeiiZf zFb&q3m1dox)*JcDOtka3PF?oN@_(kwRgUAh0oaN@_8x$0^xykRC~+&?6}Wjlp8PvS K{`ml&Qhp09D!BLn diff --git a/FitnessSync/backend/src/models/__pycache__/job.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/job.cpython-313.pyc deleted file mode 100644 index 06a2e160899a859e6a63a0c73c5743a509fc3823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1358 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 VaUXK0;PQ1J{*^L+U%{u>{|AN-uzCOh diff --git a/FitnessSync/backend/src/models/__pycache__/segment.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/segment.cpython-313.pyc deleted file mode 100644 index 4c4748f083cdb6886ca6fbbdfe8e7369a1bf3929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1331 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 diff --git a/FitnessSync/backend/src/models/__pycache__/segment_effort.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/segment_effort.cpython-313.pyc deleted file mode 100644 index ac247bfa453140176642cbf8de122f74e2926e07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1579 zcmZ8h&2Jk;6rZ)%>-Bd&8z5w{g7Dgp$hOyhjq|V2_?~D)lj@`ccbWkK+Xdb*~98rsQv zrj~^)+On3a=W2P#FOV`>B$_fuv~(lCnvCK@p{-UjX983du6*iRUEAU5`;O1r47j5C zU^;D{TC-f;=jv_UXB(!?cy`SNX11L=>s2J42WIKM={nw)*+DF~x{h&{5J3^#(miHG z%SEFSgY%CiQCow6q!CDH5+t<*$c@w@X((C}fAY;Fq$Au=G5gdi&Jd5LXldj!7dZ8Q zTsDp)lnKa%C?C#CKw$(GV`VZ_mPXLn2pSL31ZE~;PL6O>Bi!@|cPT`9tRSgnZc2@r z&#y*xTpSn4Y7Dh3MxSlWp*}aP3g$zc{|~>S72wr&u~Om%jkRs&_;*?@7yL7^y}aZ_ zKFUI;w^2#(Tn9{BhaTN#J)Sb1CVRY>i*??L*<8cZQk|}4>6;eYE9i!A?wG#G1ScpT zPkzsJ7}`aT!43o3WG%gG`8*w`z|~KpS-l_0dgV2)QtIe7qm*YUwcTdd5_X=_M_t{D znG&Tf6FlEC9p<=57bx{b3K0*YRRQk@;R&+|sxY#{>dYq3#d-E9f;={2$74+@a)orH z^>y$=2UnRBQ9PsXv}woP#U{_#`s3JCgm()d+`>@ebr=(Cpx@A&%rO|B5&)RjF(GVv ziZ901ZP!N2*#>c`dD3xrdDZ}iT$AcPWP~>z=grk&(tMgy&&N0hitw^+c75hi3T2d^ z%wxF=V?91sBWSMYpi-;RB^kR6Kvq zz2D^W3x%MpJ&=RaI~aC+<_C3fB`8;)$-k&SsXu4KBu|TT2RDz3OZ~gYrTK%}QEB;` zdm!#xSo3%z%o_yFhQKJ=KDpy>vqf@--L_RujCE9Mt4;KoL zFk1H-`ndW*)c+sB4TR!5<}KjxS5lIsKS=#Ksh^PL6Y}~Anf+TXOKauMAqZ#R8x16oiFY9TSCg~hNI5hIMJ52#U% z6$WlN-n>KN+i6j>at0qOS-NiIZwii8ykzy(+uG-Qe{)o^TwW1pgg;R zbPbuf^nvk?Wk_gAHc+-{vbjcD%tbliMTvmOKp+MnBL)Kig-{pJ{ zI-!T3dItOk>5j9=3BAozI-5;oJv^N;6z)WKa$>xVOLS^FIgz_1E_q8F-^ShSU+R{) zu3O@|+qj$K6>f>^xh1Z*jqB^Y*-lREZ{u$EZ=i)6gi*+z#ZG80ozmHCG#}!f67dej ze+CnfJ4=3|xeIw(2PwiYW=&;ZF-w~!MzTh_7`c{N*DPSSCqfHnq^^N1*Vy%p1rh8qAgRj zaQGcL`%)_Cg(595WUQx$2rEf>SwoUU;*zB4u&8=8CrPi0vf9!lCCT(GH(BhJJNBxA z1Qdw92ZkitaZw5DOH75Hs_*U^v~s=jB&=7|W)UJ1Q}ukVMIsgL`^8S;dq~EngsEpF zT+m%AO!$BCUWZwuljqddEjJeP7Av2$#cjlVoVRZth|4 zVI-j(eL!%`cjD5~x8Q>E;N$1ha-lHo-3!XYX#;1c=_Mf5m~P(MRH1}b{+vecPOZj_Sc8^j_x_agey!~YmHQ2dEZ7hs%0u_RdrG$ZfeAO(&*~9 zBX-d)*0w7L)dQz%)a@FzR<9Fx57_;+FzvZR{)l(F$KCF6>uG}%%FFg6`%!J6GGCo{ zxM7zYwlWRAx4dg_+uOCTD=(@q9Dda0N3E4BbYEqzI_GfrUG6?bU*n)3vlmYBaOh~r z5yo6$jE0l!DgR(+>`ZOEvR++xk|S<%#9D69;Ad+OY7dUXhm%K>PS3d8Gj2UQX90C_ z)}F8@YIAR3U6^r%8CRJ3{i}Ln!AUH*i3RK1_o=((gWA(~rFv@7NiDjmMeB*z@fVk0 zYdy`AxbaGr)$AV9N>^#?r>vioe&#gumA^tx>A00G37R;q?O(Q1X@~xLFn4JKPkNMZ za*9$P*|}y3&Epx$dVdq+EnUuo48t_QYW@F=1{kk*jt012?;H)#U+)~}p+RPeIS2o} P+FO77nt!g*`=R^`Fxeke diff --git a/FitnessSync/backend/src/models/__pycache__/stream.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/stream.cpython-313.pyc deleted file mode 100644 index e9a204d04805d47cdf770802f94f7bfddef7b2dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 zcmaJ>&1)M+6rYu}(n?x=SpH7ZV4O6LO0n9sPBFNlcIyvGi3wi&kRr0IrLnxtYFBx? za;nn9LZS2+BLWJ(q_^~zV-NiUdaTi*)qp9XQ1C6mZO?tPD=D-FjnK?{@AqbYv+rZh z5{VeWare7DeKkbLA6)4Vu_v6}N8t%kh$0k8K>(o;fIuM#!9oZ^1rfwT7{W6g4-_K> z2_#Pr7Ndn2#83_?VliHjL7pK~WR@u53q*;OgJJXhpMW*(dbpNKZNY30=U zI24XY7DEvA&=}v*$NDS82bkQq^;bv?!IDF;)BrormmY$R48bx3?EF1PhhSqvu<-#l z(f{WD3X=ouJl~XuO=GMjC91?00~qJ{VgN3bE}~6V5=s)aOG*mfs;09eEV*2E^aI^# zDh^Psb{fXyu(Z}Qs}4jY zs;Skes)~rgy;Igc$4;z}%LsF``r-SVnx=Bq7;e@I>{4zccylnt`m9T(b0p6r6 zKKN9$NS?*fk;dBFv#|@ja7esCoJNJRs9~Aao=6RP;5815?NbdL74Wi5tXq$;^&(}h zLd`PjcAe4+lPbFHXxtEYXsu4sw*eG*C$VtNI?&B3ldFK6RJ&$b&OY$Rg@vlvj1c9b z)W0YjS1~QfTvj#50e!cDF;Z2SMz1sc6Sk4t#}>}nwnI%PcNeTLXxXuIYr3-y7}*vNE_X85-C{R2en{J^Eu)jV z;%;=)6NioVPV4JV`l_4%pEff2RBTs|lAVz`x6qX{hYRh=)~${_>#lZ_V~0EKk6QOT z$*b@1u=LOMboIf}5!F7u24`=~Yk= ggx^X2SCT&=b0=ixgiQPuni5uo$J>7szItc;3p}y8GXMYp diff --git a/FitnessSync/backend/src/models/__pycache__/sync_log.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/sync_log.cpython-311.pyc deleted file mode 100644 index 26213d3eac2f08e40d65dada1a2410d7ed361294..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1575 zcmbVMzi-<{6h2b?ZHp2c$yL#!8Jf0HY>2RddMYxcvE9U}fx@Z_a3L7o*-^tE%8_!S zP8>Q2C{U>y(U=!x@~z8$3ff))pMm z5D6|p&Xye6kQu;&H30eV02GjXK=hBuD4L-_aT7G9XVh%+nedrs_Z>GAZ@2;4K{yjO z1Kf3YGU>V%pmx_m8P`S+f+mx3+kLn5jHTy@an15kr_e0s)3ASFXxIoC3S%F##p>SZ*;4%rhus|9{ z9S=j_>|w7%wj-FSlcjB|YZF`SlS`PynM7quu6I9EIv9~FK+_5`rMM2ozk(NJ3wZf~ zZuNTlZL4#a_|bjb(aGJA?dy}LZS@9tmh8+YdI$eKQU&4Zm)0(ZU;H6ghI1ovzx}Wl z$;+|4oXE@JwX`}n5=Og+d{k}4)mBn%g*Vdjh2hp{b^oiVJRg_mlk$AHnyR(o_Ncvo zJyM&o+Dz1DxRz>fkLLEI!%re@G1e9nZ85x=R_epu(VfFuRB6SPR#It&pQnxY_k_Ls z51FX36gQTV#!|%9)B3xkt-ZCwFQd91*Y%{XhZ}{HulIvUU5M3%L|r&_Lfl-68hYH& zlZO68dcr-Gepj9xs5bJQvZN+4$)4qf3u3|90i^l}KBOwUtC$32)L5e>8cn zjphu=Q yV$$EH|09`BN({rK;A-^WdI~N^XL}0XiO%*DuFR}5C*aNV5I)bDzs}+FkpBT~p_>-~ diff --git a/FitnessSync/backend/src/models/__pycache__/sync_log.cpython-313.pyc b/FitnessSync/backend/src/models/__pycache__/sync_log.cpython-313.pyc deleted file mode 100644 index 5926787d680116b68622c90be883464c1030fcec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1280 zcmb7EPl)4G7=LNfB+X3QsXLvi3eGa@VY*6#3nL839M-k#X4XMX#Y^FlN#1ngrb+ip zvb*(E5Jd3Oi!dI9Ie4hIJ&GO_J$N+-!9G|-_B1zP^x)0!B`xC~ebATR?|pyrz3=y> z7uBjkaDDdWUH>1Mkf(wyS9t+04iS7#Y+_3X#F9X=N>H+7kSzris|@9Kx^yg0=COseIp9eVaT;RVZsIsxN0ZhhXbzP zauU|_hm0#d_9$sfTscld_q-(Hklb`)=87cCr7pk)kwm$D0+LOjWJ@61B~be1ZPHh< zI4o~Z1}*2hUAEP|5>%dHM$T5yQ`lB>R$X}37Ob$qRg4D?kyCG1BWeAbXBRs)E%@|x0yTyXoT*}oM zjbRlN=9_3j{1tAWkl)s~CU5^ysZX`D-sAPG^4jF)d~IX;U{=o7I+Hu|>Xm8t?ES3z z@}xVjtxtPrx3XG$a(mv`Jk@8rS>x4-HLo|PC$sge-kH2LZ@qN-@UfJ&Zv3J&=gk*S zZ_nP%n&#wC1b=XrWVKiF;4k#qwX9|Sp!}@=sQ+YSjRVZn*jyZcbM5<`Z+E`Co;BY5 z*n;-5?8Ej7igG`20{4Us$Ct|Hs^+2&1la qLkB5-{3PDO?N3>fq~FQ@uVnuT*?K~r|4XS#UFlQrZz7&~f`0+ca9jxh diff --git a/FitnessSync/backend/src/models/__pycache__/weight_record.cpython-311.pyc b/FitnessSync/backend/src/models/__pycache__/weight_record.cpython-311.pyc deleted file mode 100644 index 362bb824b74bb5bcfa74cfc76db3744fa0c1f562..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1591 zcmbVMy>Ht_6hBfF#ShV;6i0On6kS|Zl;OyOh&$BRkcjCf9{MWK4k!DUd&a1ULvc73h@BMLK259VsWZ>;OfNcZc`h@7;U9yZ5AD z6-5GM^w)l{k`e%aQRQ@$C&KG{MEC_j02v!NjLtZ$&N?N%`6mE*Bp#6XM`RU4mtf@%(1cf1)ykN^-nT=?#g&_GfOe3F`8$DU zxjR_6VFqZ^au6=B+kG?87|d;lZtoRK4-#d~^ii(}TI}z5#|-6-fX+amvyjnCEI=G8 zLl&~fr71pqj#UW89havtA;(05@CPLA5lx*BU78^5IYgesJAbB{BgzHQW=bGW=s=ukRSRQzmV|qj5AsXVc~Acs#XpG%Xe>JwGs=0hTF!gUCVXV{ymy9LuFq1nOOK`;W2I^AI@%4Ku(}!JEpz zf!D+ZylHjJ!JxBc_8uY^c6_hbA(ue5-#PQRR|i9{O5F2}GWI_u9TC0z#tjjXYsObbvx(G9rDi5Iqw8b2wzm>DN7oWrOJyySwdh7+YmM$E@qfWe=e17X z>$WCi$=|h2yLTTs!}s;iYo8aksQS!%r>jIPipUrB@aVs7QG+k2lth^dyjaGRQpzl%5J|uLPwl!YB8&UKz@W6-({w zJp+s@q(xSVRk}nhZD4F*eX+nCmD~D>fbA03?nZtZguHw|OxTD4*Q^A*aK!a{cEWbO zfbmk-kL;u^adj^ZofBCkBH6NI=7=h1OPhmJSrYvY2uKzI*^)r9WKajCRWi`9JM3>$ zfpX4uWF<>OZsgoVR^F7MGG|K8s`J>wSIb#_9=Y%aYs@2c%fKqlIV-9x7Lj-&ie+v} zg9{JV&ssnKuab>9u_{<$`G4kAF=xf9!NpO%y}+xVGHJYY@)?upQo*PrAj3b`%b zZOgoJ0A66jm_A}-Uh+bhJ?)}dOGEE4Wn2$a-?xW8YfG>wO6X}Ak3)yKs6yFgdv@vz zb@T+qdKQHk$LleJ#|-Fyyiu4QxG3p&WT)NYI;EieX%M-oFL0I8!_@ZYo&`$x zJctwD3t1SUyGCgu8Y%oB?h~k@BiVBypU&9xlA)JSJmaf6_ZQf4}zA`VZ?rUdx)> zU-aPmS>HSD3OD0J-}aq-7L3n@%tg!qfB sP#?lgr1%z)_%d!U6-ko*B6t2EcV3XoFUVW}sx_%AO>ey-;-43I4S@<^eE>P{wCAAY(d13PUi1CZpd)5K;i>4 PBO~Jn1{hJq3={(Z7BL?G diff --git a/FitnessSync/backend/src/routers/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/routers/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 46024447bdcb0548d81ca2e29f3e1951aa68b3fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmey&%ge<81d{XOGC}lX5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iienx(7s(x{C zNorn+en3%vR%&udvA$boNk~y*a<&nOm6uvv99)@~te*rFNzF^qFD^>fFUl`1Ni8bY skB`sH%PfhH*DI*J#bJ}1pHiBWYFESxG#g}hF^KVznURsPh#ANN0C9OM!2kdN diff --git a/FitnessSync/backend/src/routers/__pycache__/web.cpython-311.pyc b/FitnessSync/backend/src/routers/__pycache__/web.cpython-311.pyc deleted file mode 100644 index b4fe801755102a8886c3a63933dc4e4480308f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3709 zcmcguO-vg{6rNeHZOoeAgb*MJ^amoO21}?aNfcFWb4W|ZyrHax+j~qGnxErlRv{I!=Ri*Yu#Vx14x8q&gu`O~aU3=fo?!5QC z_q~~UGe389v=g}Y)>M5fM#vxd5?s+rb$(9J+O%Zw;5IR~S^fpB})_~C265)6w zg4V~nR%Pu(14?&Gl>SB(m=h-(5PGzM&&l}U-#DShB`@*m{PaR$-D2E}FR;7o%(TX- z*L6+Lf2mF`GNYJNEoOQND`-M*Len|RSOvcEnx?!s7iO7o<^pmQ?r-2e_yojtLSa={ z&7K^DBHM7R@TFT^^6!*!RsrzhYqPXEDI8(J{UMN_+3oLNG9lQhL zFZewoe=5iKl+hQ;XgT-mt=+i&;Z;YOc9m&co<0C2vZns<~Nu5!bcZv-4yb!$bp{vVFQ*V}Te(-s_00ly&}pg|P=C?!)X`Widu5BL!; zlWz31EIb`HLbbXg_A?OjFx<^6!1_bH$jFE& zf%R4*2RJp~L&Y%=4OQ?W%+T9w_N5&B9mQ}J!pAu@pMWkrUYN^}`27f_^d%XyoBdys z3A_IPD$%<=@ZHe&LyuxFlSA8ckd8X(vxU7OUwOe zIO`h*5)B7JjjG{QhxWO&uM%mtHb&7#!xN!KXlN%-IrOwkPow1mE&G-WzRN(O<(W|9 zKd{_RI~2$dq04z%zJdYH`z`~CE>DFTH7-XTI_A-UY0*MG`L(LFj gd&Z%VzJYy7qFc0lcAwz0R-z${T}7j|$DjKD0_^MOH~;_u diff --git a/FitnessSync/backend/src/routers/__pycache__/web.cpython-313.pyc b/FitnessSync/backend/src/routers/__pycache__/web.cpython-313.pyc deleted file mode 100644 index 310871764d2d9e14eaf3b2ac3669d694d3e4d67b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3278 zcmcImOKcNI7@pbP*m2f*@(6KwxIlue7B7mRfe2Nqka#4-3Em(;L<){QI7{qxnB71V zK%(VPq@FAF=qtA#bIg(BMtg|5YSmV)RB=n?6Sw~Vj32SVN;zbuot^#X`{sYm{{L3G zySoTn+shg2MTn5U@TGQjR40|w3L!rdlbCdhOj1rK6|ThbU71oRHLk_UJUvM+RN=g1 zUOP!l)zmIg9-8k+_trLSJk5>^RKA&^dF8xfhGXQBR^Oqs4Xd+-6=`Bc+OWD>Sb7ty zs|_pK!s>2f>1|j&Ev()qR)9LW(yGgN5KgnltITl|H0YhQ>_?fgIaXXLWL)M1 z5w|vl)kx0bEbEr|T0o5;%q1;bJtyL{;E8+%cVz;GQzQogfxAJT-HTJN Q!7@W`mOIBY+2t{u+01dwH9Ko8f`r*Q!{J$ji)c8;Q?{5~SqmbZ zWpWF=RB}0f9$~mE$6$CzUXs7{gWLMZmOfH0{CsaS?47^v>o+{@#`}r}i0_7m>AG%Y zvaa>SaxLcUSA=>SDjH$pI+(z_VUPjgJunS+K^ImsdBzWb6p_wx7@Bs>5Q@(!F({5Hh z34tf>>dJm)rAzF-mk$yp9T)`TF(14S2NCTaBcI_#%RalrG6i>Ozib_lS{9_1y=-nq zOWTLQWVFBXk#jV$aqn%|yFBabw><4uHTpfqL(5&X-2L`UYWcsOHKCiXf3m|BEkFi8T6r!1*v1NjO@lrt1%5H;QrWmeR1Q`X5O1f`TC5f%~bO-SSwU( z#!%QiX=|xx6K}&?mkYjL^t58t>n{BXuGae zWYBqG%&~%-S?{UaDk79nMT7#?E#r14rL8#~J= zo`FTYozG#wDE^~;@oTNwd81!$UfZ5~ur>FhFYQ=Q;i=1R>dVWoK9OOg3B5ojBHYjQwFj>kJt z9hY-VI7eIGkP3`M9*xe+#Zqpyz`o)J$ncNAc?IK+N-6!FjQ&QFe?|s=7=9W0B|2PQ z-inUBjQl~v-^adPX(tJbdVJWJ^yy#J%9z$W8mIW>?wmU9GpNxB* z@~Nzh6W4;A`?md{iO PJ~4!`e}#xAAsPPxu%>s{ diff --git a/FitnessSync/backend/src/schemas/__pycache__/discovery.cpython-311.pyc b/FitnessSync/backend/src/schemas/__pycache__/discovery.cpython-311.pyc deleted file mode 100644 index eedc71141ebe793b1cc75be21620feab4b8d9e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2415 zcmbtVzi-<{6egvkME$a5$5tH2isjgWt2U_H0v!wlh0&%>+q5!ZBS0e*B^cdVB1%yT zc?zse0Xk&ppdmm!6&;G!Mfd(4B%pz~wNp0-_LQmbk(6XfMwU{KpWeOi$Roe^?(vUY zE-k?!PLGV!xFr39gW;h>&iOCkyppIyWm9U(Rar(qX2zQFYP?CRBpAm{rKwaES&B&y zBuajgsKVsm;hulN86MR{z$Ji7&Tz?qQ-Mp(aB9G%fy>NrDVjZ$%DI1WiLxwGpXv_# zwndp)jtTOO;c%hux4F@>bQ5Tm>YQ<-$!gIv1%JaQJpUVpuOuc_Whzx;k0cgngv$3I zN@G=pC0O#t=sIBH5u?s9Bw|v)q$jRXA|^A#BqAm|!z3dnH^ZnQ0}7XtQOZ%b4Sx`EHE2u$xa|-5V8P5IWk*1 zw{sYnLzoBnQ#uEf-rU*I+wGkvdhJJe&>hFF?KrgtYwFGp9lquJ?XIojbqKhCa{|!2 z^z*M3T!QA2f`6yn`?{~5tPJwET~Y?~NZH@q?tS^9(LWx{m0Yq7=8UjOIt*He#o^f66Z37o<1mdkZ00mtCKVZ*wl&sv3@D0dT4hhn z@s4ecXGO&0J&}e=(oAO6d81NJ+j+RFy@0R?AmWC_?Ij$pAuJ;l5pE%@BNPw&{f)|!tg65GWzqrxc?>}C(<6ofM3LnmAsSG_t--vcw1Cg>649X|G$5_S$qh(cqyPZRMap4M$|_%wjg=hH5$&b0gJjt&YXZnJZ-vgbieW7v3}M zg+b{D4Y7o=sZ_j!F$CNujs`H1iu{th{N5mc*Cl8kx$A$t3$?y-vUS3Ly??s=+rz>7 z2ZPlQ2MZs$WEadMyZ+*;OVB*B>Mvb)37QumIAMZtMcB1MZFi||aieDAmr*3(^8r01 ztf6ry$F>{p&)@}vXP$hIH|o9cQ}Kzt1CwPq9c=Gsaaopq>6SZbzO><9WxiB&C+&??Kv diff --git a/FitnessSync/backend/src/schemas/__pycache__/discovery.cpython-313.pyc b/FitnessSync/backend/src/schemas/__pycache__/discovery.cpython-313.pyc deleted file mode 100644 index 0a975ab37091b488ceaa8e908b67a95e22e76002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1911 zcma)6&ube;6rS~tq}4B5wq;wj>qfO>%u-V|flvY^hc=|ePMwhLp#{;+dNr1}m3Ebx zQLt`?6q??YL%_%O*8VpY0wV@O4?X!-uzK%%vn!*3S~_Asz5U+o?0et7_pXY?9D()p z)C+8rkU#NevQmk0^#d5Mi9;OYfb1LGsG>c0Ft=}VbDwgm@6ChMeu}56q(ZicL)VFu zsvCFUOk6yz*)*`3DK?{73)t)wYiTwIY<`N(HVby~5)ZQtmHpHc?8~UZTK1fx4+9~U z^{69*DD+z3wi=#fGH5d&_fJ+53%NQ6<~6AkZa9R`IR-a(NS)SG&fG3|9FwQ(nYxAP z14k1sJH@3EE(csb*_TeZ!W5TDxZ)INCEWZJm(^U3FEmX%uNLkH!jGOa-g^+VB;%L( z237QY89WbU&y~FnJ5)I#JuY3$R9P%+#8#%|Nw*z@DmJ`RFrqMF(C|)wBX&tyt{Zx7 z=DI59y6vdZZJ}Lo-Dh2|m3S6h_c-7}wt|p_5x7kuxdPS;!$^9lws2jZhv+zl$kPY~ zgd%`S9k(J+@_8f{5K73dxGqF41K;(e$3ENdTj!NQX=_OB(f01y7cWoxr-S+GknWCdY@dDp^6NhP$sN+||9N*oxB2?y zg|lm~3hw`|y(YC&YSjtCW{X`{!V~ta%Y?i{F;)J$6oQ5p?$FNgC4BEPLK$HNH=02x z`5NB7gMb>x@ok{BIRQLWpim&qV)=rW<4x$Foy24C%t!)S2vx?bo{pOdiahO@Sl;y% zSh|^@)iTMRxRKJ_YG!Opt$yZ(jQ}g!Va+yteMf)MOH56rI}v0fRQ8yo7NOsRHiyRd zLZ7L^lp-RLBs)tIPT?$GLD0HX(V8XB7CI2{E>u*>BZq_ ze)+|t(b8&Pys|IoMywn@_m*;)F0QMm05g=+x=l2L0R-a*RKi~tADzCgRm_2<^{eN> zipNie7hr@~QzPUF6Wx})#EezWpXe(NRldQFx=pv^$rGUpO%^f^!Z)BR)%>-Ze$<5u z!n(1G|1PK2O3S$iJL6fPCDsF>irg%TZFC^uUhy#iNL(uazVgAKv^S)CqdRxc4*Hez zo9FW9`@gRIaxl2@(O~`7VDa{l-W@Hi59#`-ymmp?V$t!WLp!IePOssGFkm>P{wCAAY(d13PUi1CZpd2X#0(Sz0Bw#RuK)l5 diff --git a/FitnessSync/backend/src/services/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index a30041e104be398da18bfdfa245c0110e9771a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173 zcmey&%ge<81l@CeGC}lX5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~i4enx(7s(x{C zNorn+en3%vR%&udvA$boNk~y*a<&nOm6uvv99)@~te*rFNzF^qFD^>fFHS8g%S=u! t){l?R%*!l^kJl@xyv1RYo1apelWJGQ3N##Kc`=Cbk(rT^v4|PS0s!8rEO7t; diff --git a/FitnessSync/backend/src/services/__pycache__/bike_matching.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/bike_matching.cpython-311.pyc deleted file mode 100644 index 2ad13f1f06fc46b866aefe04ee070eb9f6903399..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10684 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 J&-Cc-`(M6-%u@gW diff --git a/FitnessSync/backend/src/services/__pycache__/bike_matching.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/bike_matching.cpython-313.pyc deleted file mode 100644 index 75a67c879be173b565c814d952b6c1a6698956d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10277 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 V_BP2@w^mWR=8t`jAd}DTzX7HoHrD_E diff --git a/FitnessSync/backend/src/services/__pycache__/discovery.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/discovery.cpython-311.pyc deleted file mode 100644 index 60de270419b6ff6b4491a87e773fb6fc8eded904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18557 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 diff --git a/FitnessSync/backend/src/services/__pycache__/discovery.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/discovery.cpython-313.pyc deleted file mode 100644 index f55f0e56c64f7b89cd40a3affaf27faa6470a1dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16194 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 JKt5jR{|n*Toyq_J diff --git a/FitnessSync/backend/src/services/__pycache__/fitbit_client.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/fitbit_client.cpython-311.pyc deleted file mode 100644 index 230c0998a90c334faff372065315f186bb7d6bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6789 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 A+W-In diff --git a/FitnessSync/backend/src/services/__pycache__/fitbit_client.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/fitbit_client.cpython-313.pyc deleted file mode 100644 index 2638d1f9a6ffdaf6e94068a00f35bf8761819407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6339 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 Q{;lnzg(?3M5lWf<2QAUPNB{r; diff --git a/FitnessSync/backend/src/services/__pycache__/garmin_client.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/garmin_client.cpython-313.pyc deleted file mode 100644 index fee4c6277228957b981814b8ddc0b87a07852375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34367 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%0D+($ zLprw`v^*q+)tyHd;$XHXn-;?hm|Fj|CXiB_-1&PnfE}r5YAgkOyC>}=mjdo?DXH`T z<4)4oOM$J1;mvDcOK?=bR;09%-A1FTpGQ3TBZ?Pbe5BE#DEk4LUcLi4h{{80mwd`l zfho1x6w>x2C&^V|xw_MU!z=BlDfWPIeoVXId~HrDI{~Ncm}!^?giBF6wbTkb*ov5H z^-!Fq1&kb}@Z~!#F^r2p+!&R>tM4! z9t$cvg0vU8JQCDY2xP`{2J<#3Uxg>n<)N_TJMAH9F#lk^#bX5#oH=Oiv?|-@p-hN) zdeT`L88#omk8iDILC#&Ihv$gSL8`hVIcbDUi;~EJ_&z`I72Bl4fXG#d$AeIQLb)4~ zT1nqOl);Ep!O=EyHcj|okg&@Oe1bA{qz@v^fhHPdWE6^*m@V=ZVdR^{L{0PySCk~C z?9wEBthFgpjisjWMKw(VgZd#yG7#C1(biNS>;Q-0#2(S@+#sI=sb}!$F{&6eY4J6~Aa^6(o50_1g`TrhU_m zo*_*uB0*lHLy$JpZjNejsg)MWi7lvLth)tG=Cvo`wkjmeXRs*=XLuH$2zxk&PlQK& z3ZJ~_oI__E9m3iYhSG;fzDUa`7t`knhGp1VQRk&uSp%qF9l=1#rSFw z8Bfx6IHYcbvv4S8dr)AQ z3sV?oIbc)^K*B&nyvTq`aAvOXv8%(&=B4L(+wr)`^Ly~bD^`2LS{1ccU3)HSZ6UXpMgiaHO) z%6cwm-6^hpegD<{*FjHm*Jaa6>RVOQoBQ9`ztFZgAFDdVTUoT?3x}{AuMYm%;Pt(? zZ1_zs@l;n?@A8r5HooLU-1_8g>*j>D@|Lxdui6o}?v(5W5204q&}p7nHWrei9pTb5 zaqHRJHQN(4dv4W$3?f$3e_0>5R^Hy)^4<2g+Ar$?Skzh>x7JBjItm}XS~cqPp45=7 zl9p&$OQNhJTGkOOJ8=0hJrh`YaOugVqdYqhw+(_oqQ;3}D-Z}dhlZcgQk3Fk+=3?y;=}G@Y!{r-k;JC6?F|16^k|S zGMp6bS$cjc$X9t1wi8j?iO*Jb82Z`$TA~M^Ew^0xnfO^Re{MW>*2kam^Q9AU>m)@% zdGinS3&Y>fNVFV?wjAJ_JNZ&PS0@E;|G^GWQh#E>$(Odrt@}O@to#zQ&CLs$iI#)W zmV>dD9=`c7UkaZPJNhWKy;D$lIped{VkqK+PX@7y@1tl1=d^dSyIY28bU*1h*x0{W z`)iFgf7V4sg#y00=R4;qm9V z7JM!xvs=7?=Rw_eENK}VdwSkGEq=W(cWjK9N{26-`h&A$W5T@n0%m~xx9~+l zGGU^O8tkfrW@%WMr2h;(bOAUFgPaSeN5_E96?BZ?Bn{^-q7K;`=<%26$a|GPz}Fw5 z12j3qy$4Qm^B8<05>CjEgHRH7V9%i-c5Lh|hG?0RsgTRY$mpPOF~n&Y=1-Wr+CsyS z=34$LgZG7ya9=+DF?s*(t|tt(-*WKXSGWzq_bSQll*Zt=`;69Uuw6T}%D`;_lEZD; zL~i`(Qy=5&-4hzC!FCL8&z|GQC-|ug{P>0F+3D!1nU68v-Rc}j z<6dRpwkX_|Px2>5-W~fGz3#HP5L~s&z-`552tRw4ulLkN&7 z+~DX)H$QxQ`N%t87NI;s6q}F{+%O}!rDO!}s|_ZD<68B725xt4Er!Z#?vEL`-Sug_ z8iW0M_bP+;MfWGAit;gbeXJtV!)`Na#H#NC&47 z=RuB*B62viLu~&~`KRHNyCE(M!IG8Pj!&f76Zlkx4hv4w)GqYt4(>yEg`U8Kc7X#^ ziAM7QWBGuw{R7hwV;VkSaz0=(|ADFdkSX|(sr$#w&6lTQndL7UKhZyJ*4Tf`piAKX E9|Vm=Gynhq diff --git a/FitnessSync/backend/src/services/__pycache__/garth_helper.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/garth_helper.cpython-311.pyc deleted file mode 100644 index 1865bb123c11f39bb1ca4bd3d3908383f92b33e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2582 zcmaJDO=#Oz_{o-R`8RQ$zh+6}E-9T;YA+e2Stw;`(yVJkT4;8t8F;Ss?8uWX_ep7* z;FM4X3#IFz3{n^cA4 zao=moT8cA9==}2X<#RW)xU7nD2?*XRSWy6c?E(qF`Ps|gEXzOOQru+(F3qm0D-$N# zL?$i7C0xt49D*Vwk7&Yg7Gd2%DuDK=cFNgAI1Fdd462|i4dK90J#CUxr^>cDZAftK zy7$S^=njm>KzY)lZZZ{ygey#;<&Ag&^V$MR+>sM+(>r&8b^2wH8g26h&dI&a_>kJ$ z<`)7s+!=*aXVdjTjaH=lG~5+ewN)y%2f7QMeUfa2CB5n=ZJ9#YhAZr@*C`FTjo4hU z6&6v&^@zF0sDo{4q1%Sj5gSsE*-%r<{SmF!={c=5{4&lYQPoXH$9})^)lWVZVFmXOR^fv$*bT}EP?aH zM*sWSU`>#V84)fR5`x1q3PqJF}jNE&YMweTGMp^Lb1RmMR+D^;JyP32ku0mlGuwlk~N9 zgUg9TQH?{8zPgf@sm+PBnXZF2*`#^bGNc42X!u&UsKFK#xnywk?I?yjk5z*+tr@zr(%0w^% zO-q89Rh!6Unj+@88w^%xzAS3<#l72 zCX8+yNgWG)zy<+`8UA%o!>;AIF&gkrn#?I8Ey*tzQryriL zMUUyxV=tn~=h5WTX)T(pMd$VC{EO&?=g|wb=%OB7+*+&$2O7x5eevKsefYEq{WYY| zes4m1eE65}ov_wFRpU?T{3(q;wHNN!1}19ZNj*HN@skaFlolMX1;_Q^H~_E4lG@lA zn17zI_Mf@CL7hLk_W}AVKBV)9U+}}v`QaKrqVppfKSF~K+zDtsCu@8{=M$Pe-|hu^ zXnONZ=SszccY<2)nWq!5!2GvoJ6PkFbbd+Wm(0A+KE19DoP}8n&*|Ygjh}l9qrp*I z04Rsyz5Lxf7d$tLo{jn!M%~X&PAnX8|8s-`INoh|X;(l66DmlCU@^S8jG|`BBB9@K zBdlDPGE#O07uORqDH8gbHM)zkfF&gXQdTEejTABKB0;;xA}eO4TQ%*2R#>!JkWZ&e znIcZ73H>OT^+UPGbfKMgKcC47cV080NgD7&yU+zi9KMBy#-siVM_`P5Nx z%Y5qSsOFq?^r_~Yb#z>F&N`aX-Zx+R2Dkfl-{6Dknr}?^jcs`vY(F#4RPzl)_m8jS Ha|rlx0kjl3%egd(%KjzaM;=-1Mk_pNDR4u9*Hm6T)xsB;iBgQY5=G)h79-d-8%&sj_}6=0kOls&R{oJ)lo z9EP2(Av%}l-ml@x077Xl6=pgOSl4KCG@=a&!5szWAudczTc~-Fkxn{bVPO67t4G8)2 zvVWX|dixkxj-Ekj&kQ%pHQ7o`+JMD+2Q$YR*Rl1!gKfRLO)*&7%o)IgYGv~QIoCB0 zoK%tZL_&o~Kgt|p>VBl0L`WB!>`yUS1ImH45Jew)EgR=9;o>SLl4VFmL&*Vzdnx6KQIcjZNQ$15ZeXJ2*Co@v!_rO7T9!Ul zNJ-P<8z<($M$-#Tij;E2%p@L<+rENh0hd4MM95m}t9YZgrsxLM4NJ-!YY$xxI%B|x&{KW6E!w<*qk9~h>J9fMpOH^Wst+8?}QI5@2W64S^xgDFoJ^wu1^=PTu zdk#K7^;D<6fX}WNy%)V3Eq9LYh#&7pJIh_e+tHD-II_pL2s7MnNB6^(?^ZT@s{Q9H z{pYtkrtX9e;=O3=dDwTqZ?kK=?c^Qb^HAGvxb5DRZ?0^PJ_(-=-;^wEo_(c{y>S;_l& z^!V&i?=MFMz=v9GKb>xvL_!q_eUoi}UNJ3YRU`EG){dIji%L;l#-;VRK}v+D%+`{T z!$mU=TJA)<7oyEMxHz4Dmu)%|>&|8XMta`8N@6yvD!1C722v{nP%PXgVK# diff --git a/FitnessSync/backend/src/services/__pycache__/job_manager.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/job_manager.cpython-311.pyc deleted file mode 100644 index f725221ab14fdacd3cc38a941925cff768d62cfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17962 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 diff --git a/FitnessSync/backend/src/services/__pycache__/job_manager.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/job_manager.cpython-313.pyc deleted file mode 100644 index 4d32df5719e877b493e07ebce796a4130d9e4331..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15429 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 bOpFfMV}k>2n+N@n&XA>b{uKpvqTc@pfinh; diff --git a/FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-311.pyc deleted file mode 100644 index b823330cf8c8efdcc1653eee4947865c81f6dc0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2996 zcma(TOKcNIbauVA*PjjlKu8FyLTTMktU^D4szPXKfrbbOP}M4|);kktVb*JA*ZB!c zIpmO5NWGOFddQ(l)dp2n&pq_o+kzsoTB%Z{s#3Wbg-VE1-;CFe-Eipa^Yi=7%zHC$ z-pqHJmPOEvudmui(+K^^nRZiRV!Z~$U4#*qC~~BdByn1%vXdw!1f8IYlPo0#t*-{o{X{^$mlP~2ZB%_ZI&MYFFU6B!5g~#G)oMeS4Z1Wz*xbyhl9GcB_tglQ7^j7we=>F1Rio2d>X@t3H|a z9kXgy2z$im0qmjOiwG)77?ot4!ZJxr$~du@EGbx7M5QE2;p8G( z0lU?>6GEjlmcaFNwC#fH`4vVcE{>gV%{di`9_)WZMowPd~N6;RIH25~uE^S3tVj(cDHxdux%O>#|p|dK=y7 z=T##;7r3)a+^{$_theYtEwN!$Km;nswi`T*tBfD8uPVTKA?R zrEFI*?3V0$QK~|GQk`ZzTE@eSQmuqze0`(*L@U3>cmxGGQanN@Ssqj#-$`A6RxFye zTCr?eH%S#2J!Ta>!lrGDc%6l~MU6NEM{0ACY8ZAE!Z+skZpxOCwoc%m(y_XlU!24|PX{^~yv=J)*Gzd!8X6Alc9dxyh;p{ADJoqdb|J>h6c zxs&^6E8181>GZExf{RzyE`AmaUAsSYZEfh7Ycny$ng4ckCENF$-fCjGz5>E0O&`<=OqNMoQ2s%{y9y*9i${ zXrHsCp$a-nw>sMz8439ZVamAO*wLnzd2(!OkhZ(p!h5+Dh+wr71&o@9WYy-2XJNT* zlS2OJ{uI&M=TR@u>7vF!?&v0^Ivi6mG3VPl#Qa@-Gn!(p^|uP^D~tj_b}4lloKViO*~c`1AxM{Fqw-a>qyF z2#m(Yd^ldzwzPV1yI92bfJ@_r{z!9NOsF>kg$-O|FMv4O8q3U@ZTQ?hc7Thwx5eP7 z;R#O}U)pGAte6o#8*pC0Y4##lZE5$3Jz|HtJ4}f{3`a!5Uh3|^53xbr3VWGLcl~D= zF+J30uGm@MmPBmMcKIi!_KflP!+OlA2;JMiwH$D!f)ZGa7fHA zCK6+Mysqe-#)g57(&G5x^8CQ&^B1f5eBN(>7Em*VGKT~8jcy3lV$chrdL-zDP<7kJ=sWp{hSn^=16+%|O-ftB2QAa6AU4Lo_`{ zTmb=3l=ZIweT*c21EFQ0H@6iKZQOPZDFZjoRdg4M!EI@|bKtuB_4eQgd;%u>zt%Ho zHt{K%kqYws;05MR+nDI)#<`8}{E_j3%!XjrC}~j_o&&N-kVwYmxHz}=yAMjdfy+kR zZC>BJ?Y$PS!kFGUK!3w0GN5n!Lv8qhHhf>x*ED@eZpw+w?r{6gr8E5dBj5MsnJ>CGkC7I@K+B`t+&CllyDsF#5TFR8175@q)@Pf~x5d!-%qm0jHu)Ih{9*TXmDh znuO;wwjcVkw>g5R8e+!*eUHS3iU1kE%LNkm5(aLe^EKss^19SS94}9_{-1+~`jSVQ zsDpHr+S!y-$=yu^=y3wr#p@daA#FLp=PvX`S-AR5YE2PmPF$tY-VMPByue1f-fm2R zK2cwnfymk Oj2?5@ljkTzJpTd^s1p_d diff --git a/FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/postgresql_manager.cpython-313.pyc deleted file mode 100644 index 4eab779dc27f85900a2cbda67aee8934cd155ac1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2680 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 F{6Al{d58c2 diff --git a/FitnessSync/backend/src/services/__pycache__/scheduler.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/scheduler.cpython-311.pyc deleted file mode 100644 index a387bbb92e78204e4f8dfb6cffab19e4d582bac8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12117 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 diff --git a/FitnessSync/backend/src/services/__pycache__/scheduler.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/scheduler.cpython-313.pyc deleted file mode 100644 index 4435d33606e220db8b9b6068c5dcc052a486410b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10125 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 B%vJyZ diff --git a/FitnessSync/backend/src/services/__pycache__/segment_matcher.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/segment_matcher.cpython-311.pyc deleted file mode 100644 index 4d1a3f5f06e9e087cad45f0e2ce7381f376908a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21837 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 diff --git a/FitnessSync/backend/src/services/__pycache__/segment_matcher.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/segment_matcher.cpython-313.pyc deleted file mode 100644 index db3767c96427cb901c8543386898d625cc158344..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14196 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 diff --git a/FitnessSync/backend/src/services/__pycache__/sync_app.cpython-311.pyc b/FitnessSync/backend/src/services/__pycache__/sync_app.cpython-311.pyc deleted file mode 100644 index ce28f09c5923c93701a573502fbe7a9aebf4273e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7002 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 BbwU6D diff --git a/FitnessSync/backend/src/services/__pycache__/sync_app.cpython-313.pyc b/FitnessSync/backend/src/services/__pycache__/sync_app.cpython-313.pyc deleted file mode 100644 index 7dbab2161092614ff9198f81029c61b3aeaf2bdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6541 zcmd5AOKcm*b(TLZMNvzAEYp%@)3O|ga!mOr#dZ`2{zQr;S$4FNEn7?$D{>{RO_9p% zQnpm2aW6qy1SoninnMl++Jg)PsB(&Os*lcXX{n&GwOa#i4!+4%f&e}Bz1dyNr_+lje{o({Gif;$<;)sU(KKiP$R}l8(bYNSDM|oD-GEHz)b!bus-*R&s0xsc z7V>mLR~J-$QCv(X02{KfZz*z0pS5ufR}^(-R>zj8&;>Q20O79eJgSj0R7y|~)~g0*!+~>Z5Kae#S|v#_0hG1>Fvgke6*x{uD;k;NYv% ziY_Mx3tYbft|o^|bc-I*d%_hV)%i!aIh4g3D2t5(6u6gO)M50gPi7_PGz;(rCuusMl60trz9g@r*WF02~L(#HR2Q@3TYtd*E#dV#06!0 z`;jzAN)#jB4A>h9!vq=TCfk4*P1I|8G$l1%IYz&#Nw}g)Qp4O7!OtA-p3TfD-I}Ju z#@Bs`X09sYf6Ol1_GOG|}xCqZiQpscjm)gxo}rL+?xycuIOKU@c9R8;en6N|6K?_3^o5g@Vh`h6v>4m#-6L|p=*yq z+l-cz_d3@?15cdZy}8g{qx0r^=oahkSsi;2I`fT>>^ihkyVgGVkq1WqsO`Y=;96Th zHo}kEURl0&Ke*O*nKhsAb-xY#I*{kXIX-Oc82T$eya}@>ravh!Y7&|Cm~NyK4zKE!l3TDjK@K z6@+CcArEZ_aWsNO2Nb4I!FSh1_hIJ&C^VdEBtrKi;vf{}cE>>~xS~jnn>YALg$dXB z;fF#~Uf7cp_T+`bIpOe1bWP|p_&(Z&BE2bfPSs7{^~{u{CQTnz^ejy$N^OSL`3bFD zO#YUYkC$2*<7OVh2}1qEF4(^M7;u5A zuYtJEkCm*!iJWj^b>EusmchTp)}XqvZ-KlY;nJ9`D!!uovXezM2X~3C6C9Y`y|n9W zCPTr@vYw%lY4|%SHG(#T{9m~$|I_z5X4zHk%r?ght8g+7Ja<7BD29Ab zPUu;=u_l}`_%knXx1T11R>t;`N-rwA?UiKFlAB|x1MNkdG%@ce=cKqoKf+A9J16YU3rBOp(UtRSLchWHTPCf#Dg78Hp|8VWz!mHX;^tB@!5EIV zbcZ-sKEJIjXOW}CKguU_%HU7Ez(0QIWJ*`MY%*=k@=gw}m{boAu`Krv;H>sKUjG8# z{*u{+nyr&cKGc^B^{tMtg@z3O& zZb#7?YlFIoh)Y{mZv>yZl-hJjXjS7rP_(>U&6uV zvL<8=KFd522G)W48?nF}rghiE6lxv2FcIlvTue7!RoU^~t?88FQm``*J%PQRsZ1tCac`%%K~c=&6q6pskfi8d6m7{YjZX;~ zS*Mo)VQ!NoO^3TS9E{*jtWITh1un~X3A2TDaK-y0#RA{tv`=B>KP1mwE#3>KX6yp68au4QQO_?loDpacRsLpD?byV~oF(yYwzn zp68zNKJRPGKmpb2QC8jWyssH!SMJ~XD)ud+H<~%`S#DX|AXu;H->@2W4A?pbxK-%I z_Wh(GUWPFl;^bFp)Gz=VIPV)c7N}M`SG9X*S8sg@lA-y`$9adjl_u;P=I$|?Va^zv zFs{apcV*+MoEw`$%3+Y=^7eDfXHiW*x0RT0{pI~H-$zjkoH2gQ2Bs7n$WRN|Amkz(unP^zHRbw_F(EKe7UzW_X8CZ;dU9nhX$CQ=#hi1d z^->aGIBOTC);kHqSUHRaQD`m0WOX&AQI-W-0n0+e3M=Mi3B=)z(u#Jz&kC7S^akKC zM8*Yx{{zmHmL0-y{m%b()k4gL2n!oe5 R?>kRF$1QOGCahvA{tFG?xWWJc diff --git a/FitnessSync/backend/src/services/activity_file.py b/FitnessSync/backend/src/services/activity_file.py new file mode 100644 index 0000000..ce9ece3 --- /dev/null +++ b/FitnessSync/backend/src/services/activity_file.py @@ -0,0 +1,91 @@ + +from typing import Optional, Dict, Any, List +from sqlalchemy.orm import Session +from fastapi import HTTPException, Response +from ..models.activity import Activity + +from .parsers import parse_fit_to_streams +from ..utils.sampling import downsample_streams +import logging + +logger = logging.getLogger(__name__) + +class ActivityFileService: + @staticmethod + def get_file_response(db: Session, activity_id: str) -> Response: + """ + Retrieve and prepare a file download response. + """ + activity = db.query(Activity).filter(Activity.garmin_activity_id == activity_id).first() + + if not activity: + raise HTTPException(status_code=404, detail=f"Activity with ID {activity_id} not found") + + if not activity.file_content: + raise HTTPException(status_code=404, detail=f"No file content available for activity {activity_id}") + + # Check if synced/downloaded? + # Existing logic checked 'download_status == downloaded'. + if activity.download_status != 'downloaded': + raise HTTPException(status_code=400, detail=f"File for activity {activity_id} is not ready for download (status: {activity.download_status})") + + content_type_map = { + 'tcx': 'application/vnd.garmin.tcx+xml', + 'gpx': 'application/gpx+xml', + 'fit': 'application/octet-stream' + } + + content_type = content_type_map.get(activity.file_type, 'application/octet-stream') + filename = f"activity_{activity_id}.{activity.file_type}" + + return Response( + content=activity.file_content, + media_type=content_type, + headers={"Content-Disposition": f"attachment; filename={filename}"} + ) + + @staticmethod + def get_streams(db: Session, activity_id: str) -> Dict[str, List[Any]]: + """ + Get activity streams, preferring DB cache (Activity.streams_json), falling back to file parse. + Applies downsampling and caches the result. + """ + activity = db.query(Activity).filter(Activity.garmin_activity_id == activity_id).first() + + if not activity: + # Return empty or raise error? Existing logic returned empty structure if not found. + # But here we need activity to check cache. + # If activity doesn't exist, we can't get file content either. + return {k: [] for k in ["time", "heart_rate", "power", "altitude", "speed", "cadence", "respiration_rate"]} + + # 1. Check Cache + if activity.streams_json: + logger.info(f"Hit streams_json cache for {activity_id}") + return activity.streams_json + + # 2. Parse from file + logger.info(f"Parsing streams on-the-fly for {activity_id}") + full_streams = None + + if activity.file_content and activity.file_type == 'fit': + try: + full_streams = parse_fit_to_streams(activity.file_content) + except Exception as e: + logger.error(f"Error parsing FIT for streams: {e}") + + if not full_streams: + return {k: [] for k in ["time", "heart_rate", "power", "altitude", "speed", "cadence", "respiration_rate"]} + + # 3. Downsample + downsampled = downsample_streams(full_streams) + + # 4. Cache Result + try: + activity.streams_json = downsampled + db.commit() + except Exception as e: + logger.error(f"Failed to cache streams_json: {e}") + db.rollback() + + return downsampled + diff --git a/FitnessSync/backend/src/services/activity_query.py b/FitnessSync/backend/src/services/activity_query.py new file mode 100644 index 0000000..fbd299e --- /dev/null +++ b/FitnessSync/backend/src/services/activity_query.py @@ -0,0 +1,107 @@ + +from typing import List, Optional, Tuple, Any +from sqlalchemy.orm import Session +from sqlalchemy import or_, func, desc +from ..models.activity import Activity +from ..models.activity_state import GarminActivityState +from ..models.bike_setup import BikeSetup +import logging + +logger = logging.getLogger(__name__) + +class ActivityQueryService: + @staticmethod + def list_activities(db: Session, limit: int, offset: int) -> List[Tuple[Optional[GarminActivityState], Optional[Activity]]]: + """ + List activities combining GarminActivityState and Activity tables. + Returns a list of tuples (state, activity). + """ + return ( + db.query(GarminActivityState, Activity) + .outerjoin(Activity, GarminActivityState.garmin_activity_id == Activity.garmin_activity_id) + .order_by(GarminActivityState.start_time.desc()) + .offset(offset) + .limit(limit) + .all() + ) + + @staticmethod + def query_activities( + db: Session, + activity_type: Optional[str] = None, + start_date: Optional[str] = None, + end_date: Optional[str] = None, + download_status: Optional[str] = None, + bike_setup_id: Optional[int] = None, + has_power: Optional[bool] = None, + has_hr: Optional[bool] = None, + has_cadence: Optional[bool] = None, + is_estimated_power: Optional[bool] = None + ) -> List[Activity]: + """ + Advanced filtering of activities. + """ + query = db.query(Activity) + + if activity_type: + if activity_type == 'cycling': + query = query.filter(or_( + Activity.activity_type == 'cycling', + Activity.activity_type == 'road_biking', + Activity.activity_type == 'mountain_biking', + Activity.activity_type == 'gravel_cycling', + Activity.activity_type == 'cyclocross', + Activity.activity_type == 'track_cycling', + Activity.activity_type == 'commuting' + )) + else: + query = query.filter(Activity.activity_type == activity_type) + + if start_date: + from datetime import datetime + start_dt = datetime.fromisoformat(start_date) + query = query.filter(Activity.start_time >= start_dt) + + if end_date: + from datetime import datetime + end_dt = datetime.fromisoformat(end_date) + query = query.filter(Activity.start_time <= end_dt) + + if download_status: + query = query.filter(Activity.download_status == download_status) + + if bike_setup_id: + query = query.filter(Activity.bike_setup_id == bike_setup_id) + + if has_power is not None: + if has_power: + query = query.filter(Activity.avg_power != None) + else: + query = query.filter(Activity.avg_power == None) + + if has_hr is not None: + if has_hr: + query = query.filter(Activity.avg_hr != None) + else: + query = query.filter(Activity.avg_hr == None) + + if has_cadence is not None: + if has_cadence: + query = query.filter(Activity.avg_cadence != None) + else: + query = query.filter(Activity.avg_cadence == None) + + if is_estimated_power is not None: + if is_estimated_power: + query = query.filter(Activity.is_estimated_power == True) + else: + query = query.filter(Activity.is_estimated_power == False) + + return query.all() + + @staticmethod + def get_activity_by_id(db: Session, activity_id: str) -> Optional[Activity]: + """ + Retrieve a single activity by its Garmin Activity ID. + """ + return db.query(Activity).filter(Activity.garmin_activity_id == activity_id).first() diff --git a/FitnessSync/backend/src/services/bike_matching.py b/FitnessSync/backend/src/services/bike_matching.py index 2626dce..421ccc9 100644 --- a/FitnessSync/backend/src/services/bike_matching.py +++ b/FitnessSync/backend/src/services/bike_matching.py @@ -236,12 +236,15 @@ def process_activity_matching(db: Session, activity_id: int): db.commit() -def run_matching_for_all(db: Session): +def run_matching_for_all(db: Session, job_id: str = None): """ Run matching for all activities that don't have a setup. """ from sqlalchemy import or_ + # Import job_manager locally to avoid circular dependencies + from ..services.job_manager import job_manager + activities = db.query(Activity).filter( # Activity.bike_setup_id == None, # Re-match everything to enforce new rules/constraints @@ -257,8 +260,22 @@ def run_matching_for_all(db: Session): or_(Activity.bike_match_confidence == None, Activity.bike_match_confidence < 2.0) ).all() + total = len(activities) count = 0 - for act in activities: + + if job_id: + job_manager.update_job(job_id, message=f"Found {total} candidates. Matching...", progress=0) + + for i, act in enumerate(activities): + # Check cancellation + if job_id and i % 10 == 0: + if job_manager.should_cancel(job_id): + break + # Update progress + progress = int((i / total) * 100) if total > 0 else 100 + job_manager.update_job(job_id, progress=progress) + process_activity_matching(db, act.id) count += 1 + logger.info(f"Ran matching for {count} activities.") diff --git a/FitnessSync/backend/src/services/discovery.py b/FitnessSync/backend/src/services/discovery.py index 939d765..48bcb19 100644 --- a/FitnessSync/backend/src/services/discovery.py +++ b/FitnessSync/backend/src/services/discovery.py @@ -36,7 +36,9 @@ class SegmentDiscoveryService: def discover_segments(self, activity_type: str, start_date: Optional[datetime], - end_date: Optional[datetime] = None) -> Tuple[List[CandidateSegment], List[List[List[float]]]]: + end_date: Optional[datetime] = None, + min_frequency: int = 2, + max_candidates: int = 10) -> Tuple[List[CandidateSegment], List[List[List[float]]]]: @@ -94,9 +96,8 @@ class SegmentDiscoveryService: grid[(xi, yi)].add(act_id) # 4. Filter Hotspots - # Keep cells with > 2 unique activities - min_freq = 2 - hotspot_cells = {k: v for k, v in grid.items() if len(v) >= min_freq} + # Keep cells with > min_frequency unique activities + hotspot_cells = {k: v for k, v in grid.items() if len(v) >= min_frequency} logger.info(f"Found {len(hotspot_cells)} hotspot cells.") @@ -151,6 +152,10 @@ class SegmentDiscoveryService: # 7. Deduplicate against DB final_candidates = self._deduplicate_against_db(candidates, activity_type) + # Sort by frequency desc and limit + final_candidates.sort(key=lambda c: c.frequency, reverse=True) + final_candidates = final_candidates[:max_candidates] + return final_candidates, list(activity_paths.values()) diff --git a/FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-311.pyc b/FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-311.pyc deleted file mode 100644 index 6bc30d0183efa7490cefd9264b23da78093ced8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13783 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 H38ViTbx&Bh diff --git a/FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-313.pyc b/FitnessSync/backend/src/services/garmin/__pycache__/auth.cpython-313.pyc deleted file mode 100644 index 5402b8560065f6a82ebc4d6ca542df9f2550201e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12744 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 diff --git a/FitnessSync/backend/src/services/garmin/__pycache__/data.cpython-311.pyc b/FitnessSync/backend/src/services/garmin/__pycache__/data.cpython-311.pyc deleted file mode 100644 index 37f6874da296a1533d41b657dd4a3123d8a0db4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19210 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 D-)|tr diff --git a/FitnessSync/backend/src/services/garmin/__pycache__/data.cpython-313.pyc b/FitnessSync/backend/src/services/garmin/__pycache__/data.cpython-313.pyc deleted file mode 100644 index eb0e4c7479f0abe16247e8f0c08ae6e31a9c3710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16945 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 CNW)+N diff --git a/FitnessSync/backend/src/services/parsers.py b/FitnessSync/backend/src/services/parsers.py index 8e59246..aa4120a 100644 --- a/FitnessSync/backend/src/services/parsers.py +++ b/FitnessSync/backend/src/services/parsers.py @@ -7,100 +7,136 @@ from datetime import datetime logger = logging.getLogger(__name__) -def extract_activity_data(file_content: bytes, file_type: str) -> Dict[str, List[Any]]: +def extract_activity_data(file_content: bytes, file_type: str, strict_gps: bool = True) -> Dict[str, List[Any]]: """ Extracts all relevant streams: points (lat, lon, ele), timestamps, hr, power. + Returns: { Returns: { 'points': [[lon, lat, ele], ...], 'timestamps': [datetime, ...], 'heart_rate': [int, ...], 'power': [int, ...], 'speed': [float, ...], - 'cadence': [int, ...] + 'cadence': [int, ...], + 'type': str # Added activity type } """ if file_type == 'fit': - return _extract_data_from_fit(file_content) + return _extract_data_from_fit(file_content, strict_gps) elif file_type == 'tcx': return _extract_data_from_tcx(file_content) - return {'points': [], 'timestamps': [], 'heart_rate': [], 'power': []} + return {'points': [], 'timestamps': [], 'heart_rate': [], 'power': [], 'type': None} def extract_points_from_file(file_content: bytes, file_type: str) -> List[List[float]]: - # Wrapper for backward compatibility + """ + Extracts purely the coordinate points (lon, lat, optional ele) from the file. + Legacy wrapper for backward compatibility. + """ data = extract_activity_data(file_content, file_type) return data['points'] def extract_timestamps_from_file(file_content: bytes, file_type: str) -> List[Optional[datetime]]: - # Wrapper for backward compatibility + """ + Extracts timestamps corresponding to the data points. + Legacy wrapper for backward compatibility. + """ data = extract_activity_data(file_content, file_type) return data['timestamps'] -def _extract_data_from_fit(file_content: bytes) -> Dict[str, List[Any]]: +def _extract_data_from_fit(file_content: bytes, strict_gps: bool = True) -> Dict[str, List[Any]]: + """ + Internal helper to parse FIT files using fitdecode. + Args: + strict_gps: If True, only extracts records that have valid GPS coordinates. + If False, extracts all 'record' messages (useful for indoor activities). + """ data = { 'points': [], 'timestamps': [], 'heart_rate': [], 'power': [], 'speed': [], 'cadence': [], 'temperature': [], 'distance': [], 'respiration_rate': [], - 'session': {} # New key for summary data + 'respiration_rate': [], + 'altitude': [], # Add explicit altitude stream + 'session': {}, # New key for summary data + 'type': None } try: with io.BytesIO(file_content) as f: with fitdecode.FitReader(f) as fit: for frame in fit: if frame.frame_type == fitdecode.FIT_FRAME_DATA: - if frame.name == 'record': + if frame.name == 'sport': + if frame.has_field('sport'): + sport_enum = frame.get_value('sport') + # fitdecode usually returns strings for enums if known + data['type'] = str(sport_enum).lower() + + elif frame.name == 'record': # We only collect data if position is valid, to keep streams aligned with points? # Or should we collect everything and align by index? # Usually points extraction filtered by lat/lon. If we want aligned arrays, we must apply same filter. - if frame.has_field('position_lat') and frame.has_field('position_long'): - lat_sc = frame.get_value('position_lat') - lon_sc = frame.get_value('position_long') + # Logic: If strict_gps is True, we skip records without GPS. + # If strict_gps is False, we take all records, but points might be None. + + has_gps = frame.has_field('position_lat') and frame.has_field('position_long') + + if has_gps or not strict_gps: + lat = None + lon = None + ele = None - if lat_sc is not None and lon_sc is not None: - lat = lat_sc * (180.0 / 2**31) - lon = lon_sc * (180.0 / 2**31) + if has_gps: + lat_sc = frame.get_value('position_lat') + lon_sc = frame.get_value('position_long') + if lat_sc is not None and lon_sc is not None: + lat = lat_sc * (180.0 / 2**31) + lon = lon_sc * (180.0 / 2**31) - ele = None - if frame.has_field('enhanced_altitude'): - ele = frame.get_value('enhanced_altitude') - elif frame.has_field('altitude'): - ele = frame.get_value('altitude') - + if frame.has_field('enhanced_altitude'): + ele = frame.get_value('enhanced_altitude') + elif frame.has_field('altitude'): + ele = frame.get_value('altitude') + + data['altitude'].append(ele) + + if lat is not None: data['points'].append([lon, lat, ele] if ele is not None else [lon, lat]) + else: + data['points'].append(None) - # Timestamps - ts = frame.get_value('timestamp') if frame.has_field('timestamp') else None - data['timestamps'].append(ts) - - # Speed - speed = frame.get_value('enhanced_speed') if frame.has_field('enhanced_speed') else frame.get_value('speed') if frame.has_field('speed') else None - data['speed'].append(speed) + # Timestamps + ts = frame.get_value('timestamp') if frame.has_field('timestamp') else None + data['timestamps'].append(ts) + + # Speed + speed = frame.get_value('enhanced_speed') if frame.has_field('enhanced_speed') else frame.get_value('speed') if frame.has_field('speed') else None + data['speed'].append(speed) - # Distance - dist = frame.get_value('distance') if frame.has_field('distance') else None - data['distance'].append(dist) + # Distance + dist = frame.get_value('distance') if frame.has_field('distance') else None + data['distance'].append(dist) - # Cadence - cad = frame.get_value('cadence') if frame.has_field('cadence') else None - data['cadence'].append(cad) - - # HR - hr = frame.get_value('heart_rate') if frame.has_field('heart_rate') else None - data['heart_rate'].append(hr) - - # Power - pwr = frame.get_value('power') if frame.has_field('power') else None - data['power'].append(pwr) + # Cadence + cad = frame.get_value('cadence') if frame.has_field('cadence') else None + data['cadence'].append(cad) + + # HR + hr = frame.get_value('heart_rate') if frame.has_field('heart_rate') else None + data['heart_rate'].append(hr) + + # Power + pwr = frame.get_value('power') if frame.has_field('power') else None + data['power'].append(pwr) - # Temperature - temp = frame.get_value('temperature') if frame.has_field('temperature') else None - data['temperature'].append(temp) + # Temperature + temp = frame.get_value('temperature') if frame.has_field('temperature') else None + data['temperature'].append(temp) - # Respiration Rate - resp = frame.get_value('respiration_rate') if frame.has_field('respiration_rate') else frame.get_value('enhanced_respiration_rate') if frame.has_field('enhanced_respiration_rate') else None - if 'respiration_rate' not in data: - data['respiration_rate'] = [] - data['respiration_rate'].append(resp) + # Respiration Rate + resp = frame.get_value('respiration_rate') if frame.has_field('respiration_rate') else frame.get_value('enhanced_respiration_rate') if frame.has_field('enhanced_respiration_rate') else None + if 'respiration_rate' not in data: + data['respiration_rate'] = [] + data['respiration_rate'].append(resp) elif frame.name == 'session': # Extract summary fields @@ -113,7 +149,10 @@ def _extract_data_from_fit(file_content: bytes) -> Dict[str, List[Any]]: 'avg_stress', 'avg_spo2', 'total_strokes', 'avg_stroke_distance', # Standard Metrics - 'max_heart_rate', 'max_speed', 'enhanced_max_speed', 'max_cadence', + 'total_distance', 'total_timer_time', 'total_elapsed_time', 'total_calories', + 'avg_heart_rate', 'max_heart_rate', 'avg_cadence', 'max_cadence', + 'avg_power', 'max_power', 'avg_speed', 'enhanced_avg_speed', + 'max_speed', 'enhanced_max_speed', 'total_ascent', 'total_descent', 'total_training_effect', 'total_anaerobic_training_effect', 'training_stress_score', 'normalized_power' @@ -214,10 +253,24 @@ def _extract_points_from_fit(file_content: bytes) -> List[List[float]]: return _extract_data_from_fit(file_content)['points'] def _extract_data_from_tcx(file_content: bytes) -> Dict[str, List[Any]]: - data = {'points': [], 'timestamps': [], 'heart_rate': [], 'power': []} + """ + Internal helper to parse TCX files using ElementTree. + Extracts trackpoints including extension data (Power). + """ + data = {'points': [], 'timestamps': [], 'heart_rate': [], 'power': [], 'type': None} try: root = ET.fromstring(file_content) ns = {'ns': 'http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2'} + + # Extract Activity Type (Sport) + # Search for Activity tags anywhere + for activity in root.iter(): + if activity.tag.endswith('Activity'): + sport = activity.get('Sport') + if sport: + data['type'] = sport.lower() + break + # TCX namespaces can be tricky. Using simple tag checks for valid coords. for trkpt in root.iter(): @@ -276,3 +329,92 @@ def _extract_points_from_tcx(file_content: bytes) -> List[List[float]]: + + +def extract_streams(file_content: bytes, file_type: str) -> Dict[str, List[Any]]: + """ + Extracts streams specifically formatted for frontend analysis/charts. + Standardizes output format (e.g. relative time in seconds). + + Returns dict with keys: + - time (relative seconds) + - heart_rate + - power + - altitude + - speed + - cadence + - respiration_rate + """ + streams = { + "time": [], + "heart_rate": [], + "power": [], + "altitude": [], + "speed": [], + "cadence": [], + "respiration_rate": [] + } + + # Use strict_gps=False to get all data (including indoor) + raw_data = extract_activity_data(file_content, file_type, strict_gps=False) + + timestamps = raw_data.get('timestamps', []) + if not timestamps: + return streams + + start_time = None + # Find first non-none timestamp + for t in timestamps: + if t: + start_time = t + break + + if not start_time: + return streams + + # Generate streams + # Points include altitude. They might be None if no GPS. + points = raw_data.get('points', []) + + # Pre-fetch other arrays + hr = raw_data.get('heart_rate', []) + pwr = raw_data.get('power', []) + # speed/cadence/resp + spd = raw_data.get('speed', []) + cad = raw_data.get('cadence', []) + resp = raw_data.get('respiration_rate', []) + + for i, ts in enumerate(timestamps): + if ts is None: + # Skip records without timestamp? + # If we skip, we break alignment if we were just iterating? + # But we are iterating arrays by index 'i'. + # If TS is None, we probably shouldn't plot it. + continue + + t_rel = (ts - start_time).total_seconds() + + streams['time'].append(t_rel) + streams['heart_rate'].append(hr[i] if i < len(hr) else None) + streams['power'].append(pwr[i] if i < len(pwr) else None) + streams['speed'].append(spd[i] if i < len(spd) else None) + streams['cadence'].append(cad[i] if i < len(cad) else None) + streams['respiration_rate'].append(resp[i] if i < len(resp) else None) + + # Altitude + ele = None + if i < len(points): + p = points[i] + # p is [lon, lat, ele?] or [lon, lat] or None + if p and len(p) > 2: + ele = p[2] + streams['altitude'].append(ele) + + return streams + +def extract_summary(file_content: bytes, file_type: str) -> Dict[str, Any]: + """ + Extract summary stats (session/metadata). + """ + data = extract_activity_data(file_content, file_type, strict_gps=False) + return data.get('session', {}) diff --git a/FitnessSync/backend/src/services/segment_matcher.py b/FitnessSync/backend/src/services/segment_matcher.py index 441c365..2509893 100644 --- a/FitnessSync/backend/src/services/segment_matcher.py +++ b/FitnessSync/backend/src/services/segment_matcher.py @@ -119,7 +119,8 @@ class SegmentMatcher: # Map segment type to activity types (inverse of what we do in match_activity) if segment.activity_type == 'running': query = query.filter(or_( - Activity.activity_type.ilike('running'), + Activity.activity_type.ilike('running%'), + Activity.activity_type.ilike('run'), # Exact match for "run" or "Run" Activity.activity_type.ilike('trail_running'), Activity.activity_type.ilike('treadmill_running'), # unlikely to have GPS but safe Activity.activity_type.ilike('walking'), @@ -142,7 +143,54 @@ class SegmentMatcher: query = query.options(joinedload(Activity.streams)) candidates = query.all() - logger.info(f"Segment Scan: Found {len(candidates)} candidate activities for Segment {segment.name} ({segment.id})") + candidate_ids = {a.id for a in candidates} + + # Fallback: Find activities without streams (or failed intersects) using rough proximity + # Use start_lat/lng if available + if segment.points: + try: + seg_points = json.loads(segment.points) if isinstance(segment.points, str) else segment.points + if seg_points: + start_lon, start_lat = seg_points[0] # GeoJSON is lon, lat + + # Search window ~5km (approx 0.05 deg) + lat_min, lat_max = start_lat - 0.05, start_lat + 0.05 + lon_min, lon_max = start_lon - 0.05, start_lon + 0.05 + + fallback_query = self.db.query(Activity).filter( + Activity.start_lat.between(lat_min, lat_max), + Activity.start_lng.between(lon_min, lon_max), + Activity.id.notin_(candidate_ids) # Avoid duplicates + ) + + # Apply regex Type Filter (same as above) + if segment.activity_type == 'running': + fallback_query = fallback_query.filter(or_( + Activity.activity_type.ilike('running%'), + Activity.activity_type.ilike('run'), + Activity.activity_type.ilike('trail_running'), + Activity.activity_type.ilike('treadmill_running'), + Activity.activity_type.ilike('walking'), + Activity.activity_type.ilike('hiking') + )) + elif segment.activity_type == 'cycling': + fallback_query = fallback_query.filter(or_( + Activity.activity_type.ilike('%cycling%'), + Activity.activity_type.ilike('%road_biking%'), + Activity.activity_type.ilike('%mountain%'), + Activity.activity_type.ilike('%mtb%'), + Activity.activity_type.ilike('%cyclocross%') + )) + + fb_candidates = fallback_query.all() + if fb_candidates: + logger.info(f"Segment Scan: Found {len(fb_candidates)} additional candidates via proximity fallback.") + candidates.extend(fb_candidates) + + except Exception as e: + logger.warning(f"Fallback proximity scan failed: {e}") + + logger.info(f"Segment Scan: Found {len(candidates)} total candidate activities for Segment {segment.name} ({segment.id})") matches_found = 0 diff --git a/FitnessSync/backend/src/services/sync/__pycache__/__init__.cpython-311.pyc b/FitnessSync/backend/src/services/sync/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 6cd416f0bbcfa6f4ac4dc4e70846d960f80452af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151 zcmZ3^%ge<81hsu}nIQTxh=2h`DC095kTIPhg&~+hlhJP_LlF~@{~09tOG`hopg=z< zF*!RmFGat&C|SQawWusJIki~7xH2zUKR!M)FS8^*Uaz3?7l%!5eoARhs$CH)P%Fsr VVtyd;ftit!@dE>lC}IYR0RT9&A(a3C diff --git a/FitnessSync/backend/src/services/sync/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/services/sync/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 56a78c9e6d7a992b2be09ccd1f86d6fdce34df87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 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 F{{=~-R(b#c diff --git a/FitnessSync/backend/src/services/sync/__pycache__/activity.cpython-313.pyc b/FitnessSync/backend/src/services/sync/__pycache__/activity.cpython-313.pyc deleted file mode 100644 index 4a26e714025a1c98a4f2d85c4541f427497d7dd7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25720 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 P`clgK^LG@%bLjs9k&t~3 diff --git a/FitnessSync/backend/src/services/sync/__pycache__/health.cpython-313.pyc b/FitnessSync/backend/src/services/sync/__pycache__/health.cpython-313.pyc deleted file mode 100644 index aad0af793a82e03eb14132aefcff22bcb205bd62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19505 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 diff --git a/FitnessSync/backend/src/services/sync/__pycache__/utils.cpython-311.pyc b/FitnessSync/backend/src/services/sync/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 34102524b16b7ee9a922cb418151cce065cd8462..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2471 zcmZ`*O>7fK6rT0|c-Q}l9g>(pT@r8%CBafb2`#kHL_+1SZPWukU^(6)IPBVHc1=jM zsiLZf6d@5+NFY(9RH7*;9C~P_o_eS_^k^eXtX4vbRB_<86r>{5L*MLX?YL@ZXJ@{7 z^X9#o_cOacgu?*@<3=}JX_UEm2yF`_|MA#fQh?MD;J^nPhm|1(sLG8!#H#T7Zm;C zX{?h{(Gq3~L@kvqzvgmTLDiYa>+@A?aa57TUnwXx7}Uxo-4e7)jTEsJma$$aDOk<} zPr(uh)@!6(1P8PVbqiJc((qB^OUOX0t;wxGhk37bns0T>jK_hH!5BV+f5@zX^mVGi zDXT5yQE0yg?|O@{=r;tC(4`gu&GH^LgihUMM)oa=hM%0$TkZwj{@KXG1!DPIDNav z1Ck;hHhg;0!$6OEcs1sst$nB7HSoZC%L~-*hWJoegLAF7&bBClXInwNRhA)jS_e|c zKZOR7KGfzKLS)}!K;P4*tR~vHjbzba?jTt*0(a0|?%#6HK`Ji>zJMeH+c;>BnL}6E zb7+pq1Q&8Auu{b&rB_n5Dvjz?g`|oEQ&dP@bW$SahJK3RVui>fsn48{)>7#*o=d-z zO1leXfUq{LT`EO)sd`wkXm~XIR+4!nR35K(8aPRG#rRyWl&VvUp7AGCdZ5xrWI+p_yk% z7fOnbNq&0X;xCklrd!;sRw-M&TvMx>#TKSD(hH1^c1IDR9tCZcIV-Ta@q9riG|DW0 zv7%0w%GhG*b-~fSf(Ti*q{*vA?A$(k=&Ds_-aYh z;W%6F6K9hFIC9>#k;Pz*CPk`U-lRth)#~VUp?C?GR~Yl!{mz)#l5^(VAXT zw2|t(wbMOEzC!Y@xAU&AH)WF%5KO(Norf!X3E7Fa`QD9q^45`Wj(k7Rh>tYmBTwRE zkKXo8`|I@ev<+8%mmNZfK4R*9r|xp!23C(W z`m)WwY`ri0JGUI(2*z!ckouoRyI01V@!|Ui8}S2;Xto*6{y6zKI$n>Co5TB8#Aa-_ znHpLVZ-&jxAv)aibkE*<7r&dmH%mu@W^Za`-i!~dj6dt&Z4RW(9lOk){-?=Z&E($u z@BZBP)4-GL@yFTYjqF4-JJCo^Hj|UUVD|1XckZ*JVlwgqLGy|>%OBg_D4e))^4iJU zfktSs85*pI2F-Zi%E8x9g9#h?_}+H&RE*pRT?^HFKD>Vk8mPZ~>h=xsSW`S!7mu0I zZOe1s^BRiHg9zxgx4_O{9v_+z&~JN>C82vH1SZ~NAH`A=huBAlc)%GSp{_oYNsyh; zTYef*5FTy}3h+^)1A4&{dT$efG6l5DNmNO~FUWVHncy zz6L)9$YvRaF;Q^Ic}x^pavl@ysCQNq4cGs_ZlLY;&T67v_0GD14%9pAhLl|HZA!`8 zV-0DjDGe>Bu7u4~qJV<&>-%j##UcuI*%Czo6pYwG jib5zHv%?fcP-5Wr#Lc6wuow~~yNlAP*#BzCI9TN$+!0!V diff --git a/FitnessSync/backend/src/services/sync/__pycache__/utils.cpython-313.pyc b/FitnessSync/backend/src/services/sync/__pycache__/utils.cpython-313.pyc deleted file mode 100644 index 14af4518e47f8d875994a97acd6915f6b57f9332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2257 zcmZ8iU2GIZ9G|`2z5Te)atDQ@l%=$^2ehRMNQt08tK=#l-g*hKr2i=kr)$=nh0;2n8>s8z$2widKpS25lnbHY=TC8@ISY=J!F#G|8M61Isf_1 z+)5~v@KCVVL$@o8+0pWssh5mF)% zQ-0!at_c%TN+xm>ixWypB`RRQE=>edK@!wZmP;qRbZyy#vf(|PJ13ED)Q$8GUCyey zl8x$W)|c*S+j>Y3WY_3H(1+j`&Wc$<1eG4iMt4W`Xada&vmA*Px#XHB%;k8JqjJG; zuw#~SlBdF$nRlpsqUx9x%P3JXV*vmoVY+7JK}tHdZCHB3gE!2BN3l_IW{zQpn0YGM zu9gPM&4rvZSH)Cd38;A1DAiz6vrLEj?MjX0F%1>4W0)me$bpSP{RBHTV&&loRtGy6 zmTcvukF~!WWl*}+lvNu5lc05n*RnL*`3ob%WqcV?=SKPT^Ep~pds@k2^oC|S?c6A zZzY}dP+RJ9h6^KI$*5uUve1sT8Lp_M9#V^{E2p_>bb#NCrnzL`!n;Rtsfvl_RJ2-^ zF;%M&El)5*hBnirx8~AWBRF3ng&{57q^Yg-Tlif6POaZ{EC2-Ge*3gpt>QxeP?9IC z>x2=2MB#J1`0vf9_l`}Se2q#iAGkBFc~WW`(_riBG_MPZfEQKR?X(@ETy2LU>{+5b z6mVhPI3bX?8PK$fUa=Q^`!yJ4@p;pBU^~yf5zQi1*mBP85#_MWLTT+m zj}OmO%6Qne9c($nCrM=%=N)_a4bypt82QsLF=W9jrO#RU;VD?bR${xJ;Hq``RR)qP8`f%(|LjXm?RT?>(s@5dJ+qxFHo#b{q$>%A7LC-*K!w=Hkm z{@u*iGvCZ!l^3I1>z!IX*7ayZU%jipzNx3acEfU_XDPA$USj)=-9N7Xsq2TXrIEw) zBZn78#ugIeps#mss(0^r8j%y>OR2^h6pCM&xIA%PT?}rm$JYO~9Eh(VpV+x9hpz-L z2k&+c-Z*{Zy<0uE-oAC@?%LNE`%!47(NZ29 pI~oc@Dhh-f0fvGo6m5hU3Zr<}^|4P5HdrJG>sOw203xGM(tmmj2<`v? diff --git a/FitnessSync/backend/src/services/sync/__pycache__/weight.cpython-311.pyc b/FitnessSync/backend/src/services/sync/__pycache__/weight.cpython-311.pyc deleted file mode 100644 index 90864aec75897e0f0622e9a3e93a6963c7306d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13238 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 S!0Oo=KEnB*KcN&e@c#knu`dV! diff --git a/FitnessSync/backend/src/services/sync/__pycache__/weight.cpython-313.pyc b/FitnessSync/backend/src/services/sync/__pycache__/weight.cpython-313.pyc deleted file mode 100644 index f723f6b1ad54fcdce9fb62f93a35779fd358ff2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12407 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 ZWBuwt#@P0p{`cAwTGilh37ktS{U5q~T1Nl? diff --git a/FitnessSync/backend/src/services/sync/activity.py b/FitnessSync/backend/src/services/sync/activity.py index b779165..454b33d 100644 --- a/FitnessSync/backend/src/services/sync/activity.py +++ b/FitnessSync/backend/src/services/sync/activity.py @@ -504,6 +504,17 @@ class GarminActivitySync: else: stream = ActivityStream(activity_id=activity.id, **data) self.db_session.add(stream) + + # Backfill Activity start coordinates if missing + if activity.start_lat is None or activity.start_lng is None: + lats = data.get('latitude', []) + lons = data.get('longitude', []) + for lat, lon in zip(lats, lons): + if lat is not None and lon is not None: + activity.start_lat = lat + activity.start_lng = lon + self.logger.info(f"Backfilled start coordinates for activity {activity.id}: ({lat}, {lon})") + break self.logger.info(f"Saved streams for Activity {activity.id}") diff --git a/FitnessSync/backend/src/tasks/__pycache__/definitions.cpython-311.pyc b/FitnessSync/backend/src/tasks/__pycache__/definitions.cpython-311.pyc deleted file mode 100644 index 800575f9620cd2cf2b59be2d6059cb2d4443d9c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15276 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 diff --git a/FitnessSync/backend/src/tasks/definitions.py b/FitnessSync/backend/src/tasks/definitions.py index 29a3557..ad0f47a 100644 --- a/FitnessSync/backend/src/tasks/definitions.py +++ b/FitnessSync/backend/src/tasks/definitions.py @@ -234,7 +234,7 @@ def run_bike_matching_job(job_id: str, db_session_factory): job_manager.update_job(job_id, status="running", progress=0, message="Starting bike matching...") - run_matching_for_all(db) + run_matching_for_all(db, job_id=job_id) job_manager.complete_job(job_id, result={"status": "completed"}) diff --git a/FitnessSync/backend/src/utils/__pycache__/__init__.cpython-311.pyc b/FitnessSync/backend/src/utils/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 38ae350a86654794b35b17f4f53bb06620832c99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143 zcmZ3^%ge<81l@CeGC}lX5CH>>P{wCAAY(d13PUi1CZpd&ryk0@&FAkgB{FKt1RJ$Tppcas!#r#0x12ZEd N;|B&9QN#=s0|4?89(e!& diff --git a/FitnessSync/backend/src/utils/__pycache__/__init__.cpython-313.pyc b/FitnessSync/backend/src/utils/__pycache__/__init__.cpython-313.pyc deleted file mode 100644 index 01398ff9b5e445696c61397a18ec15e32f54ee2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmey&%ge<81l@CeGC}lX5CH>>P{wB#AY&>+I)f&o-%5reCLr%KNa~iSenx(7s(x{C zNorn+en3%vR%&udvA$boNk~y*a<&nOm6uvv99)@~te*rFNzF^qFD^>fFD=Q;Db|mV q&&bJS}ooMwpqMpcAW@B zB&*7SsyX<86iZDcAEKmH`UCnCdfbgH)mkYMQct}R(Nj)+;}04eH}mo4&D-}i@4cCQ z?e%&Pw4Yuq$WA*#f6+~|!M@gxMOdC85s8d~(sX4NW{XX;48?7VZ40L{gCxwNIV9pI zNVLCV5qbl&-d@4-rny0BJBuWH8_gjyD=6gnn{q9N7|XSk(`7X)D1f^~K^HQLplO*C zC4e{@n`1v1dWIyFW<-=`SHaD+4NTzgn+E`gMO&*&X@}<q1iNl(g~UR}8odv)lTd$zw3dtLdr&K`bU+G%-X5w~ zJR=3yS<(Llr#}+|P)tF~5mU44^2Y9Xea#br))ZGOB~Dj4O;?G;N!f=oQL|f8R_7iH zL>AT*Nef%uv(Z#^Cb|;mSCb37(>YbsH;ANdD^rn3b2F8LqI{$haavI`g0cxbQ@#JFkPW*(h z99>ztx0IZ<@K;MKsa@w-xYjMayp&8?n5wnxv+=qP&CQHI>}3xgMb~9&79l| z2syo9Hkik00PsLC8_Z*7kC{dHFF$7Wk2v?x9^0B_&976*MibdR_Gk2hZLOLgn5ToH z4Kj&$C%+LC8J+=&(>Dd3Bhq$WCX(1WcbouOg|LK)6ZG$1xg%?uoZa}e)D)Krv6gc~ z(gj^7mIn;xr8prf3E3>HNy@tAZJOnwOf<_zAw2}gaUVFyMJ_@^FJ;AuMlzASE-P9j zQ>(ymZpU&xY#d>?w_c9nCgD8j(3Sxd(BZ%pqknkcTMckWh;=8KI^2)F3!E)Ylmlj9 zuo4(NLX0=byzAqPi_3qE1At-n-L3T9HGFrEZ1m${Z(v_P2A%Ml_E|2T&k9=-&s!dz z-%`cALh){%-_8q4c8lY9B?LqYv zKI(_~hJkM!IncnR68qd;4jb2Wvp-+y&leVoUl=$K!^C-DxH48=dnp@ZGv-jNG88j# zu((;$4z>&oc+AAH>ecaIF8vlVCcZYW&R4F^8@RtTTpoWuYGAp>oLdjZ}Oih1q>L$_NY-k5qkuqOF)H&Kx94>*aMbI9dsgn!a$w7q0V# z4IDOc81w|r7cU)zN^|9Vrhl~JAN|um{?00l`fnBD`x6Gf1;fO*j3EmCx+%EfYwji) zfe-Xu(DDGFQW>U-+=W`NqH{*;sG^HT>o{aQN9=h9+&&H7Q`$ciytg5?>&ZZ!^Ct56 Q_WOS9f7)Mg&|Y)vUmKS``2YX_ diff --git a/FitnessSync/backend/src/utils/__pycache__/config.cpython-313.pyc b/FitnessSync/backend/src/utils/__pycache__/config.cpython-313.pyc deleted file mode 100644 index e14de8d4df34f513e01b7c8476794ec1a6a71afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2143 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 g2WDGB`e55t<=tN;K2 diff --git a/FitnessSync/backend/src/utils/__pycache__/helpers.cpython-313.pyc b/FitnessSync/backend/src/utils/__pycache__/helpers.cpython-313.pyc deleted file mode 100644 index b9357a557d18a6470ff20dedf2660776751f9383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1952 zcmah}%}*Og6rcUDy~Z{sVA?n#$q3rZLAn^S~Qwm9K- zmB{mKjoY4UIU-C6uT!_w4xoaf!E-VR%NBZYYAZ-fhYX^z)=eSQVFER<4WXQ}I&_P0 zT&hz_T#jWXj9b+jwq1PNoW-Acv}*B@9Ml0`6yZ8Ax!$sf+RSU3en2NOfSAlLdR3BV zi~~;o9`zoP5@-1do6k|J^!fYpzet=Kp=_kKBKj+Y z&$kkqKTU|nAxan?b{>{>^hd03bNuo6er%u-ySf{@x*yB#=vgXzE)tY{QMV~6&o5b& zl@z!OL?ZZAdoM15%TJ%n8KO*Jj5V=b&~3(tbu&tQa#%Kz2*%paqf>j=dV z2G7%XFC+9I(gFeonra~$XlHv-31W7m>!D?p$N9M;1Gr_N-!gQWHmcuGiJM$H@xs6URAH*iMd=zs2&qx=nMdhuvM!;`$VWl zZI=uEk!QQWkOX8c;?*XyUwWa*2FQA2jA=~T(@U*{=i5^Bo#|U(m;Gb+VOd8n`})_X zpC<=4w4>y?&6US1+kKmBU#}g;&o|;%cH>vR(|(H&{S`tzm;N!3kvcLGJ3TjkO8uJt zIsNSB{s;GVZrtDLE*u!@b7c zmT%90t?l?QJJi*z33IB3EetcmEnBpV9j{U$6ffI+u{Aq5&}?LNG?TSh$scqKzl$?j z*@s;7=#VAiwCON{m{kF5E-E4t5D-KZxHs*C3u6(2IWR3m!sL`#)ybwVq7(kK;)IGg z(ELp6vdZPa$pFi=j41TmcPD0ZI(-|yRD_$Ei%1JxM4R&sz?f_@5V*x)30<$vH~nb_ zY!ZM~VS%xfNHr3d_Y#-4`F>((ec~{7ZgYHd{HQnG=pEkc9p3NFZA6Yz7aOU}UMh1K z|M)~x`@1%x$6*xhX&3{$#=!Qc2gdNB(cLi8yGD9@_`nzhZ8P~*^4rMM_>=g7kpa~8 z8K2O(I88&~)^z48HK-Mp`BK?kp)pSV$tiTlX7H;nc%I|`Xd>LKrvCv{4jvz``I8zq zt6sV8kdNp)V30G9-Gb#VAPPy+9YAqv)}&D!Fa;3c+@4#FU=z=Z+CHUVutKRM9r)y8v{+35S(7$@btwR6+ diff --git a/FitnessSync/backend/src/utils/__pycache__/logging_config.cpython-311.pyc b/FitnessSync/backend/src/utils/__pycache__/logging_config.cpython-311.pyc deleted file mode 100644 index 993b648934cff38a0b0270eca6d5dc21e3612d49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1163 zcmZ`%%WD%s7@vLS(Ih6ZDW)$&rI4V_3Mz<*2dj<6k{(JCdI_7IZMwSI4KtI{=F~$^ zUi4NE5d=XI|CuU+%bW!9(Az?9J^9V%VW~R1`RKc>@31nd2)P3NYD&`+U^ zR%$4mz69Y2VT2_YZ4Gt_b{Q*J#TwQf$&qjj$8iGmB%bK2LT^c+D>&6xB02pZ`Cl=a zz6QC1;Zk45*}lFd`=4m+6{Zpp$rbu5QhOLPma5yQ5KJlJSy>hW&zQ7DIkgOv<`5D*w}&4b20O1y^}}M z`JL&1v=0#bc^ogn-vf6i_hvV2*6oyrQ!c^Sx1Cm(m<$e3t;0B@&Y*X$4}3g{9g8hT zaXhoOUaPIvYmMdg`pRnU6FLkbMU}IuCGweyJ0O_3!H3S9R{K_eEX$rY;?iULry&Dk;LoGehR;fSJsKF(M;# zLK30mD!^I%e%r@g*M2}2Ko#SlX~0mCBq>0dgXjrR;du0hI?CpP(&CSJE=WxtPpyTD zJedp?^|BtOP$C}`ZUlwdptulBmBWMvE+jyS<@9h8O<#L65xM8Xn3@HjfYi`D6BLD6 zqzJfRo)Kn%kr`@;=)5okjLa8Eu1{z65DB=8^2MMq|N3dDDQU0?cqSQnIYa;lnXoCz LQZ+<>Lo}}6inKeO diff --git a/FitnessSync/backend/src/utils/__pycache__/logging_config.cpython-313.pyc b/FitnessSync/backend/src/utils/__pycache__/logging_config.cpython-313.pyc deleted file mode 100644 index b91bfc24fa759aa1a7bf8d5a3420cf3e3fb8fed3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1106 zcmZ`%O-~a+7@qy?2W>5t63dqjhJ=l>OH>kLj0aIFVv1oU9ypNgc34)oyJTicpeH=( zO)n%Kym|6R_#gCOY=(=8UbwaCAMl-RDTe5q%*^wCJ^Rc%+skIt2<+3lO@C2C=$CNL zEHePTw*ZcjjcjQRk^U*cDcg#z+M2B|N{f=6u#6x2@8jSvzkw-rJSgM|HwtMK;8rn+JkJk3(`E!ajmJ({4=~}{!$%J`E3G^} zV0SHx9#WICdemfw$~8A|DCJsA&QpCE40?1LQy2PbX*rCa?NuH+l4#{0>5_4kYgSq-p9~+VjmOgM zOX7{d$_U;~ZcW*kHTTMc3728yJHFQ>4g>LK6-F7W0^MBi=XkpAyKFhGCfh|fI4w?0gL@%++sI}s==frVe-4rN2K=v$MCzlKxQCe zsH6l3&kgv@J|CHaU`#=#1rnv?swhm}Yee;CfbWx8aK)VH7uY(ABuOVIcY=x?9py*c z<+-29(ROC+>-f`-B9Emzih5b^WKgQmF5YMtr`o02_V|1^rHNExRPT(TiEAH5;>=7p zq2|+2+>cDQOCkb=7b27A5#SRwh4aX;t9yMSuXpaCLaAMxdB4`xl&s!;Az20aDA%h= JvSh~B`vU@nDrNux diff --git a/FitnessSync/backend/src/utils/sampling.py b/FitnessSync/backend/src/utils/sampling.py new file mode 100644 index 0000000..adad009 --- /dev/null +++ b/FitnessSync/backend/src/utils/sampling.py @@ -0,0 +1,48 @@ +from typing import Dict, List, Any, Optional + +def downsample_streams(streams: Dict[str, List[Any]], target_points: int = 1500) -> Dict[str, List[Any]]: + """ + Downsample a dictionary of aligned data streams to a target number of points. + Uses simple decimation (N-th point sampling) to ensure alignment across all streams. + + Args: + streams: Dictionary where keys are stream names and values are lists of data. + All lists must be of the same length (or handled gracefully if not). + We use the 'time' stream (or the first found) to determine length. + target_points: Number of points to reduce to. + + Returns: + New Dictionary with downsampled lists. + """ + if not streams: + return {} + + # Find a reference key to determine length (prefer 'time') + ref_key = 'time' if 'time' in streams else next(iter(streams)) + count = len(streams[ref_key]) + + if count <= target_points: + return streams + + step = count / target_points + indices = [int(i * step) for i in range(target_points)] + + # Ensure last point included for completeness + if indices[-1] != count - 1: + indices[-1] = count - 1 + + sampled_streams = {k: [] for k in streams} + + for idx in indices: + for k in streams: + # Safety check if some streams are shorter/missing + if streams[k] and idx < len(streams[k]): + sampled_streams[k].append(streams[k][idx]) + else: + # Should we append None? Or skip? + # If we skip, streams become misaligned. Appending None is safer. + # But if the whole stream was empty/None, maybe acceptable. + if streams[k] is not None: # List exists but index out of bounds? + sampled_streams[k].append(None) + + return sampled_streams diff --git a/FitnessSync/backend/templates/discovery.html b/FitnessSync/backend/templates/discovery.html index 5d3a662..dbf4cc0 100644 --- a/FitnessSync/backend/templates/discovery.html +++ b/FitnessSync/backend/templates/discovery.html @@ -63,95 +63,99 @@ -
- - -
-
-
- - -
-
-
- -
- + + - -
-
-
- - -
-
- - -
+
+ + +
+
+ + +
+
+
+ + +
+
+
+ +
+
+
-
-
-
-
Parsing Options
-
-
- - -
Split segment if stopped longer than this.
-
-
- - -
Higher values simplify path more (ignores small - wiggles).
-
-
- - -
Split segment if sharp turn detected.
-
-
- - -
Ignore segments shorter than this.
-
+ +
+
+
+ + +
+
+ + +
+ +
+
+
+
Parsing Options
+
+
+ + +
Split segment if stopped longer than this.
+
+
+ + +
Higher values simplify path more (ignores small + wiggles).
+
+
+ + +
Split segment if sharp turn detected.
+
+
+ + +
Ignore segments shorter than this.
+
-
- -
-
-
+
+ +
+
+ +
+ + +