fix(graph-api): fix build_graph endpoint for dict-based ProjectManager
Convert all project.attribute accesses to project["key"]/project.get("key"),
use save_project({...}) dict calls, and wire save_graph_record/complete_graph_record
helpers for proper graph persistence.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
5d6d4d787a
commit
83b69dfd87
|
|
@ -397,58 +397,42 @@ def build_graph():
|
||||||
# Get project
|
# Get project
|
||||||
project = ProjectManager.get_project(project_id)
|
project = ProjectManager.get_project(project_id)
|
||||||
if not project:
|
if not project:
|
||||||
return jsonify({
|
return jsonify({"success": False, "error": t('api.projectNotFound', id=project_id)}), 404
|
||||||
"success": False,
|
storage = get_storage()
|
||||||
"error": t('api.projectNotFound', id=project_id)
|
|
||||||
}), 404
|
|
||||||
|
|
||||||
# Check project status
|
# Check project status
|
||||||
force = data.get('force', False) # Force rebuild
|
force = data.get('force', False)
|
||||||
|
|
||||||
if project.status == ProjectStatus.CREATED:
|
if project["status"] == ProjectStatus.CREATED:
|
||||||
return jsonify({
|
return jsonify({"success": False, "error": t('api.ontologyNotGenerated')}), 400
|
||||||
"success": False,
|
|
||||||
"error": t('api.ontologyNotGenerated')
|
|
||||||
}), 400
|
|
||||||
|
|
||||||
if project.status == ProjectStatus.GRAPH_BUILDING and not force:
|
if project["status"] == ProjectStatus.GRAPH_BUILDING and not force:
|
||||||
return jsonify({
|
return jsonify({
|
||||||
"success": False,
|
"success": False,
|
||||||
"error": t('api.graphBuilding'),
|
"error": t('api.graphBuilding'),
|
||||||
"task_id": project.graph_build_task_id
|
"task_id": project.get("active_task_id")
|
||||||
}), 400
|
}), 400
|
||||||
|
|
||||||
# If force rebuild, reset status
|
# If force rebuild, reset status
|
||||||
if force and project.status in [ProjectStatus.GRAPH_BUILDING, ProjectStatus.FAILED, ProjectStatus.GRAPH_COMPLETED]:
|
if force and project["status"] in [ProjectStatus.GRAPH_BUILDING, ProjectStatus.FAILED, ProjectStatus.GRAPH_COMPLETED]:
|
||||||
project.status = ProjectStatus.ONTOLOGY_GENERATED
|
ProjectManager.save_project({"id": project_id, "status": ProjectStatus.ONTOLOGY_GENERATED, "active_task_id": None})
|
||||||
project.graph_id = None
|
project = ProjectManager.get_project(project_id)
|
||||||
project.graph_build_task_id = None
|
|
||||||
project.error = None
|
|
||||||
|
|
||||||
# Get configuration
|
# Get configuration
|
||||||
graph_name = data.get('graph_name', project.name or 'MiroFish Graph')
|
graph_name = data.get('graph_name', project["name"] or 'MiroFish Graph')
|
||||||
chunk_size = data.get('chunk_size', project.chunk_size or Config.DEFAULT_CHUNK_SIZE)
|
chunk_size = data.get('chunk_size', project.get("chunk_size") or Config.DEFAULT_CHUNK_SIZE)
|
||||||
chunk_overlap = data.get('chunk_overlap', project.chunk_overlap or Config.DEFAULT_CHUNK_OVERLAP)
|
chunk_overlap = data.get('chunk_overlap', project.get("chunk_overlap") or Config.DEFAULT_CHUNK_OVERLAP)
|
||||||
|
ProjectManager.save_project({"id": project_id, "chunk_size": chunk_size, "chunk_overlap": chunk_overlap})
|
||||||
# Update project configuration
|
|
||||||
project.chunk_size = chunk_size
|
|
||||||
project.chunk_overlap = chunk_overlap
|
|
||||||
|
|
||||||
# Get extracted text
|
# Get extracted text
|
||||||
text = ProjectManager.get_extracted_text(project_id)
|
text = ProjectManager.get_extracted_text(project_id, storage)
|
||||||
if not text:
|
if not text:
|
||||||
return jsonify({
|
return jsonify({"success": False, "error": t('api.textNotFound')}), 400
|
||||||
"success": False,
|
|
||||||
"error": t('api.textNotFound')
|
|
||||||
}), 400
|
|
||||||
|
|
||||||
# Get ontology
|
# Get ontology
|
||||||
ontology = project.ontology
|
ontology = project.get("ontology") or ProjectManager.get_ontology(project_id)
|
||||||
if not ontology:
|
if not ontology:
|
||||||
return jsonify({
|
return jsonify({"success": False, "error": t('api.ontologyNotFound')}), 400
|
||||||
"success": False,
|
|
||||||
"error": t('api.ontologyNotFound')
|
|
||||||
}), 400
|
|
||||||
|
|
||||||
# Create async task
|
# Create async task
|
||||||
task_manager = TaskManager()
|
task_manager = TaskManager()
|
||||||
|
|
@ -456,10 +440,11 @@ def build_graph():
|
||||||
logger.info(f"Graph build task created: task_id={task_id}, project_id={project_id}")
|
logger.info(f"Graph build task created: task_id={task_id}, project_id={project_id}")
|
||||||
|
|
||||||
# Update project status
|
# Update project status
|
||||||
project.status = ProjectStatus.GRAPH_BUILDING
|
ProjectManager.save_project({
|
||||||
project.graph_build_task_id = task_id
|
"id": project_id,
|
||||||
project.active_task_id = task_id
|
"status": ProjectStatus.GRAPH_BUILDING,
|
||||||
ProjectManager.save_project(project)
|
"active_task_id": task_id,
|
||||||
|
})
|
||||||
|
|
||||||
# Capture locale before spawning background thread
|
# Capture locale before spawning background thread
|
||||||
current_locale = get_locale()
|
current_locale = get_locale()
|
||||||
|
|
@ -500,9 +485,22 @@ def build_graph():
|
||||||
)
|
)
|
||||||
graph_id = builder.create_graph(name=graph_name)
|
graph_id = builder.create_graph(name=graph_name)
|
||||||
|
|
||||||
# Update project graph_id
|
# Persist graph record
|
||||||
project.graph_id = graph_id
|
ont_id = None
|
||||||
ProjectManager.save_project(project)
|
try:
|
||||||
|
from ..models.db_models import OntologyModel
|
||||||
|
from sqlalchemy import select as sa_select
|
||||||
|
from ..db import get_session
|
||||||
|
with get_session() as _db:
|
||||||
|
_ont = _db.execute(
|
||||||
|
sa_select(OntologyModel)
|
||||||
|
.where(OntologyModel.project_id == project_id)
|
||||||
|
.order_by(OntologyModel.version.desc())
|
||||||
|
).scalars().first()
|
||||||
|
ont_id = _ont.id if _ont else None
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
ProjectManager.save_graph_record(project_id, graph_id, ontology_id=ont_id)
|
||||||
|
|
||||||
# Set ontology
|
# Set ontology
|
||||||
task_manager.update_task(
|
task_manager.update_task(
|
||||||
|
|
@ -560,13 +558,16 @@ def build_graph():
|
||||||
)
|
)
|
||||||
graph_data = builder.get_graph_data(graph_id)
|
graph_data = builder.get_graph_data(graph_id)
|
||||||
|
|
||||||
# Update project status
|
|
||||||
project.status = ProjectStatus.GRAPH_COMPLETED
|
|
||||||
project.active_task_id = None
|
|
||||||
ProjectManager.save_project(project)
|
|
||||||
|
|
||||||
node_count = graph_data.get("node_count", 0)
|
node_count = graph_data.get("node_count", 0)
|
||||||
edge_count = graph_data.get("edge_count", 0)
|
edge_count = graph_data.get("edge_count", 0)
|
||||||
|
|
||||||
|
# Update project status
|
||||||
|
ProjectManager.complete_graph_record(project_id, node_count, edge_count)
|
||||||
|
ProjectManager.save_project({
|
||||||
|
"id": project_id,
|
||||||
|
"status": ProjectStatus.GRAPH_COMPLETED,
|
||||||
|
"active_task_id": None,
|
||||||
|
})
|
||||||
build_logger.info(f"[{task_id}] Graph build complete: graph_id={graph_id}, nodes={node_count}, edges={edge_count}")
|
build_logger.info(f"[{task_id}] Graph build complete: graph_id={graph_id}, nodes={node_count}, edges={edge_count}")
|
||||||
|
|
||||||
# Complete
|
# Complete
|
||||||
|
|
@ -589,10 +590,11 @@ def build_graph():
|
||||||
build_logger.error(f"[{task_id}] Graph build failed: {str(e)}")
|
build_logger.error(f"[{task_id}] Graph build failed: {str(e)}")
|
||||||
build_logger.debug(traceback.format_exc())
|
build_logger.debug(traceback.format_exc())
|
||||||
|
|
||||||
project.status = ProjectStatus.FAILED
|
ProjectManager.save_project({
|
||||||
project.error = str(e)
|
"id": project_id,
|
||||||
project.active_task_id = None
|
"status": ProjectStatus.FAILED,
|
||||||
ProjectManager.save_project(project)
|
"active_task_id": None,
|
||||||
|
})
|
||||||
|
|
||||||
task_manager.update_task(
|
task_manager.update_task(
|
||||||
task_id,
|
task_id,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue