"""对外输出模型。字段命名一次定死,客户端按契约生成。""" from __future__ import annotations import uuid from datetime import datetime from pydantic import BaseModel, ConfigDict, Field class UserOut(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID phone: str = Field(description="已打码的手机号,如 138****8000") nickname: str created_at: datetime class TokenOut(BaseModel): access_token: str refresh_token: str token_type: str = "bearer" # noqa: S105 - 不是密码,是 OAuth2 的固定字段值 expires_in: int class LoginOut(BaseModel): user: UserOut tokens: TokenOut class WorkspaceOut(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID name: str slug: str plan: str role: str = "" created_at: datetime class MemberOut(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID user_id: uuid.UUID role: str status: str nickname: str = "" phone: str = "" joined_at: datetime class InvitationOut(BaseModel): model_config = ConfigDict(from_attributes=True) id: uuid.UUID code: str role: str expires_at: datetime accepted_at: datetime | None = None class MeOut(BaseModel): user: UserOut workspaces: list[WorkspaceOut]