From 8b3223f865286041f7872a9f8b07bdf5e3a45440 Mon Sep 17 00:00:00 2001 From: Jan Novak Date: Tue, 24 Mar 2026 10:45:47 +0100 Subject: [PATCH] feat: Add POST /flush-cache endpoint to clear all cached data and reset timers Co-Authored-By: Claude Opus 4.6 --- app.py | 9 +++++++-- scripts/cache_utils.py | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index 1a99d31..c52ccde 100644 --- a/app.py +++ b/app.py @@ -7,7 +7,7 @@ import os import io import qrcode import logging -from flask import Flask, render_template, g, send_file, request +from flask import Flask, render_template, g, send_file, request, jsonify # Configure logging, allowing override via LOG_LEVEL environment variable log_level = os.environ.get("LOG_LEVEL", "INFO").upper() @@ -23,7 +23,7 @@ from config import ( ) from attendance import get_members_with_fees, get_junior_members_with_fees, ADULT_MERGED_MONTHS, JUNIOR_MERGED_MONTHS from match_payments import reconcile, fetch_sheet_data, fetch_exceptions, normalize -from cache_utils import get_sheet_modified_time, read_cache, write_cache, _LAST_CHECKED +from cache_utils import get_sheet_modified_time, read_cache, write_cache, _LAST_CHECKED, flush_cache def get_cached_data(cache_key, sheet_id, fetch_func, *args, serialize=None, deserialize=None, **kwargs): mod_time = get_sheet_modified_time(cache_key) @@ -108,6 +108,11 @@ def index(): # Redirect root to /adults for convenience while there are no other apps return '' +@app.route("/flush-cache", methods=["POST"]) +def flush_cache_endpoint(): + deleted = flush_cache() + return jsonify({"status": "ok", "deleted_files": deleted}) + @app.route("/fees") def fees(): attendance_url = f"https://docs.google.com/spreadsheets/d/{ATTENDANCE_SHEET_ID}/edit" diff --git a/scripts/cache_utils.py b/scripts/cache_utils.py index f84d3f9..e74440b 100644 --- a/scripts/cache_utils.py +++ b/scripts/cache_utils.py @@ -155,3 +155,19 @@ def write_cache(sheet_id: str, modified_time: str, data: list | dict) -> None: logger.info(f"Wrote cache for {sheet_id}") except Exception as e: logger.error(f"Failed to write cache {sheet_id}: {e}") + +def flush_cache(): + """Delete all cache files and reset in-memory state. Returns count of deleted files.""" + global _DRIVE_SERVICE + _LAST_CHECKED.clear() + _DRIVE_SERVICE = None + + deleted = 0 + if CACHE_DIR.exists(): + for f in CACHE_DIR.glob("*_cache.json"): + f.unlink() + deleted += 1 + logger.info(f"Deleted cache file: {f.name}") + + logger.info(f"Cache flushed: {deleted} files deleted, timers reset") + return deleted