- backend: FastAPI 应用工厂、统一错误信封、JWT、短信登录、工作区/成员/邀请、幂等中间件 - alembic 0001: workspace/member/invitation/audit_log/app_user + RLS 策略 + 双角色 GRANT - tests: 认证/工作区/租户隔离/幂等 四组用例(尚未在本机执行) - web: React18+Vite 骨架(登录、工作区、邀请落地页) - android: Compose 骨架(登录、工作区列表) - 2.Design: PRODUCT-PLAN / ROADMAP-M0-M1 / NAMING / DEVELOPMENT
68 lines
1.3 KiB
Python
68 lines
1.3 KiB
Python
"""对外输出模型。字段命名一次定死,客户端按契约生成。"""
|
|
|
|
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"
|
|
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]
|