bc3e3d2797
- Add transitional @jwt_access_required (accepts access tokens, and for now also refresh tokens) and use it on every protected route and inside admin_required. /api/user/refresh stays refresh-only. - Move pending OIDC state/PKCE verifiers from an in-process dict to an oidc_states table (10 min TTL, single-use) so logins survive a blue/green flip. Drop the unused redirect_after_login. - Unit tests for the decorator and the state store. Deploy this commit on its own, before the access-token frontend: the old backend answers access tokens with 422, so the new frontend only works once this backend is live on both colors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
from quart import Blueprint, jsonify
|
|
|
|
from .logic import (
|
|
delete_all_documents,
|
|
get_vector_store_stats,
|
|
index_documents,
|
|
sync_obsidian_documents,
|
|
)
|
|
from blueprints.users.decorators import admin_required, jwt_access_required
|
|
|
|
rag_blueprint = Blueprint("rag_api", __name__, url_prefix="/api/rag")
|
|
|
|
|
|
@rag_blueprint.get("/stats")
|
|
@jwt_access_required
|
|
async def get_stats():
|
|
"""Get vector store statistics."""
|
|
stats = get_vector_store_stats()
|
|
return jsonify(stats)
|
|
|
|
|
|
@rag_blueprint.post("/index")
|
|
@admin_required
|
|
async def trigger_index():
|
|
"""Trigger indexing of documents from Paperless-NGX. Admin only."""
|
|
try:
|
|
await index_documents()
|
|
stats = get_vector_store_stats()
|
|
return jsonify({"status": "success", "stats": stats})
|
|
except Exception as e:
|
|
return jsonify({"status": "error", "message": str(e)}), 500
|
|
|
|
|
|
@rag_blueprint.post("/reindex")
|
|
@admin_required
|
|
async def trigger_reindex():
|
|
"""Clear and reindex all documents. Admin only."""
|
|
try:
|
|
delete_all_documents()
|
|
await index_documents()
|
|
stats = get_vector_store_stats()
|
|
return jsonify({"status": "success", "stats": stats})
|
|
except Exception as e:
|
|
return jsonify({"status": "error", "message": str(e)}), 500
|
|
|
|
|
|
@rag_blueprint.post("/index-obsidian")
|
|
@admin_required
|
|
async def trigger_obsidian_index():
|
|
"""Incrementally sync Obsidian documents into vector store. Admin only."""
|
|
try:
|
|
result = await sync_obsidian_documents()
|
|
stats = get_vector_store_stats()
|
|
return jsonify({"status": "success", "result": result, "stats": stats})
|
|
except Exception as e:
|
|
return jsonify({"status": "error", "message": str(e)}), 500
|