combat testing and polishing in the dev console, many bug fixes
This commit is contained in:
144
api/app/tasks/combat_cleanup.py
Normal file
144
api/app/tasks/combat_cleanup.py
Normal file
@@ -0,0 +1,144 @@
|
||||
"""
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user