145 lines
4.1 KiB
Python
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)
|
|
}
|