import uuid
from django.core.files.uploadedfile import UploadedFile
from django.contrib.auth import get_user_model
from .models import CustomUser # Твоя модель пользователя
User = get_user_model()
class UserService:
"""
Слой бизнес-логики для управления пользователями.
Здесь нет логики HTTP (заголовков, кук, редиректов). Только чистая работа с данными.
"""
@staticmethod
async def update_profile(user: User, data: dict) -> User:
"""
Принимает объект пользователя и словарь с очищенными данными из Pydantic,
обновляет БД и возвращает обновленный инстанс.
"""
for field, value in data.items():
setattr(user, field, value)
# Используем асинхронный метод сохранения Django 5/6
await user.asave(update_fields=data.keys())
return user
@staticmethod
async def upload_avatar(user: User, file: UploadedFile) -> str:
"""
Бизнес-логика обработки аватара: валидация, генерация уникального имени,
загрузка в облако Yandex Disk / S3 и сохранение пути в модель.
"""
# 1. Генерируем безопасное имя файла, чтобы избежать коллизий
ext = file.name.split(".")[-1]
unique_name = f"avatars/user_{user.id}_{uuid.uuid4().hex[:8]}.{ext}"
# 2. Подменяем имя файла перед сохранением
file.name = unique_name
# 3. Сохраняем в FileField (Django сам отправит его в S3/Yandex Disk,
# если настроен соответствующий Storage backend)
user.avatar = file
await user.asave(update_fields=["avatar"])
# 4. Возвращаем абсолютный URL для фронтенда
return user.avatar.url