record_interface.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import uuid
  2. import logging
  3. import time
  4. from abc import ABC, abstractmethod
  5. from typing import Any, Optional
  6. from app.repository.task_record import TaskRecord
  7. logger = logging.getLogger(__name__)
  8. class RecordInterface(ABC):
  9. """任务记录存储的抽象接口"""
  10. def create_record(self, request: dict[str, Any]) -> str:
  11. record_id = str(uuid.uuid4())
  12. record = TaskRecord(
  13. task_id=record_id,
  14. status="submitted",
  15. message="",
  16. request=request,
  17. )
  18. self._on_save(record)
  19. logger.info("[%s] Record created, status=submitted", record_id)
  20. return record_id
  21. def set_processing(self, task_id: str):
  22. logger.info("[%s] Status -> processing", task_id)
  23. self._on_update_status(task_id, "processing", "", None)
  24. def set_failed(self, task_id: str, message: str):
  25. logger.warning("[%s] Status -> failed, message=%s", task_id, message)
  26. self._on_update_status(task_id, "failed", message or "", None)
  27. self._on_publish(task_id)
  28. def set_success(self, task_id: str, outputs: dict[str, Any]):
  29. logger.info("[%s] Status -> successes, output_keys=%s", task_id, list(outputs.keys()) if outputs else [])
  30. self._on_update_status(task_id, "successes", "", outputs)
  31. self._on_publish(task_id)
  32. def get_record(self, task_id: str) -> Optional[TaskRecord]:
  33. return self._on_get(task_id)
  34. def get_all_records(self) -> dict[str, TaskRecord]:
  35. return self._on_get_all()
  36. def delete_records(self, max_age_hours: int):
  37. self._on_delete(max_age_hours)
  38. @abstractmethod
  39. def _on_save(self, record: TaskRecord): ...
  40. @abstractmethod
  41. def _on_get(self, task_id: str) -> Optional[TaskRecord]: ...
  42. @abstractmethod
  43. def _on_get_all(self) -> dict[str, TaskRecord]: ...
  44. @abstractmethod
  45. def _on_delete(self, max_age_hours: int): ...
  46. @abstractmethod
  47. def _on_update_status(
  48. self, task_id: str, status: str, message: str, data: Optional[dict]
  49. ): ...
  50. def _on_publish(self, task_id: str):
  51. """任务到达终态时发布事件,子类可覆盖实现"""