Files
FitTrack_GarminSync/data-model.md

6.4 KiB

Data Model for GarminSync Service

This document outlines the key entities, their attributes, relationships, and validation rules for the GarminSync service, primarily focusing on data stored in CentralDB.

1. User

Represents the single authenticated individual utilizing the GarminSync service.

  • Attributes:
    • id: Unique identifier (Primary Key, UUID)
    • username: User's chosen username (String, Unique, Required)
    • password_hash: Hashed password for authentication (String, Required)
    • created_at: Timestamp of user creation (Datetime, Auto-generated)
    • updated_at: Timestamp of last update (Datetime, Auto-generated)
  • Relationships:
    • One-to-One with Garmin Connect Account
    • One-to-Many with Activity (indirectly through Garmin Connect Account)
    • One-to-Many with Health Metric (indirectly through Garmin Connect Account)
    • One-to-Many with Workout
    • One-to-Many with Sync Job
  • Validation Rules:
    • username must be unique.
    • password_hash must be present.

2. Garmin Connect Account

Represents the user's linked Garmin account, storing authentication credentials.

  • Attributes:
    • id: Unique identifier (Primary Key, UUID)
    • user_id: Foreign Key to User.id (UUID, Required)
    • garmin_user_id: Unique identifier from Garmin Connect (String, Required)
    • oauth_token: OAuth2 access token (String, Encrypted, Required)
    • oauth_token_secret: OAuth2 token secret (String, Encrypted, Required)
    • refresh_token: OAuth2 refresh token (String, Encrypted)
    • token_expires_at: Timestamp of token expiration (Datetime)
    • linked_at: Timestamp of account linking (Datetime, Auto-generated)
    • updated_at: Timestamp of last update (Datetime, Auto-generated)
  • Relationships:
    • Many-to-One with User
    • One-to-Many with Activity
    • One-to-Many with Health Metric
  • Validation Rules:
    • user_id must reference an existing User.
    • oauth_token and oauth_token_secret must be present for active accounts.

3. Activity

A record of a fitness activity obtained from Garmin Connect, encompassing raw data files and metadata.

  • Attributes:
    • id: Unique identifier (Primary Key, UUID)
    • garmin_connect_account_id: Foreign Key to Garmin Connect Account.id (UUID, Required)
    • garmin_activity_id: Unique identifier from Garmin Connect (String, Unique, Required)
    • activity_type: Type of activity (e.g., 'running', 'cycling') (String, Required)
    • start_time: Activity start time (Datetime, Required)
    • duration: Activity duration in seconds (Integer, Required)
    • distance: Activity distance in meters (Float)
    • calories: Calories burned (Float)
    • file_type: Original file type (FIT, GPX, TCX) (String, Required)
    • file_path: Path to the stored activity file in CentralDB (String, Required)
    • metadata: JSON blob for additional metadata (JSONB)
    • synced_at: Timestamp of last successful sync (Datetime, Auto-generated)
    • created_at: Timestamp of record creation (Datetime, Auto-generated)
  • Relationships:
    • Many-to-One with Garmin Connect Account
  • Validation Rules:
    • garmin_activity_id must be unique per Garmin Connect Account.
    • file_type must be one of FIT, GPX, or TCX.
    • file_path must be a valid path.

4. Health Metric

A data point representing a user's health measurement synchronized from Garmin Connect.

  • Attributes:
    • id: Unique identifier (Primary Key, UUID)
    • garmin_connect_account_id: Foreign Key to Garmin Connect Account.id (UUID, Required)
    • metric_type: Type of health metric (e.g., 'heart_rate', 'sleep', 'body_composition') (String, Required)
    • timestamp: Timestamp of the metric reading (Datetime, Required)
    • value: The measured value (Float, Required)
    • unit: Unit of measurement (String)
    • metadata: JSON blob for additional metadata (JSONB)
    • synced_at: Timestamp of last successful sync (Datetime, Auto-generated)
    • created_at: Timestamp of record creation (Datetime, Auto-generated)
  • Relationships:
    • Many-to-One with Garmin Connect Account
  • Validation Rules:
    • Combination of garmin_connect_account_id, metric_type, and timestamp should be unique.

5. Workout

A structured training plan or session that can be uploaded to Garmin Connect.

  • Attributes:
    • id: Unique identifier (Primary Key, UUID)
    • user_id: Foreign Key to User.id (UUID, Required)
    • name: Name of the workout (String, Required)
    • description: Description of the workout (String)
    • workout_definition: JSON representation of the workout structure (JSONB, Required)
    • created_at: Timestamp of workout creation (Datetime, Auto-generated)
    • updated_at: Timestamp of last update (Datetime, Auto-generated)
    • uploaded_to_garmin_at: Timestamp of last successful upload to Garmin (Datetime)
  • Relationships:
    • Many-to-One with User
  • Validation Rules:
    • workout_definition must conform to a predefined schema for Garmin Connect workouts.

6. Sync Job

An instance of a synchronization operation, tracking its status, progress, and any associated errors.

  • Attributes:
    • id: Unique identifier (Primary Key, UUID)
    • user_id: Foreign Key to User.id (UUID, Required)
    • job_type: Type of synchronization (e.g., 'activity_sync', 'health_metrics_sync', 'workout_upload') (String, Required)
    • status: Current status ('pending', 'in_progress', 'completed', 'failed') (String, Required)
    • started_at: Timestamp when the job started (Datetime)
    • completed_at: Timestamp when the job completed (Datetime)
    • progress: Current progress (Float, 0.0-1.0)
    • error_message: Details of any error encountered (Text)
    • metadata: JSON blob for job-specific data (JSONB)
    • created_at: Timestamp of job creation (Datetime, Auto-generated)
    • updated_at: Timestamp of last update (Datetime, Auto-generated)
  • Relationships:
    • Many-to-One with User
  • Validation Rules:
    • job_type must be one of the defined synchronization types.
    • status must be one of the defined statuses.
    • progress must be between 0.0 and 1.0.