from abc import ABC, abstractmethod from dataclasses import dataclass from typing import Any, ClassVar from sqlalchemy.orm import Session from app.core.importing.base import UpsertOutcome @dataclass class IngestRecord: type: str # ex: "steps", "weight", "workout" data: dict[str, Any] external_id: str | None = None source: str = "ingest" # sender-declared source (ex: "android_bridge") class BaseIngestHandler(ABC): domain: ClassVar[str] # "health" record_types: ClassVar[tuple[str, ...]] # accepted `type` values @abstractmethod def apply( self, db: Session, user_id: int, record: IngestRecord ) -> UpsertOutcome: ...