51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
"""
|
|
Reads and writes per-project sketch files to the data volume.
|
|
|
|
Files are stored at:
|
|
{DATA_DIR}/projects/{project_id}/{filename}
|
|
|
|
DATA_DIR defaults to /app/data (the bind-mounted volume).
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
DATA_DIR = Path(os.environ.get("DATA_DIR", "/app/data"))
|
|
|
|
|
|
def _project_dir(project_id: str) -> Path:
|
|
return DATA_DIR / "projects" / project_id
|
|
|
|
|
|
def write_files(project_id: str, files: list[dict]) -> None:
|
|
"""Persist a list of {name, content} dicts to disk."""
|
|
d = _project_dir(project_id)
|
|
d.mkdir(parents=True, exist_ok=True)
|
|
# Remove files that are no longer in the list
|
|
names = {f["name"] for f in files}
|
|
for existing in d.iterdir():
|
|
if existing.is_file() and existing.name not in names:
|
|
existing.unlink()
|
|
for f in files:
|
|
(d / f["name"]).write_text(f["content"], encoding="utf-8")
|
|
|
|
|
|
def read_files(project_id: str) -> list[dict]:
|
|
"""Return [{name, content}] sorted by name. Empty list if directory absent."""
|
|
d = _project_dir(project_id)
|
|
if not d.exists():
|
|
return []
|
|
return [
|
|
{"name": p.name, "content": p.read_text(encoding="utf-8")}
|
|
for p in sorted(d.iterdir())
|
|
if p.is_file()
|
|
]
|
|
|
|
|
|
def delete_files(project_id: str) -> None:
|
|
"""Remove all files for a project from disk."""
|
|
import shutil
|
|
d = _project_dir(project_id)
|
|
if d.exists():
|
|
shutil.rmtree(d)
|