File size: 2,161 Bytes
afd56bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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)"
    )


@router.post("/analyze_msp")
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)}