Spaces:
Sleeping
Sleeping
| from datetime import datetime, timedelta | |
| from sqlalchemy.orm import Session | |
| from models.report import Report | |
| class CacheService: | |
| TTL_DAYS = 7 | |
| MAX_REPORTS = 1000 | |
| BATCH_DELETE = 50 | |
| def is_expired(generated_at: datetime) -> bool: | |
| if not generated_at: | |
| return True | |
| return datetime.utcnow() - generated_at > timedelta(days=CacheService.TTL_DAYS) | |
| def cleanup(db: Session): | |
| # STEP 1: delete expired reports (>7 days) | |
| cutoff = datetime.utcnow() - timedelta(days=CacheService.TTL_DAYS) | |
| db.query(Report).filter( | |
| Report.generated_at < cutoff | |
| ).delete(synchronize_session=False) | |
| db.commit() | |
| # STEP 2: incremental eviction (only 50 at a time) | |
| total = db.query(Report).count() | |
| if total > CacheService.MAX_REPORTS: | |
| old_reports = db.query(Report).order_by( | |
| Report.generated_at.asc() | |
| ).limit(CacheService.BATCH_DELETE).all() | |
| for r in old_reports: | |
| db.delete(r) | |
| db.commit() |