From 623e9ba325c91b30a8d05f53255dccbd413aa288 Mon Sep 17 00:00:00 2001 From: proDream Date: Sat, 11 Jan 2025 02:30:39 +0400 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20UserManager=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Создан новый файл managers.py в директории lkeep/apps/auth. - Внутри файла создан класс UserManager с методом create_user для создания пользователей. - Метод create_user использует SQLAlchemy для взаимодействия с базой данных и обрабатывает исключения при добавлении существующего пользователя. --- lkeep/apps/auth/managers.py | 56 +++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 lkeep/apps/auth/managers.py diff --git a/lkeep/apps/auth/managers.py b/lkeep/apps/auth/managers.py new file mode 100644 index 0000000..5446d89 --- /dev/null +++ b/lkeep/apps/auth/managers.py @@ -0,0 +1,56 @@ +""" +Проект: Lkeep +Автор: Иван Ашихмин +Год: 2025 +Специально для проекта "Код на салфетке" +https://pressanybutton.ru/category/servis-na-fastapi/ +""" + +from fastapi import Depends, HTTPException +from sqlalchemy import insert +from sqlalchemy.exc import IntegrityError + +from lkeep.apps.auth.schemas import CreateUser, UserReturnData +from lkeep.core.core_dependency.db_dependency import DBDependency +from lkeep.database.models import User + + +class UserManager: + """ + Класс для управления пользователями. + """ + + def __init__(self, model: type[User] = User, db: DBDependency = Depends(DBDependency)) -> None: + """ + Инициализирует экземпляр класса. + + :param model: Модель, используемая для работы с данными. + :type model: Type[User] + :param db: Зависимость от базы данных. По умолчанию используется Depends(DBDependency). + :type db: DBDependency + """ + self.db = db + self.model = model + + async def create_user(self, user: CreateUser) -> UserReturnData: + """ + Создает нового пользователя в базе данных. + + :param user: Объект с данными для создания пользователя. + :type user: CreateUser + :returns: Данные созданного пользователя. + :rtype: UserReturnData + :raises HTTPException: Если пользователь уже существует. + """ + async with self.db.db_session as session: + query = insert(self.model).values(**user.model_dump()).returning(self.model) + + try: + result = await session.execute(query) + except IntegrityError: + raise HTTPException(status_code=400, detail="User already exists.") + + await session.commit() + + user_data = await result.scalar_one() + return UserReturnData(**user_data.__dict__)