"""Garmin routes: trigger a sync and read sync status.""" from flask import Blueprint, request, g, jsonify from auth import require_auth from db import query_one from services import garmin as garmin_svc bp = Blueprint("garmin", __name__) @bp.route("/sync", methods=["POST"]) @require_auth def sync(): data = request.get_json(silent=True) or {} creds = { "garminEmail": (data.get("garminEmail") or "").strip(), "garminPassword": data.get("garminPassword") or "", } # Fall back to the stored Garmin email when only a password is supplied. if not creds["garminEmail"]: user = query_one("SELECT garmin_email FROM users WHERE id = ?", [g.user_id]) if user and user.get("garmin_email"): creds["garminEmail"] = user["garmin_email"] # The stored Garmin password is only kept as a hash, so it cannot be # recovered. A live sync requires the plaintext password in the body. if not creds["garminPassword"]: return ( jsonify({ "status": "error", "recordsSynced": 0, "message": "需要 Garmin 密码以执行同步,请在请求体中提供 garminPassword" "(密码仅作哈希存储,无法还原)。", }), 400, ) result = garmin_svc.sync_data(g.user_id, creds) return jsonify(result) @bp.route("/status", methods=["GET"]) @require_auth def status(): return jsonify(garmin_svc.get_sync_status(g.user_id))