Files
Code_of_Conquest/api/app/tasks/combat_cleanup.py

145 lines
4.1 KiB
Python

"""
Combat Cleanup Tasks.
This module provides scheduled tasks for cleaning up ended combat
encounters that are older than the retention period.
The cleanup can be scheduled to run periodically (daily recommended)
via APScheduler, cron, or manual invocation.
Usage:
# Manual invocation
from app.tasks.combat_cleanup import cleanup_old_combat_encounters
result = cleanup_old_combat_encounters(older_than_days=7)
# Via APScheduler
scheduler.add_job(
cleanup_old_combat_encounters,
'interval',
days=1,
kwargs={'older_than_days': 7}
)
"""
from typing import Dict, Any
from app.services.combat_repository import get_combat_repository
from app.utils.logging import get_logger
logger = get_logger(__file__)
# Default retention period in days
DEFAULT_RETENTION_DAYS = 7
def cleanup_old_combat_encounters(
older_than_days: int = DEFAULT_RETENTION_DAYS
) -> Dict[str, Any]:
"""
Delete ended combat encounters older than specified days.
This is the main cleanup function for time-based retention.
Should be scheduled to run periodically (daily recommended).
Only deletes ENDED encounters (victory, defeat, fled) - active
encounters are never deleted.
Args:
older_than_days: Number of days after which to delete ended combats.
Default is 7 days.
Returns:
Dict containing:
- deleted_encounters: Number of encounters deleted
- deleted_rounds: Approximate rounds deleted (cascaded)
- older_than_days: The threshold used
- success: Whether the operation completed successfully
- error: Error message if failed
Example:
>>> result = cleanup_old_combat_encounters(older_than_days=7)
>>> print(f"Deleted {result['deleted_encounters']} encounters")
"""
logger.info("Starting combat encounter cleanup",
older_than_days=older_than_days)
try:
repo = get_combat_repository()
deleted_count = repo.delete_old_encounters(older_than_days)
result = {
"deleted_encounters": deleted_count,
"older_than_days": older_than_days,
"success": True,
"error": None
}
logger.info("Combat encounter cleanup completed successfully",
deleted_count=deleted_count,
older_than_days=older_than_days)
return result
except Exception as e:
logger.error("Combat encounter cleanup failed",
error=str(e),
older_than_days=older_than_days)
return {
"deleted_encounters": 0,
"older_than_days": older_than_days,
"success": False,
"error": str(e)
}
def cleanup_encounters_for_session(session_id: str) -> Dict[str, Any]:
"""
Delete all combat encounters for a specific session.
Call this when a session is being deleted to clean up
associated combat data.
Args:
session_id: The session ID to clean up
Returns:
Dict containing:
- deleted_encounters: Number of encounters deleted
- session_id: The session ID processed
- success: Whether the operation completed successfully
- error: Error message if failed
"""
logger.info("Cleaning up combat encounters for session",
session_id=session_id)
try:
repo = get_combat_repository()
deleted_count = repo.delete_encounters_by_session(session_id)
result = {
"deleted_encounters": deleted_count,
"session_id": session_id,
"success": True,
"error": None
}
logger.info("Session combat cleanup completed",
session_id=session_id,
deleted_count=deleted_count)
return result
except Exception as e:
logger.error("Session combat cleanup failed",
session_id=session_id,
error=str(e))
return {
"deleted_encounters": 0,
"session_id": session_id,
"success": False,
"error": str(e)
}