3
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
"""Pydantic v2 Schema 包。"""
|
||||
|
||||
from app.schemas.user import (
|
||||
LoginRequest,
|
||||
MeResponse,
|
||||
RegisterRequest,
|
||||
StorageInfoResponse,
|
||||
UpdateMeRequest,
|
||||
UserResponse,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
"LoginRequest",
|
||||
"MeResponse",
|
||||
"RegisterRequest",
|
||||
"StorageInfoResponse",
|
||||
"UpdateMeRequest",
|
||||
"UserResponse",
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
"""文档相关 Pydantic v2 Schema。"""
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class DocumentResponse(BaseModel):
|
||||
id: str
|
||||
knowledge_base_id: str
|
||||
original_filename: str
|
||||
file_size: int
|
||||
mime_type: str
|
||||
file_ext: str
|
||||
sha256: str
|
||||
title: str | None
|
||||
description: str | None
|
||||
keywords: str | None
|
||||
content_summary: str | None
|
||||
status: str
|
||||
error_code: str | None
|
||||
doc_token_hint: str | None
|
||||
category_id: str | None
|
||||
created_at: str
|
||||
updated_at: str
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class DocumentListResponse(BaseModel):
|
||||
items: list[DocumentResponse]
|
||||
total: int
|
||||
|
||||
|
||||
class DocumentUpdateRequest(BaseModel):
|
||||
title: str | None = Field(default=None, max_length=512)
|
||||
description: str | None = Field(default=None, max_length=2000)
|
||||
keywords: str | None = Field(default=None, max_length=500)
|
||||
category_id: str | None = None
|
||||
|
||||
|
||||
class DocumentUploadResponse(BaseModel):
|
||||
id: str
|
||||
original_filename: str
|
||||
file_size: int
|
||||
status: str
|
||||
message: str
|
||||
@@ -0,0 +1,39 @@
|
||||
"""知识库相关 Pydantic v2 Schema。"""
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class KbCreateRequest(BaseModel):
|
||||
name: str = Field(min_length=1, max_length=255)
|
||||
description: str | None = Field(default=None, max_length=2000)
|
||||
|
||||
|
||||
class KbUpdateRequest(BaseModel):
|
||||
name: str | None = Field(default=None, min_length=1, max_length=255)
|
||||
description: str | None = None
|
||||
|
||||
|
||||
class KbResponse(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
description: str | None
|
||||
enabled: bool
|
||||
token_hint: str | None
|
||||
ai_url: str | None = None # 仅创建/重置时返回完整 URL
|
||||
document_count: int = 0
|
||||
created_at: str
|
||||
updated_at: str
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class KbListResponse(BaseModel):
|
||||
items: list[KbResponse]
|
||||
total: int
|
||||
|
||||
|
||||
class KbTokenResponse(BaseModel):
|
||||
"""Token 重置/创建时的完整 URL 响应。"""
|
||||
token: str
|
||||
ai_url: str
|
||||
token_hint: str
|
||||
@@ -0,0 +1,82 @@
|
||||
"""用户相关 Pydantic v2 Schema(请求/响应)。"""
|
||||
|
||||
import re
|
||||
|
||||
from pydantic import BaseModel, EmailStr, Field, field_validator
|
||||
|
||||
_USERNAME_RE = re.compile(r"^[A-Za-z0-9_\-一-鿿]{2,32}$")
|
||||
|
||||
|
||||
class RegisterRequest(BaseModel):
|
||||
username: str = Field(min_length=2, max_length=32)
|
||||
email: str = Field(min_length=5, max_length=255)
|
||||
password: str = Field(min_length=8, max_length=128)
|
||||
|
||||
@field_validator("username")
|
||||
@classmethod
|
||||
def validate_username(cls, v: str) -> str:
|
||||
if not _USERNAME_RE.match(v):
|
||||
raise ValueError("用户名只能包含字母、数字、下划线、短横线和中文,长度 2-32。")
|
||||
return v
|
||||
|
||||
@field_validator("email")
|
||||
@classmethod
|
||||
def validate_email(cls, v: str) -> str:
|
||||
# 简单格式校验(不引入 email-validator 重依赖)
|
||||
if "@" not in v or "." not in v.split("@")[-1]:
|
||||
raise ValueError("邮箱格式不正确。")
|
||||
return v.lower().strip()
|
||||
|
||||
@field_validator("password")
|
||||
@classmethod
|
||||
def validate_password(cls, v: str) -> str:
|
||||
if len(v) < 8:
|
||||
raise ValueError("密码长度不能少于 8 位。")
|
||||
return v
|
||||
|
||||
|
||||
class LoginRequest(BaseModel):
|
||||
username_or_email: str = Field(min_length=2, max_length=255)
|
||||
password: str = Field(min_length=1, max_length=128)
|
||||
|
||||
|
||||
class UserResponse(BaseModel):
|
||||
id: str
|
||||
username: str
|
||||
email: str
|
||||
status: str
|
||||
storage_used: int
|
||||
storage_quota: int
|
||||
created_at: str
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class MeResponse(BaseModel):
|
||||
id: str
|
||||
username: str
|
||||
email: str
|
||||
status: str
|
||||
storage_used: int
|
||||
storage_quota: int
|
||||
created_at: str
|
||||
|
||||
model_config = {"from_attributes": True}
|
||||
|
||||
|
||||
class StorageInfoResponse(BaseModel):
|
||||
storage_used: int
|
||||
storage_quota: int
|
||||
storage_used_mb: float
|
||||
storage_quota_mb: float
|
||||
|
||||
|
||||
class UpdateMeRequest(BaseModel):
|
||||
password: str | None = Field(default=None, min_length=8, max_length=128)
|
||||
|
||||
@field_validator("password")
|
||||
@classmethod
|
||||
def validate_password(cls, v: str | None) -> str | None:
|
||||
if v is not None and len(v) < 8:
|
||||
raise ValueError("密码长度不能少于 8 位。")
|
||||
return v
|
||||
Reference in New Issue
Block a user