|
from pydantic import BaseModel, EmailStr, Field, validator |
|
from typing import List, Optional |
|
|
|
|
|
class User(BaseModel): |
|
name: str = Field(..., min_length=3, max_length=50) |
|
email: EmailStr |
|
password: str |
|
|
|
@validator("password") |
|
def validate_password(cls, value): |
|
if len(value) < 8: |
|
raise ValueError("Password must be at least 8 characters long.") |
|
if not any(char.isdigit() for char in value): |
|
raise ValueError("Password must include at least one number.") |
|
if not any(char.isupper() for char in value): |
|
raise ValueError("Password must include at least one uppercase letter.") |
|
if not any(char.islower() for char in value): |
|
raise ValueError("Password must include at least one lowercase letter.") |
|
if not any(char in "!@#$%^&*()-_+=<>?/" for char in value): |
|
raise ValueError("Password must include at least one special character.") |
|
return value |
|
|
|
class UserUpdate(BaseModel): |
|
name: Optional[str] = Field(None, min_length=3, max_length=50) |
|
email: Optional[EmailStr] |
|
password: Optional[str] |
|
|
|
@validator("password") |
|
def validate_password(cls, value): |
|
if value is not None: |
|
if len(value) < 8: |
|
raise ValueError("Password must be at least 8 characters long.") |
|
if not any(char.isdigit() for char in value): |
|
raise ValueError("Password must include at least one number.") |
|
if not any(char.isupper() for char in value): |
|
raise ValueError("Password must include at least one uppercase letter.") |
|
if not any(char.islower() for char in value): |
|
raise ValueError("Password must include at least one lowercase letter.") |
|
if not any(char in "!@#$%^&*()-_+=<>?/" for char in value): |
|
raise ValueError("Password must include at least one special character.") |
|
return value |
|
|
|
class Token(BaseModel): |
|
access_token: str |
|
refresh_token: str |
|
token_type: str |
|
|
|
class LoginResponse(Token): |
|
name: str |
|
avatar: Optional[str] = None |
|
|
|
class TokenData(BaseModel): |
|
email: Optional[str] = None |
|
|