60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
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)
|