Files
flaskpaste/app/api/__init__.py
Username bfc238b5cf
Some checks failed
CI / Lint & Format (push) Successful in 16s
CI / Security Scan (push) Failing after 19s
CI / Tests (push) Successful in 34s
add CLI enhancements and scheduled cleanup
CLI commands:
- list: show user's pastes with pagination
- search: filter by type (glob), after/before timestamps
- update: modify content, password, or extend expiry
- export: save pastes to directory with optional decryption

API changes:
- PUT /<id>: update paste content and metadata
- GET /pastes: add type, after, before query params

Scheduled tasks:
- Thread-safe cleanup with per-task intervals
- Activate cleanup_expired_hashes (15min)
- Activate cleanup_rate_limits (5min)

Tests: 205 passing
2025-12-20 20:13:00 +01:00

66 lines
1.9 KiB
Python

"""API blueprint registration."""
import threading
import time
from flask import Blueprint, current_app
bp = Blueprint("api", __name__)
# Thread-safe cleanup scheduling
_cleanup_lock = threading.Lock()
_cleanup_times = {
"pastes": 0,
"hashes": 0,
"rate_limits": 0,
}
_CLEANUP_INTERVALS = {
"pastes": 3600, # 1 hour
"hashes": 900, # 15 minutes
"rate_limits": 300, # 5 minutes
}
def reset_cleanup_times() -> None:
"""Reset cleanup timestamps. For testing only."""
with _cleanup_lock:
for key in _cleanup_times:
_cleanup_times[key] = 0
@bp.before_request
def run_scheduled_cleanup():
"""Periodically run cleanup tasks on schedule."""
now = time.time()
with _cleanup_lock:
# Cleanup expired pastes
if now - _cleanup_times["pastes"] >= _CLEANUP_INTERVALS["pastes"]:
_cleanup_times["pastes"] = now
from app.database import cleanup_expired_pastes
count = cleanup_expired_pastes()
if count > 0:
current_app.logger.info(f"Cleaned up {count} expired paste(s)")
# Cleanup expired content hashes
if now - _cleanup_times["hashes"] >= _CLEANUP_INTERVALS["hashes"]:
_cleanup_times["hashes"] = now
from app.database import cleanup_expired_hashes
count = cleanup_expired_hashes()
if count > 0:
current_app.logger.info(f"Cleaned up {count} expired hash(es)")
# Cleanup rate limit entries
if now - _cleanup_times["rate_limits"] >= _CLEANUP_INTERVALS["rate_limits"]:
_cleanup_times["rate_limits"] = now
from app.api.routes import cleanup_rate_limits
count = cleanup_rate_limits()
if count > 0:
current_app.logger.info(f"Cleaned up {count} rate limit entr(ies)")
from app.api import routes # noqa: E402, F401