from __future__ import annotations from typing import Literal from pydantic import BaseModel, EmailStr, Field class SignupStartRequest(BaseModel): username: str = Field(min_length=3, max_length=30) email: EmailStr password: str = Field(min_length=6) redirect_to: str | None = None class SignupVerifyRequest(BaseModel): email: EmailStr token: str = Field(pattern=r"^\d{6}$") class SignupResendRequest(BaseModel): email: EmailStr class LoginRequest(BaseModel): email: EmailStr password: str = Field(min_length=6) class RefreshRequest(BaseModel): refresh_token: str = Field(min_length=1) class LogoutRequest(BaseModel): refresh_token: str = Field(min_length=1) class AuthUser(BaseModel): id: str email: EmailStr class AuthTokenResponse(BaseModel): access_token: str refresh_token: str expires_in: int token_type: str user: AuthUser class AuthUserByEmailResponse(BaseModel): id: str email: EmailStr created_at: str email_confirmed_at: str | None = None class AuthSignupStartResponse(BaseModel): status: Literal["pending_verification"] = "pending_verification" email: EmailStr message: str = "Verification code sent" class AuthResendCodeResponse(BaseModel): message: str = "If the email exists, a verification code has been sent" class PasswordResetRequest(BaseModel): email: EmailStr redirect_to: str | None = None class PasswordResetResponse(BaseModel): message: str = "Password reset email sent"