39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
|
|
from app.services.domains.scholars.exceptions import ScholarServiceError
|
|
|
|
|
|
def _ensure_upload_root(upload_dir: str, *, create: bool) -> Path:
|
|
root = Path(upload_dir).expanduser().resolve()
|
|
if create:
|
|
root.mkdir(parents=True, exist_ok=True)
|
|
return root
|
|
|
|
|
|
def _resolve_upload_path(upload_root: Path, relative_path: str) -> Path:
|
|
candidate = (upload_root / relative_path).resolve()
|
|
if upload_root != candidate and upload_root not in candidate.parents:
|
|
raise ScholarServiceError("Invalid scholar image path.")
|
|
return candidate
|
|
|
|
|
|
def _safe_remove_upload(upload_root: Path, relative_path: str | None) -> None:
|
|
if not relative_path:
|
|
return
|
|
try:
|
|
file_path = _resolve_upload_path(upload_root, relative_path)
|
|
except ScholarServiceError:
|
|
return
|
|
|
|
try:
|
|
if file_path.exists() and file_path.is_file():
|
|
file_path.unlink()
|
|
except OSError:
|
|
return
|
|
|
|
|
|
def resolve_upload_file_path(*, upload_dir: str, relative_path: str) -> Path:
|
|
root = _ensure_upload_root(upload_dir, create=False)
|
|
return _resolve_upload_path(root, relative_path)
|