from __future__ import annotations from flask import jsonify, request from app.blueprints.seo import bp from app.blueprints.seo.queries import ( get_bot_status_codes, get_bot_summary, get_crawl_chart_data, get_crawled_vs_visited, ) from app.utils.dates import parse_date_range from app.utils.htmx import render_htmx_aware from app.utils.pagination import parse_pagination @bp.route("/seo") def seo(): from_date, to_date = parse_date_range(request) return render_htmx_aware( request, full_template="seo/index.html", partial_template="seo/_content.html", from_date=from_date, to_date=to_date, ) @bp.get("/api/seo/bot-summary") def api_bot_summary(): from_date, to_date = parse_date_range(request) return jsonify(data=get_bot_summary(from_date, to_date), meta={"from": from_date.isoformat(), "to": to_date.isoformat()}) @bp.get("/api/seo/crawl-chart-data") def api_crawl_chart_data(): from_date, to_date = parse_date_range(request) bot_name = request.args.get("bot") return jsonify( data=get_crawl_chart_data(from_date, to_date, bot_name), meta={"from": from_date.isoformat(), "to": to_date.isoformat(), "bot": bot_name}, ) @bp.get("/api/seo/bot-status-codes") def api_bot_status_codes(): from_date, to_date = parse_date_range(request) return jsonify(data=get_bot_status_codes(from_date, to_date), meta={"from": from_date.isoformat(), "to": to_date.isoformat()}) @bp.get("/api/seo/crawled-vs-visited") def api_crawled_vs_visited(): from_date, to_date = parse_date_range(request) page, per_page = parse_pagination(request) rows, total = get_crawled_vs_visited(from_date, to_date, page, per_page) return jsonify( data={"rows": rows, "total": total}, meta={"from": from_date.isoformat(), "to": to_date.isoformat(), "page": page, "per_page": per_page}, )