from sqlalchemy import or_, select from db import CRUD from db.handlers.toolbox import addNewToolbox from db.schemas import User from utils import logger, pwd_hash async def addNewUser(userData: dict) -> dict: login = userData.get("login", None) if not login: logger.error("Не указан логин") return {} userName = userData.get("username") if not userName: logger.error("Не указано имя пользователя") return {} query = select(User).where(or_(User.login == login, User.username == userName)) user = await CRUD.read(query) if user: logger.error("Пользователь с таким логином или именем уже существует") return {} if "access_level_id" not in userData: logger.error("Не указан уровень доступа") return {} if "password" not in userData: logger.error("Не указан пароль") return {} userData["hashed_password"] = pwd_hash(userData.pop("password")) newUser = await User(**userData).save() if not newUser: logger.error("Ошибка сохранения пользователя") return {} logger.info(f"Пользователь {newUser.username} успешно добавлен, id: {newUser.id}") if newUser.available_own_toolbox: newToolboxData = { "title": f"Тулбокс {newUser.username}", "description": f"Оборудование, полученное сотрудником {newUser.username}, под личную материальную ответственность", "owner_id": newUser.id, } newToolbox = await addNewToolbox(newToolboxData) logger.info( f"Тулбокс {newToolbox['title']} успешно создан и закреплен за пользователем {newUser.username}" ) return newUser.toDict() async def editUser(userData: dict) -> dict: id = userData.get("id", None) if not id: logger.error("Не указан id пользователя") return {} query = select(User).where(User.id == id) user = await CRUD.read(query) if not user: logger.error("Пользователь с таким id не найден") return {} changedUserData = userData.get("changedUserData", {}) if len(changedUserData.keys()) == 0: logger.error("Не указаны изменяемые данные") return {} if "password" in changedUserData: userData["hashed_password"] = pwd_hash(changedUserData.pop("password")) editedUser = await user.edit(**changedUserData) if not editedUser: logger.error("Ошибка обновления пользователя") return {} logger.info( f"Пользователь {editedUser.username} успешно обновлен, изменены данные: {changedUserData.keys()}" ) if not user.available_own_toolbox: if editedUser.available_own_toolbox: newToolboxData = { "title": f"Тулбокс {editedUser.username}", "description": f"Оборудование, полученное сотрудником {editedUser.username}, под личную материальную ответственность", "owner_id": editedUser.id, } newToolbox = await addNewToolbox(newToolboxData) logger.info( f"Тулбокс {newToolbox['title']} успешно создан и закреплен за пользователем {editedUser.username}" ) return editedUser.toDict()