import json from datetime import datetime from pathlib import Path from app.modules.project.domain.entities import Project from app.modules.project.domain.repositories import ProjectRepository class JsonProjectRepository(ProjectRepository): def __init__(self, path: Path) -> None: self._path = path def _load(self) -> list[dict]: if not self._path.exists(): return [] return json.loads(self._path.read_text(encoding="utf-8")) def _save(self, data: list[dict]) -> None: self._path.parent.mkdir(parents=True, exist_ok=True) self._path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8") @staticmethod def _to_dict(p: Project) -> dict: return { "id": p.id, "name": p.name, "design_dir": p.design_dir, "code_dir": p.code_dir, "created_at": p.created_at.isoformat(), } @staticmethod def _from_dict(d: dict) -> Project: return Project( id=d["id"], name=d["name"], design_dir=d["design_dir"], code_dir=d.get("code_dir"), created_at=datetime.fromisoformat(d["created_at"]), ) def list_all(self) -> list[Project]: return [self._from_dict(d) for d in self._load()] def get_by_id(self, project_id: str) -> Project | None: for d in self._load(): if d["id"] == project_id: return self._from_dict(d) return None def save(self, project: Project) -> None: data = self._load() data = [d for d in data if d["id"] != project.id] data.append(self._to_dict(project)) self._save(data) def delete(self, project_id: str) -> None: data = [d for d in self._load() if d["id"] != project_id] self._save(data)