diff --git a/apps/backend/fastapi/app/models/cv.py b/apps/backend/fastapi/app/models/cv.py index 01b375c..38d57fe 100644 --- a/apps/backend/fastapi/app/models/cv.py +++ b/apps/backend/fastapi/app/models/cv.py @@ -56,6 +56,12 @@ class CvVersion(Base, IdentifierMixin, TimestampMixin): submissions: Mapped[list["Submission"]] = relationship( "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): @@ -126,7 +132,7 @@ class PublicAsset(Base, IdentifierMixin, TimestampMixin): ForeignKey("submissions.id", ondelete="SET NULL"), nullable=True ) 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) artifact_key: Mapped[str] = mapped_column(String(512)) @@ -138,9 +144,14 @@ class PublicAsset(Base, IdentifierMixin, TimestampMixin): submission: Mapped[Submission | None] = relationship( "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( - "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) 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): diff --git a/apps/backend/fastapi/app/services/documents.py b/apps/backend/fastapi/app/services/documents.py index 710cc8c..f6eb65f 100644 --- a/apps/backend/fastapi/app/services/documents.py +++ b/apps/backend/fastapi/app/services/documents.py @@ -1,13 +1,13 @@ from __future__ import annotations from fastapi import UploadFile -from sqlalchemy import select +from sqlalchemy import delete, select from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.orm import selectinload 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 @@ -78,6 +78,11 @@ async def delete_document( doc = await get_document(session, owner_id, document_id) if not doc: 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.commit() return True