This commit is contained in:
2025-12-13 14:39:50 +03:00
commit b666cdcb95
79 changed files with 3081 additions and 0 deletions

View File

@@ -0,0 +1,12 @@
from app.utils.validators import validate_email, validate_password
from app.utils.helpers import format_datetime, format_date, dict_to_json, json_to_dict
__all__ = [
"validate_email",
"validate_password",
"format_datetime",
"format_date",
"dict_to_json",
"json_to_dict",
]

View File

@@ -0,0 +1,24 @@
from typing import Any, Dict
from datetime import datetime, date
import json
def format_datetime(dt: datetime) -> str:
"""Форматирование datetime в ISO строку"""
return dt.isoformat()
def format_date(d: date) -> str:
"""Форматирование date в ISO строку"""
return d.isoformat()
def dict_to_json(data: Dict[str, Any]) -> str:
"""Преобразование словаря в JSON строку"""
return json.dumps(data, ensure_ascii=False, default=str)
def json_to_dict(json_str: str) -> Dict[str, Any]:
"""Преобразование JSON строки в словарь"""
return json.loads(json_str)

View File

@@ -0,0 +1,27 @@
from typing import Optional
import re
from pydantic import EmailStr, validator
def validate_email(email: str) -> bool:
"""Валидация email"""
pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
return bool(re.match(pattern, email))
def validate_password(password: str) -> tuple[bool, Optional[str]]:
"""Валидация пароля"""
if len(password) < 8:
return False, "Password must be at least 8 characters long"
if not re.search(r'[A-Z]', password):
return False, "Password must contain at least one uppercase letter"
if not re.search(r'[a-z]', password):
return False, "Password must contain at least one lowercase letter"
if not re.search(r'\d', password):
return False, "Password must contain at least one digit"
return True, None