from dataclasses import dataclass from sqlalchemy.orm import Session from app.models.mobile_settings import MOBILE_SETTINGS_ROW_ID, MobileSettings @dataclass(frozen=True) class MobileSettingsConfig: devices_allowed: bool max_devices_per_user: int min_app_version: str | None source: str = "db" def get_effective_mobile_settings(db: Session) -> MobileSettingsConfig: row = db.get(MobileSettings, MOBILE_SETTINGS_ROW_ID) if row is None: return MobileSettingsConfig( devices_allowed=False, max_devices_per_user=3, min_app_version=None, source="default", ) return MobileSettingsConfig( devices_allowed=bool(row.devices_allowed), max_devices_per_user=max(1, int(row.max_devices_per_user or 3)), min_app_version=(row.min_app_version or "").strip() or None, source="db", ) def upsert_mobile_settings( db: Session, *, devices_allowed: bool, max_devices_per_user: int, min_app_version: str | None, ) -> MobileSettingsConfig: if max_devices_per_user < 1 or max_devices_per_user > 50: raise ValueError("max_devices_per_user must be between 1 and 50") cleaned_version = (min_app_version or "").strip() or None row = db.get(MobileSettings, MOBILE_SETTINGS_ROW_ID) if row is None: row = MobileSettings( id=MOBILE_SETTINGS_ROW_ID, devices_allowed=devices_allowed, max_devices_per_user=max_devices_per_user, min_app_version=cleaned_version, ) db.add(row) else: row.devices_allowed = devices_allowed row.max_devices_per_user = max_devices_per_user row.min_app_version = cleaned_version db.commit() db.refresh(row) return get_effective_mobile_settings(db)