export.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from __future__ import annotations
  2. from typing import TYPE_CHECKING, Literal, Optional
  3. from pydantic import BaseModel, Field
  4. if TYPE_CHECKING:
  5. from app.models.export_record import ExportRecord
  6. # ------------------------------------------------------------------ #
  7. # 导出请求 / 响应
  8. # ------------------------------------------------------------------ #
  9. class ExportDocRequest(BaseModel):
  10. user_id: str = Field(..., alias="userId", description="当前用户 ID")
  11. file_name: str = Field(..., alias="fileName", max_length=255, description="文件名(不含扩展名)")
  12. format: Literal["doc"] = Field(..., description="阶段 0 固定为 doc")
  13. content: str = Field(..., description="文档当前内容(Markdown)")
  14. document_id: Optional[str] = Field(None, alias="documentId", description="关联文档 ID,传入时同步更新草稿")
  15. style_id: Optional[str] = Field(None, alias="styleId", description="样式 ID;不传时使用默认样式")
  16. model_config = {"populate_by_name": True}
  17. class ExportDocResponse(BaseModel):
  18. record_id: str = Field(..., serialization_alias="recordId")
  19. download_url: str = Field(..., serialization_alias="downloadUrl")
  20. file_name: str = Field(..., serialization_alias="fileName")
  21. style_id: str = Field(..., serialization_alias="styleId", description="实际使用的样式 ID")
  22. warning: Optional[str] = Field(None, serialization_alias="warning", description="存储超限时的警告信息")
  23. model_config = {"populate_by_name": True}
  24. # ------------------------------------------------------------------ #
  25. # 导出记录
  26. # ------------------------------------------------------------------ #
  27. class ExportRecordSchema(BaseModel):
  28. record_id: str = Field(..., serialization_alias="recordId")
  29. user_id: str = Field(..., serialization_alias="userId")
  30. file_name: str = Field(..., serialization_alias="fileName")
  31. file_size: int = Field(..., serialization_alias="fileSize")
  32. download_url: str = Field(..., serialization_alias="downloadUrl")
  33. document_id: Optional[str] = Field(None, serialization_alias="documentId")
  34. style_id: str = Field(..., serialization_alias="styleId")
  35. created_at: int = Field(..., serialization_alias="createdAt", description="Unix 毫秒时间戳")
  36. model_config = {"populate_by_name": True}
  37. @classmethod
  38. def from_record(cls, r: "ExportRecord") -> "ExportRecordSchema":
  39. return cls(
  40. record_id=r.id,
  41. user_id=r.user_id,
  42. file_name=r.file_name,
  43. file_size=r.file_size,
  44. download_url=r.download_url,
  45. document_id=r.document_id,
  46. style_id=r.style_id,
  47. created_at=int(r.created_at.timestamp() * 1000),
  48. )
  49. class PaginationSchema(BaseModel):
  50. page: int
  51. page_size: int = Field(..., serialization_alias="pageSize")
  52. total: int
  53. total_pages: int = Field(..., serialization_alias="totalPages")
  54. model_config = {"populate_by_name": True}
  55. class ExportRecordListResponse(BaseModel):
  56. records: list[ExportRecordSchema]
  57. pagination: PaginationSchema