SmartEDT/backend/api/schemas.py

186 lines
4.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""API 层的请求/响应数据模型Pydantic
该文件集中定义后端 HTTP 接口的入参与返回结构,便于:
- 校验请求字段(长度、范围等)
- 生成 OpenAPI 文档
- 在路由层与前端之间形成稳定契约
"""
from __future__ import annotations
from datetime import datetime
from typing import Any
from pydantic import BaseModel, Field
class HealthResponse(BaseModel):
"""健康检查返回。"""
status: str = "ok"
class SimulationStartRequest(BaseModel):
"""启动仿真的请求体。"""
scenario: str | None = None
weather: str | None = None
time_period: str | None = None
max_speed_kmh: int | None = Field(default=None, ge=0, le=300)
duration_minutes: int | None = Field(default=None, ge=1, le=360)
driver: str | None = None
extra: dict[str, Any] = Field(default_factory=dict)
class SimulationStartResponse(BaseModel):
simulation_id: str
class SimulationStopResponse(BaseModel):
simulation_id: str
status: str
class TokenResponse(BaseModel):
"""登录成功后返回的 token 信息。"""
access_token: str
token_type: str = "bearer"
expires_in: int
class LoginRequest(BaseModel):
"""用户名密码登录请求。"""
username: str = Field(min_length=1, max_length=64)
password: str = Field(min_length=1, max_length=128)
class RoleCreateRequest(BaseModel):
"""创建角色请求。"""
role_id: str | None = Field(default=None, max_length=64)
role_name: str = Field(min_length=1, max_length=64)
role_desc: str | None = Field(default=None, max_length=255)
is_active: bool = True
extra: dict[str, Any] | None = None
class RoleUpdateRequest(BaseModel):
role_name: str | None = Field(default=None, max_length=64)
role_desc: str | None = Field(default=None, max_length=255)
is_active: bool | None = None
extra: dict[str, Any] | None = None
class RoleResponse(BaseModel):
role_id: str
role_name: str
role_desc: str | None = None
is_active: bool
created_at: datetime | None = None
updated_at: datetime | None = None
extra: dict[str, Any] | None = None
class PermissionCreateRequest(BaseModel):
"""创建权限点请求perm_code 支持自定义命名规则)。"""
perm_code: str = Field(min_length=1, max_length=128)
perm_name: str = Field(min_length=1, max_length=128)
perm_group: str | None = Field(default=None, max_length=64)
perm_desc: str | None = Field(default=None, max_length=255)
class PermissionResponse(BaseModel):
perm_code: str
perm_name: str
perm_group: str | None = None
perm_desc: str | None = None
created_at: datetime | None = None
class RolePermissionsUpdateRequest(BaseModel):
perm_codes: list[str] = Field(default_factory=list)
class RolePermissionsResponse(BaseModel):
role_id: str
perm_codes: list[str]
class UserCreateRequest(BaseModel):
"""创建用户请求(包含明文密码,服务端将保存为哈希)。"""
user_id: str | None = Field(default=None, max_length=64)
username: str = Field(min_length=1, max_length=64)
display_name: str | None = Field(default=None, max_length=64)
password: str = Field(min_length=1, max_length=128)
role_id: str = Field(min_length=1, max_length=64)
is_active: bool = True
extra: dict[str, Any] | None = None
class UserUpdateRequest(BaseModel):
display_name: str | None = Field(default=None, max_length=64)
role_id: str | None = Field(default=None, max_length=64)
is_active: bool | None = None
extra: dict[str, Any] | None = None
class UserPasswordUpdateRequest(BaseModel):
new_password: str = Field(min_length=1, max_length=128)
class UserResponse(BaseModel):
user_id: str
username: str
display_name: str | None = None
role_id: str
role_name: str | None = None
is_active: bool
last_login_at: datetime | None = None
created_at: datetime | None = None
updated_at: datetime | None = None
extra: dict[str, Any] | None = None
class MeResponse(BaseModel):
"""当前登录用户信息返回。"""
user: UserResponse
class LoginResponse(BaseModel):
token: TokenResponse
user: UserResponse
class BootstrapRequest(BaseModel):
"""系统首次初始化请求(仅允许在系统尚无任何用户时调用)。"""
username: str = Field(min_length=1, max_length=64)
password: str = Field(min_length=1, max_length=128)
display_name: str | None = Field(default=None, max_length=64)
class BootstrapResponse(BaseModel):
token: TokenResponse
user: UserResponse
class UnityInitConfigRequest(BaseModel):
payload: dict[str, Any]
class UnityInitConfigResponse(BaseModel):
simulation_id: str
class UnityCommandRequest(BaseModel):
payload: dict[str, Any]
class UnityCommandResponse(BaseModel):
ok: bool = True