# backend/app/worker/sync_jobs.py — phase-13 주기 sync 잡 + 수동 트리거 진입점 # 프로토타입은 수동 트리거(/api/connectors/sync-all)도 제공(데모 결정성). from sqlmodel import Session from ..config import get_settings from ..connectors.registry import ConnectorRegistry from ..db import engine from ..models import ConnState def run_periodic_sync(session: Session | None = None) -> list[dict]: """worker 스케줄러가 sync_interval_minutes 마다 호출. real/연결된 계정만 sync. mock 계정은 데이터가 변하지 않으므로 주기 sync 대상이 아니다.""" def _do(s: Session) -> list[dict]: out: list[dict] = [] for a in ConnectorRegistry.accounts(s): mode = ConnectorRegistry.effective_mode(a) if a.state in (ConnState.connected, ConnState.error) and mode != "mock": res = ConnectorRegistry.get(s, a).sync(s) out.append(res.__dict__) return out if session is not None: return _do(session) with Session(engine) as s: return _do(s) def register(scheduler) -> None: """phase-7 worker.main(APScheduler)에서 호출(있을 때). 없으면 수동 트리거로 동작.""" mins = get_settings().sync_interval_minutes scheduler.add_job( run_periodic_sync, "interval", minutes=mins, id="connector_sync", replace_existing=True )