You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
3.3 KiB
Python

from dataclasses import dataclass
from fastapi import Query
from pydantic import BaseModel, ConfigDict, Field
from app.common.enums import QueueEnum
from app.core.base_params import BaseQueryParam, TenantByQueryParam, UserByQueryParam
from app.core.base_schema import BaseSchema, TenantBySchema, UserBySchema
class FileCreateSchema(BaseModel):
"""文件记录创建模型。"""
storage_type: str = Field(default="local", max_length=20, description="存储类型: local/minio")
bucket_name: str | None = Field(default=None, max_length=128, description="MinIO存储桶")
object_name: str | None = Field(default=None, max_length=512, description="MinIO对象名称")
original_name: str = Field(..., max_length=255, description="原始文件名")
file_name: str = Field(..., max_length=255, description="存储文件名")
file_ext: str | None = Field(default=None, max_length=32, description="文件扩展名")
content_type: str | None = Field(default=None, max_length=128, description="文件MIME类型")
file_size: int = Field(default=0, ge=0, description="文件大小,单位字节")
file_path: str | None = Field(default=None, max_length=512, description="本地路径或对象路径")
file_url: str | None = Field(default=None, description="文件访问地址")
upload_type: str = Field(default="file", max_length=32, description="上传类型")
business_type: str | None = Field(default=None, max_length=64, description="业务类型")
business_id: int | None = Field(default=None, ge=0, description="业务ID")
class FileUpdateSchema(FileCreateSchema):
"""文件记录更新模型。"""
class FileOutSchema(FileCreateSchema, BaseSchema, UserBySchema, TenantBySchema):
"""文件记录响应模型。"""
model_config = ConfigDict(from_attributes=True)
origin_name: str | None = Field(default=None, description="兼容旧接口的原始文件名")
@dataclass
class FileQueryParam(BaseQueryParam, UserByQueryParam, TenantByQueryParam):
"""文件记录查询参数。"""
storage_type: str | None = Query(None, description="存储类型: local/minio")
original_name: str | None = Query(None, description="原始文件名")
file_name: str | None = Query(None, description="存储文件名")
file_ext: str | None = Query(None, description="文件扩展名")
upload_type: str | None = Query(None, description="上传类型")
business_type: str | None = Query(None, description="业务类型")
business_id: int | None = Query(None, ge=0, description="业务ID")
def __post_init__(self) -> None:
if self.storage_type:
self.storage_type = (QueueEnum.eq.value, self.storage_type)
if self.original_name:
self.original_name = (QueueEnum.like.value, self.original_name)
if self.file_name:
self.file_name = (QueueEnum.like.value, self.file_name)
if self.file_ext:
self.file_ext = (QueueEnum.eq.value, self.file_ext)
if self.upload_type:
self.upload_type = (QueueEnum.eq.value, self.upload_type)
if self.business_type:
self.business_type = (QueueEnum.eq.value, self.business_type)
if isinstance(self.business_id, int):
self.business_id = (QueueEnum.eq.value, self.business_id)