Files
AutonetSellCar/backend/app/schemas/user.py
AutonetSellCar Deploy 9853f0b4d5 Feat: 강력한 비밀번호 정책 및 로그인 보안 강화
- 비밀번호 최소 10자 이상, 특수문자 1개 이상 필수
- 20회 로그인 실패 시 비밀번호 재설정 필요
- 로그인 페이지에 남은 시도 횟수 경고 표시
- 계정 잠금 시 비밀번호 재설정 링크 제공
- 회원가입 페이지에 비밀번호 요구사항 체크리스트 UI

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-01 19:19:36 +09:00

73 lines
1.7 KiB
Python

from pydantic import BaseModel, EmailStr, field_validator
from typing import Optional
from datetime import datetime
import re
class UserCreate(BaseModel):
email: EmailStr
password: str
name: Optional[str] = None
phone: Optional[str] = None
country: str = "Mongolia"
referred_by: Optional[str] = None # Referral code of the user who referred
@field_validator('password')
@classmethod
def validate_password(cls, v):
if len(v) < 10:
raise ValueError('Password must be at least 10 characters long')
if not re.search(r'[!@#$%^&*(),.?":{}|<>_\-+=\[\]\\\/`~]', v):
raise ValueError('Password must contain at least one special character')
return v
class UserUpdate(BaseModel):
"""Schema for updating user profile"""
name: Optional[str] = None
phone: Optional[str] = None
country: Optional[str] = None
class UserResponse(BaseModel):
id: int
email: str
name: Optional[str] = None
phone: Optional[str] = None
country: str
is_active: bool
is_admin: bool = False
is_dealer: bool = False
cc_balance: float = 0.0 # Float to support fractional CC (e.g., 0.1 CC)
referral_code: Optional[str] = None # User's unique referral code
email_verified: bool = False
phone_verified: bool = False
created_at: datetime
class Config:
from_attributes = True
class CarViewResponse(BaseModel):
id: int
user_id: int
car_id: int
cc_paid: int
created_at: datetime
class Config:
from_attributes = True
class PurchaseViewRequest(BaseModel):
car_id: int
class Token(BaseModel):
access_token: str
token_type: str = "bearer"
class TokenData(BaseModel):
email: Optional[str] = None