Spaces:
Running
Running
| from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks | |
| from pydantic import BaseModel, Field | |
| from endpoints.projects import get_db | |
| from core.projects.models import Project | |
| from core.subscription.middleware import verify_token | |
| from core.graph_rag.msp_analyzer import msp_analyzer | |
| import logging | |
| logger = logging.getLogger(__name__) | |
| router = APIRouter(prefix="/api/graph", tags=["graph_rag"]) | |
| class MSPAnalysisRequest(BaseModel): | |
| project_id: str | |
| krs: str = Field( | |
| description="Numer KRS firmy do analizy (np. 0000111111 dla testu)" | |
| ) | |
| async def analyze_msp( | |
| request: MSPAnalysisRequest, | |
| background_tasks: BackgroundTasks, | |
| token_data: dict = Depends(verify_token), | |
| db=Depends(get_db), | |
| ): | |
| """ | |
| Analizuje status MŚP firmy o danym numerze KRS poprzez budowę grafu w Neo4j | |
| i kalkulację powiązań własnościowych. Wynik jest zapisywany w kontekście projektu. | |
| """ | |
| clerk_id = token_data.get("sub") | |
| project = ( | |
| db.query(Project) | |
| .filter(Project.id == request.project_id, Project.clerk_user_id == clerk_id) | |
| .first() | |
| ) | |
| if not project: | |
| raise HTTPException( | |
| status_code=404, detail="Projekt nie istnieje lub brak dostępu" | |
| ) | |
| try: | |
| # 1. Zbudowanie grafu w Neo4j na podstawie danych z Rejestr.io | |
| # (Wymaga połączenia do AuraDB. Jeśli nie ma, zwróci error w kolejnym kroku) | |
| await msp_analyzer.build_graph_for_company(request.krs, depth=1) | |
| # 2. Wykonanie analizy grafowej | |
| report = msp_analyzer.analyze_msp_status(request.krs) | |
| # 3. Zapisz raport do kontekstu projektu (jeśli się powiodło) | |
| if report.get("status") == "ok": | |
| external_context = project.external_context or {} | |
| external_context["msp_report"] = report | |
| project.external_context = external_context | |
| db.commit() | |
| return report | |
| except Exception as e: | |
| logger.error( | |
| f"Error during MSP Analysis for KRS {request.krs}: {e}", exc_info=True | |
| ) | |
| return {"status": "error", "message": str(e)} | |