from socket import gethostname from typing import Any from app.application.feishu.events import FeishuEventService from app.core.constants import ActorValue from app.core.database import SessionLocal from app.modules.feishu.constants import FEISHU_INBOUND_BATCH_SIZE def process_feishu_inbound_event( event_key: str, *, actor: str = ActorValue.WORKER, ) -> dict[str, Any]: """Process one durable Feishu inbox row in an isolated session.""" db = SessionLocal() try: outcome = FeishuEventService(db).process_inbound_event( event_key, worker_id=f"{actor}:{gethostname()}", ) return _serialize_outcome(outcome) finally: db.close() def process_due_feishu_inbound_events( *, limit: int = FEISHU_INBOUND_BATCH_SIZE, actor: str = ActorValue.WORKER, ) -> list[dict[str, Any]]: """Recover due retries and expired Feishu inbox leases.""" db = SessionLocal() try: outcomes = FeishuEventService(db).process_due_inbound_events( limit=limit, worker_id=f"{actor}:{gethostname()}", ) return [_serialize_outcome(outcome) for outcome in outcomes] finally: db.close() def _serialize_outcome(outcome: Any) -> dict[str, Any]: return { "event_key": outcome.record.event_key, "status": outcome.record.status, "attempt_count": outcome.record.attempt_count, "handled": outcome.handler_result is not None, }