mirror of
https://github.com/sstent/garminsync-go.git
synced 2025-12-06 08:01:52 +00:00
87 lines
2.8 KiB
Python
87 lines
2.8 KiB
Python
import os
|
|
import json
|
|
from flask import Flask, request, jsonify
|
|
from garminconnect import Garmin
|
|
import logging
|
|
|
|
app = Flask(__name__)
|
|
|
|
# Setup logging
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s: %(message)s')
|
|
logger = logging.getLogger(__name__)
|
|
|
|
# Environment variables
|
|
GARMIN_EMAIL = os.getenv("GARMIN_EMAIL")
|
|
GARMIN_PASSWORD = os.getenv("GARMIN_PASSWORD")
|
|
|
|
def init_api():
|
|
"""Initializes the Garmin API client."""
|
|
try:
|
|
api = Garmin(GARMIN_EMAIL, GARMIN_PASSWORD)
|
|
api.login()
|
|
logger.info("Successfully authenticated with Garmin API")
|
|
return api
|
|
except Exception as e:
|
|
logger.error(f"Error initializing Garmin API: {e}")
|
|
return None
|
|
|
|
@app.route('/stats', methods=['GET'])
|
|
def get_stats():
|
|
"""Endpoint to get user stats."""
|
|
stats_date = request.args.get('date')
|
|
if not stats_date:
|
|
return jsonify({"error": "A 'date' query parameter is required in YYYY-MM-DD format."}), 400
|
|
|
|
api = init_api()
|
|
if not api:
|
|
return jsonify({"error": "Failed to connect to Garmin API"}), 500
|
|
|
|
try:
|
|
logger.info(f"Fetching stats for date: {stats_date}")
|
|
user_stats = api.get_stats(stats_date)
|
|
return jsonify(user_stats)
|
|
except Exception as e:
|
|
logger.error(f"Error fetching stats: {str(e)}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@app.route('/activities', methods=['GET'])
|
|
def get_activities():
|
|
"""Endpoint to get activities list."""
|
|
start = request.args.get('start', default=0, type=int)
|
|
limit = request.args.get('limit', default=10, type=int)
|
|
|
|
api = init_api()
|
|
if not api:
|
|
return jsonify({"error": "Failed to connect to Garmin API"}), 500
|
|
|
|
try:
|
|
logger.info(f"Fetching activities from {start} with limit {limit}")
|
|
activities = api.get_activities(start, limit)
|
|
return jsonify(activities)
|
|
except Exception as e:
|
|
logger.error(f"Error fetching activities: {str(e)}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@app.route('/activities/<activity_id>', methods=['GET'])
|
|
def get_activity_details(activity_id):
|
|
"""Endpoint to get activity details."""
|
|
api = init_api()
|
|
if not api:
|
|
return jsonify({"error": "Failed to connect to Garmin API"}), 500
|
|
|
|
try:
|
|
logger.info(f"Fetching activity details for {activity_id}")
|
|
activity = api.get_activity(activity_id)
|
|
return jsonify(activity)
|
|
except Exception as e:
|
|
logger.error(f"Error fetching activity details: {str(e)}")
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
@app.route('/health', methods=['GET'])
|
|
def health_check():
|
|
"""Health check endpoint."""
|
|
return jsonify({"status": "healthy", "service": "garmin-api"})
|
|
|
|
if __name__ == '__main__':
|
|
app.run(host='0.0.0.0', port=8081)
|