# app/models/schemas/users.py from typing import Optional from pydantic import BaseModel, EmailStr, Field from app.models.domain.users import User from app.models.schemas.rwschema import RWSchema # =============================== # 旧有登录/创建(兼容保留) # =============================== class UserInLogin(RWSchema): email: EmailStr password: str class UserInCreate(UserInLogin): username: str class UserInUpdate(BaseModel): username: Optional[str] = None email: Optional[EmailStr] = None password: Optional[str] = None bio: Optional[str] = None image: Optional[str] = None phone: Optional[str] = None user_type: Optional[str] = None company_name: Optional[str] = None # =============================== # 新增:邮箱验证码注册/登录/Token # =============================== class SendEmailCodeIn(RWSchema): """发送邮箱验证码""" email: EmailStr # 可选场景:register/reset/login,不传默认 register scene: Optional[str] = "register" class RegisterWithEmailIn(RWSchema): """邮箱注册:邮箱 + 密码 + 确认密码 + 验证码""" email: EmailStr password: str = Field(min_length=6, max_length=64) confirm_password: str = Field(min_length=6, max_length=64) code: str = Field(min_length=4, max_length=8) class LoginWithPasswordIn(RWSchema): """邮箱 + 密码登录""" email: EmailStr password: str class TokenOut(RWSchema): token: str token_type: str = "Token" # =============================== # 响应模型(带 email_verified) # =============================== class UserWithToken(User): token: str phone: Optional[str] = None user_type: Optional[str] = None company_name: Optional[str] = None class UserInResponse(RWSchema): user: UserWithToken