"""分片上传会话实体。 一个会话对应一次「分片上传 + 拼接入库」流程:客户端创建会话拿到 upload_id, 逐片上传,最后 complete 触发服务端拼接、算 sha256、去重并落 DB。 """ from __future__ import annotations from datetime import datetime from sqlalchemy import BigInteger, DateTime, JSON, String, func from sqlalchemy.orm import Mapped, mapped_column from ..database import Base class UploadSession(Base): __tablename__ = "upload_session" id: Mapped[int] = mapped_column(BigInteger, primary_key=True, autoincrement=True) # 客户端持有的会话标识(uuid4().hex),服务端生成,防伪造路径 upload_id: Mapped[str] = mapped_column(String(64), nullable=False, unique=True, index=True) filename: Mapped[str] = mapped_column(String(512), nullable=False) size_bytes: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0) chunk_size: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0) total_chunks: Mapped[int] = mapped_column(BigInteger, nullable=False, default=0) # 已上传分片下标数组,例如 [0, 1, 3];JSON 列 uploaded_chunks: Mapped[list] = mapped_column(JSON, nullable=False, default=list) # complete 成功后指向 UploadedFile.id;失败/未完成时为 None file_id: Mapped[int | None] = mapped_column(BigInteger, nullable=True, default=None) # pending / completed status: Mapped[str] = mapped_column(String(32), nullable=False, default="pending") created_at: Mapped[datetime] = mapped_column( DateTime, server_default=func.now(), nullable=False ) updated_at: Mapped[datetime] = mapped_column( DateTime, server_default=func.now(), onupdate=func.now(), nullable=False ) def __repr__(self) -> str: # pragma: no cover return ( f"" )