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)