diff --git a/backend/app/services/garmin_connect_sync.py b/backend/app/services/garmin_connect_sync.py index db7d7c0..d934904 100644 --- a/backend/app/services/garmin_connect_sync.py +++ b/backend/app/services/garmin_connect_sync.py @@ -74,9 +74,9 @@ def sync_activities(garmin, user_id: int, since: Optional[datetime], List activities from Garmin Connect, skip any already in the DB, download FIT ZIPs for new ones, and queue them for processing. - On first sync (since=None) the start date is determined by lookback_days: - -1 → full history back to 2010; N → today minus N days. - On incremental syncs fetches from one day before last_sync_at. + lookback_days controls the start date on every sync: + -1 → full history back to 2010 on first sync, then incremental (since-1d) + N → always look back N days from today (dedup prevents re-downloading) Returns the number of new activities queued. """ import time @@ -84,10 +84,9 @@ def sync_activities(garmin, user_id: int, since: Optional[datetime], from app.models.user import Activity from sqlalchemy import select, func - if since: - start_date = (since - timedelta(days=1)).date() - elif lookback_days == -1: - start_date = date(2010, 1, 1) + if lookback_days == -1: + # All-time: full pull on first sync, incremental thereafter + start_date = (since - timedelta(days=1)).date() if since else date(2010, 1, 1) else: start_date = date.today() - timedelta(days=max(lookback_days, 1)) end_date = date.today() @@ -173,16 +172,23 @@ def sync_activities(garmin, user_id: int, since: Optional[datetime], # ── Wellness sync ───────────────────────────────────────────────────────────── -def sync_wellness(garmin, user_id: int, since: Optional[datetime], db) -> int: +def sync_wellness(garmin, user_id: int, since: Optional[datetime], db, + lookback_days: int = 90) -> int: """ Fetch daily stats / sleep / HRV from the Garmin Connect JSON API for each - day since `since` and upsert into health_metrics. + day in the window and upsert into health_metrics. + + lookback_days controls the window on every sync: + -1 → full history back to 2010 on first sync, then incremental (since-1d) + N → always cover the last N days (upsert is safe to re-run) Returns the number of days upserted. """ from sqlalchemy import text - # First sync: 90 days of wellness history; incremental: from last sync - start_date = since.date() if since else (date.today() - timedelta(days=90)) + if lookback_days == -1: + start_date = (since - timedelta(days=1)).date() if since else date(2010, 1, 1) + else: + start_date = date.today() - timedelta(days=max(lookback_days, 1)) days = (date.today() - start_date).days + 1 processed = 0 diff --git a/backend/app/workers/tasks.py b/backend/app/workers/tasks.py index 907df6d..06cc37e 100644 --- a/backend/app/workers/tasks.py +++ b/backend/app/workers/tasks.py @@ -507,7 +507,10 @@ def sync_garmin_connect_user(user_id: int): if cfg.sync_wellness: try: - wellness_days = sync_wellness(garmin, user_id, cfg.last_sync_at, db) + wellness_days = sync_wellness( + garmin, user_id, cfg.last_sync_at, db, + lookback_days=cfg.sync_lookback_days if cfg.sync_lookback_days is not None else 90, + ) except Exception as exc: errors.append(f"wellness: {exc}")