from datetime import timedelta from flask import Blueprint, jsonify, request from app.routes.auth_decorators import require_auth from app.services.feed_quality.evaluator import reevaluate_feed_alerts_for_period from app.services.feed_quality.query import feed_alerts_summary, list_feed_alerts from app.services.feed_quality.settings_store import ( normalize_settings, save_feed_quality_settings, settings_for_api, ) from app.timeutil import utc_now_naive bp = Blueprint("feed_quality", __name__, url_prefix="/api/feed-quality") @bp.get("/settings") @require_auth def get_settings(): return jsonify(settings_for_api()) @bp.put("/settings") @require_auth def put_settings(): body = request.get_json(silent=True) or {} partial = body.get("settings") if isinstance(body.get("settings"), dict) else body try: saved = save_feed_quality_settings(normalize_settings(partial)) except (TypeError, ValueError) as exc: return jsonify({"error": True, "message": str(exc)}), 400 today = utc_now_naive().date() week_ago = today - timedelta(days=7) reevaluated = reevaluate_feed_alerts_for_period( date_from=week_ago.isoformat(), date_to=today.isoformat(), limit=500, ) return jsonify({"saved": True, "settings": saved, "reevaluatedReports": reevaluated}) @bp.get("/alerts/summary") @require_auth def alerts_summary(): return jsonify( feed_alerts_summary( date_from=request.args.get("date_from"), date_to=request.args.get("date_to"), dispenser_id=request.args.get("dispenser_id"), ) ) @bp.get("/alerts") @require_auth def alerts_list(): try: limit = int(request.args.get("limit", 200)) except (TypeError, ValueError): limit = 200 return jsonify( list_feed_alerts( date_from=request.args.get("date_from"), date_to=request.args.get("date_to"), severity=request.args.get("severity"), event_type=request.args.get("event_type"), dispenser_id=request.args.get("dispenser_id"), limit=limit, ) )