Implement display artifacts, pricing integrity, draft base and publish preview bundle

This commit is contained in:
greebo
2026-03-19 17:58:17 +03:00
parent 85fb2f4bb9
commit c91c5abf15
35 changed files with 3283 additions and 302 deletions

View File

@@ -0,0 +1,89 @@
from __future__ import annotations
import logging
from datetime import datetime, timezone
from pathlib import Path
from fastapi import HTTPException, status
from app.core.config import settings
from app.repositories.scheme_artifacts import create_scheme_artifact
from app.repositories.scheme_versions import update_scheme_version_display_artifact
from app.services.storage import save_display_svg
from app.services.svg_display_processor import ALLOWED_MODES, generate_display_svg
logger = logging.getLogger(__name__)
async def regenerate_display_artifact(
*,
scheme_id: str,
scheme_version_id: str,
upload_id: str,
original_filename: str,
sanitized_storage_path: str,
mode: str,
) -> dict:
if mode not in ALLOWED_MODES:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=f"Unsupported display mode: {mode}",
)
svg_path = Path(sanitized_storage_path)
if not svg_path.exists() or not svg_path.is_file():
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Sanitized SVG not found for current scheme version",
)
sanitized_bytes = svg_path.read_bytes()
try:
display_bytes, meta = generate_display_svg(sanitized_bytes, mode)
except Exception as exc:
logger.exception(
"display_svg.regenerate failed scheme_id=%s scheme_version_id=%s mode=%s",
scheme_id,
scheme_version_id,
mode,
)
raise HTTPException(
status_code=status.HTTP_409_CONFLICT,
detail=f"Current scheme version is not ready for display rendering: {exc.__class__.__name__}",
)
storage_path = save_display_svg(
upload_id=upload_id,
filename=original_filename,
content=display_bytes,
)
await create_scheme_artifact(
scheme_id=scheme_id,
scheme_version_id=scheme_version_id,
artifact_type="display_svg",
artifact_variant=mode,
storage_path=storage_path,
status="ready",
meta_json=meta,
)
if mode == settings.svg_display_mode:
await update_scheme_version_display_artifact(
scheme_version_id=scheme_version_id,
display_svg_storage_path=storage_path,
display_svg_status="ready",
display_svg_generated_at=datetime.now(timezone.utc),
)
return {
"scheme_id": scheme_id,
"scheme_version_id": scheme_version_id,
"artifact_type": "display_svg",
"artifact_variant": mode,
"storage_path": storage_path,
"meta": meta,
"generated_at": datetime.now(timezone.utc).isoformat(),
}