Files
HabitForge/alembic/versions/b2c3d4e5f6g7_add_health_connect_tables.py
T
2026-07-30 23:25:20 -04:00

104 lines
5.1 KiB
Python

"""Add Health Connect tables
Revision ID: b2c3d4e5f6g7
Revises: a1b2c3d4e5f6
Create Date: 2026-01-01 14:35:00.000000
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = 'b2c3d4e5f6g7'
down_revision: Union[str, None] = 'a1b2c3d4e5f6'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# Create health_connect_sync_logs table
op.create_table(
'health_connect_sync_logs',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('device_id', sa.String(100), nullable=True),
sa.Column('sync_timestamp', sa.DateTime(), nullable=True),
sa.Column('records_pushed', sa.Integer(), nullable=True),
sa.Column('status', sa.String(50), nullable=True),
sa.Column('error_message', sa.Text(), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index('ix_health_connect_sync_logs_id', 'health_connect_sync_logs', ['id'])
op.create_index('ix_health_connect_sync_logs_user_id', 'health_connect_sync_logs', ['user_id'])
# Create health_connect_daily_metrics table
op.create_table(
'health_connect_daily_metrics',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('date', sa.Date(), nullable=True),
sa.Column('step_count', sa.Integer(), nullable=True),
sa.Column('distance_meters', sa.Float(), nullable=True),
sa.Column('calories_burned', sa.Float(), nullable=True),
sa.Column('total_calories', sa.Float(), nullable=True),
sa.Column('sleep_duration_minutes', sa.Integer(), nullable=True),
sa.Column('deep_sleep_minutes', sa.Integer(), nullable=True),
sa.Column('light_sleep_minutes', sa.Integer(), nullable=True),
sa.Column('rem_sleep_minutes', sa.Integer(), nullable=True),
sa.Column('awake_duration_minutes', sa.Integer(), nullable=True),
sa.Column('avg_heart_rate', sa.Integer(), nullable=True),
sa.Column('min_heart_rate', sa.Integer(), nullable=True),
sa.Column('max_heart_rate', sa.Integer(), nullable=True),
sa.Column('resting_heart_rate', sa.Integer(), nullable=True),
sa.Column('avg_spo2', sa.Float(), nullable=True),
sa.Column('min_spo2', sa.Float(), nullable=True),
sa.Column('max_spo2', sa.Float(), nullable=True),
sa.Column('weight', sa.Float(), nullable=True),
sa.Column('last_synced', sa.DateTime(), nullable=True),
sa.Column('sync_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
sa.ForeignKeyConstraint(['sync_id'], ['health_connect_sync_logs.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index('ix_health_connect_daily_metrics_id', 'health_connect_daily_metrics', ['id'])
op.create_index('ix_health_connect_daily_metrics_user_id', 'health_connect_daily_metrics', ['user_id'])
op.create_index('ix_health_connect_daily_metrics_date', 'health_connect_daily_metrics', ['date'])
# Create health_connect_exercise_sessions table
op.create_table(
'health_connect_exercise_sessions',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('start_time', sa.DateTime(), nullable=True),
sa.Column('end_time', sa.DateTime(), nullable=True),
sa.Column('exercise_type', sa.Integer(), nullable=True),
sa.Column('exercise_type_name', sa.String(100), nullable=True),
sa.Column('duration_seconds', sa.Integer(), nullable=True),
sa.Column('distance_meters', sa.Float(), nullable=True),
sa.Column('calories_burned', sa.Float(), nullable=True),
sa.Column('avg_heart_rate', sa.Integer(), nullable=True),
sa.Column('max_heart_rate', sa.Integer(), nullable=True),
sa.Column('min_heart_rate', sa.Integer(), nullable=True),
sa.Column('steps', sa.Integer(), nullable=True),
sa.Column('elevation_gained', sa.Float(), nullable=True),
sa.Column('notes', sa.Text(), nullable=True),
sa.Column('last_synced', sa.DateTime(), nullable=True),
sa.Column('sync_id', sa.Integer(), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ),
sa.ForeignKeyConstraint(['sync_id'], ['health_connect_sync_logs.id'], ),
sa.PrimaryKeyConstraint('id')
)
op.create_index('ix_health_connect_exercise_sessions_id', 'health_connect_exercise_sessions', ['id'])
op.create_index('ix_health_connect_exercise_sessions_user_id', 'health_connect_exercise_sessions', ['user_id'])
op.create_index('ix_health_connect_exercise_sessions_start_time', 'health_connect_exercise_sessions', ['start_time'])
def downgrade() -> None:
op.drop_table('health_connect_exercise_sessions')
op.drop_table('health_connect_daily_metrics')
op.drop_table('health_connect_sync_logs')