36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
from pathlib import Path
|
|
|
|
from app.modules.editor.domain.entities import AffectedFile, EditableFile, ImpactResult
|
|
from app.modules.editor.infrastructure.file_io import read_file, write_file
|
|
from app.modules.project.domain.entities import Project
|
|
from app.modules.scanner.application.services import ScanService
|
|
from app.modules.scanner.domain.entities import ScanResult
|
|
|
|
|
|
class EditorService:
|
|
def __init__(self, scan_service: ScanService) -> None:
|
|
self._scan_service = scan_service
|
|
|
|
def get_file(self, project: Project, relative_path: str) -> EditableFile:
|
|
return read_file(Path(project.design_dir), relative_path)
|
|
|
|
def save_file(self, project: Project, relative_path: str, content: str) -> ScanResult:
|
|
write_file(Path(project.design_dir), relative_path, content)
|
|
return self._scan_service.scan(project)
|
|
|
|
def get_impact(
|
|
self, project: Project, relative_path: str, scan_result: ScanResult,
|
|
) -> ImpactResult:
|
|
"""Walk DesignDocument.downstream + TraceabilityLink to find affected files."""
|
|
affected: list[AffectedFile] = []
|
|
|
|
# Find DesignDocument for this file
|
|
for doc in scan_result.design_documents:
|
|
if doc.file_path == relative_path or relative_path.endswith(doc.file_path):
|
|
for downstream in doc.downstream:
|
|
affected.append(
|
|
AffectedFile(path=downstream, reason=f"downstream of {doc.doc_id}")
|
|
)
|
|
|
|
return ImpactResult(source_file=relative_path, affected_files=affected)
|