fix: cascade public assets on version deletion

This commit is contained in:
2026-04-04 11:25:50 +02:00
parent 95c81955c9
commit 15d5ef6ac6
2 changed files with 24 additions and 6 deletions

View File

@@ -56,6 +56,12 @@ class CvVersion(Base, IdentifierMixin, TimestampMixin):
submissions: Mapped[list["Submission"]] = relationship( submissions: Mapped[list["Submission"]] = relationship(
"Submission", back_populates="version" "Submission", back_populates="version"
) )
public_assets: Mapped[list["PublicAsset"]] = relationship(
"PublicAsset",
back_populates="version",
cascade="all, delete-orphan",
passive_deletes=True,
)
class CvPatch(Base, IdentifierMixin, TimestampMixin): class CvPatch(Base, IdentifierMixin, TimestampMixin):
@@ -126,7 +132,7 @@ class PublicAsset(Base, IdentifierMixin, TimestampMixin):
ForeignKey("submissions.id", ondelete="SET NULL"), nullable=True ForeignKey("submissions.id", ondelete="SET NULL"), nullable=True
) )
version_id: Mapped[str | None] = mapped_column( version_id: Mapped[str | None] = mapped_column(
ForeignKey("cv_versions.id"), nullable=True ForeignKey("cv_versions.id", ondelete="CASCADE"), nullable=True
) )
slug: Mapped[str] = mapped_column(String(160), unique=True, index=True) slug: Mapped[str] = mapped_column(String(160), unique=True, index=True)
artifact_key: Mapped[str] = mapped_column(String(512)) artifact_key: Mapped[str] = mapped_column(String(512))
@@ -138,9 +144,14 @@ class PublicAsset(Base, IdentifierMixin, TimestampMixin):
submission: Mapped[Submission | None] = relationship( submission: Mapped[Submission | None] = relationship(
"Submission", back_populates="public_asset" "Submission", back_populates="public_asset"
) )
version: Mapped[CvVersion | None] = relationship("CvVersion") version: Mapped[CvVersion | None] = relationship(
"CvVersion", back_populates="public_assets"
)
views: Mapped[list["PublicAssetView"]] = relationship( views: Mapped[list["PublicAssetView"]] = relationship(
"PublicAssetView", back_populates="public_asset", cascade="all, delete-orphan", passive_deletes=True, "PublicAssetView",
back_populates="public_asset",
cascade="all, delete-orphan",
passive_deletes=True,
) )
@@ -156,7 +167,9 @@ class PublicAssetView(Base, IdentifierMixin):
user_agent: Mapped[str | None] = mapped_column(String(512), nullable=True) user_agent: Mapped[str | None] = mapped_column(String(512), nullable=True)
ip_hash: Mapped[str | None] = mapped_column(String(64), nullable=True) ip_hash: Mapped[str | None] = mapped_column(String(64), nullable=True)
public_asset: Mapped[PublicAsset] = relationship("PublicAsset", back_populates="views") public_asset: Mapped[PublicAsset] = relationship(
"PublicAsset", back_populates="views"
)
class AiSuggestion(Base, IdentifierMixin, TimestampMixin): class AiSuggestion(Base, IdentifierMixin, TimestampMixin):

View File

@@ -1,13 +1,13 @@
from __future__ import annotations from __future__ import annotations
from fastapi import UploadFile from fastapi import UploadFile
from sqlalchemy import select from sqlalchemy import delete, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
from dlib.cv import parse_docx_bytes from dlib.cv import parse_docx_bytes
from app.models import CvDocument, CvVersion from app.models import CvDocument, CvVersion, PublicAsset
from app.services.storage import persist_upload from app.services.storage import persist_upload
@@ -78,6 +78,11 @@ async def delete_document(
doc = await get_document(session, owner_id, document_id) doc = await get_document(session, owner_id, document_id)
if not doc: if not doc:
return False return False
version_ids = [version.id for version in doc.versions]
if version_ids:
await session.execute(
delete(PublicAsset).where(PublicAsset.version_id.in_(version_ids))
)
await session.delete(doc) await session.delete(doc)
await session.commit() await session.commit()
return True return True