solving sync flow

This commit is contained in:
2025-08-26 10:57:13 -07:00
parent 0a5076f7bb
commit 6f6dccfa7d
2 changed files with 41 additions and 3 deletions

View File

@@ -1,6 +1,7 @@
import os
import json
from flask import Flask, request, jsonify
from flask import Flask, request, jsonify, send_file
import io
from garminconnect import Garmin
import logging
@@ -77,6 +78,26 @@ def get_activity_details(activity_id):
logger.error(f"Error fetching activity details: {str(e)}")
return jsonify({"error": str(e)}), 500
@app.route('/activities/<activity_id>/download', methods=['GET'])
def download_activity(activity_id):
"""Endpoint to download activity data."""
api = init_api()
if not api:
return jsonify({"error": "Failed to connect to Garmin API"}), 500
try:
format = request.args.get('format', 'fit') # Default to FIT format
file_data = api.download_activity(activity_id, format=format)
return send_file(
io.BytesIO(file_data),
mimetype='application/octet-stream',
as_attachment=True,
download_name=f'activity_{activity_id}.{format}'
)
except Exception as e:
logger.error(f"Error downloading activity: {str(e)}")
return jsonify({"error": str(e)}), 500
@app.route('/health', methods=['GET'])
def health_check():
"""Health check endpoint."""

View File

@@ -105,9 +105,26 @@ func (c *Client) GetActivities(start, limit int) ([]GarminActivity, error) {
// Helper function removed - no longer needed
// DownloadActivity downloads an activity from Garmin Connect (stub implementation)
// DownloadActivity downloads an activity via the Python API wrapper
func (c *Client) DownloadActivity(activityID int, format string) ([]byte, error) {
return nil, fmt.Errorf("DownloadActivity not implemented - use Python API")
url := fmt.Sprintf("%s/activities/%d/download?format=%s", c.baseURL, activityID, format)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
resp, err := c.httpClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("API returned status %d", resp.StatusCode)
}
return io.ReadAll(resp.Body)
}
// GetActivityDetails retrieves details for a specific activity from the Python API wrapper