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)