Files
LibraryAPI/library_service/models/dto/user.py

62 lines
2.0 KiB
Python

"""Модуль DTO-моделей пользователей"""
import re
from typing import List
from pydantic import ConfigDict, EmailStr, field_validator
from sqlmodel import Field, SQLModel
class UserBase(SQLModel):
"""Базовая модель пользователя"""
username: str = Field(min_length=3, max_length=50, index=True, unique=True)
email: EmailStr = Field(index=True, unique=True)
full_name: str | None = Field(default=None, max_length=100)
model_config = ConfigDict(
json_schema_extra={
"example": {
"username": "johndoe",
"email": "john@example.com",
"full_name": "John Doe",
}
}
)
class UserCreate(UserBase):
"""Модель пользователя для создания"""
password: str = Field(min_length=8, max_length=100)
@field_validator("password")
@classmethod
def validate_password(cls, v: str) -> str:
"""Валидация пароля"""
if not re.search(r"[A-Z]", v):
raise ValueError("Пароль должен содержать символы в верхнем регистре")
if not re.search(r"[a-z]", v):
raise ValueError("Пароль должен содержать символы в нижнем регистре")
if not re.search(r"\d", v):
raise ValueError("пароль должен содержать цифры")
return v
class UserLogin(SQLModel):
"""Модель аутентификации для пользователя"""
username: str
password: str
class UserRead(UserBase):
"""Модель пользователя для чтения"""
id: int
is_active: bool
is_verified: bool
roles: List[str] = []
class UserUpdate(SQLModel):
"""Модель пользователя для обновления"""
email: EmailStr | None = None
full_name: str | None = None
password: str | None = None