повысил надежность обработки API-ответов и ошибок БД

This commit is contained in:
2026-07-06 16:07:08 +03:00
parent bd20ef4d48
commit 64b347e966
5 changed files with 76 additions and 30 deletions

13
db/constants.py Normal file
View File

@@ -0,0 +1,13 @@
"""Константы слоя базы данных."""
USER_LOOKUP_FIELDS = frozenset(
{
"id",
"clockify_user_id",
"redmine_user_id",
"clockify_email",
"clockify_username",
"redmine_email",
"redmine_username",
}
)

View File

@@ -5,6 +5,7 @@ from colorama import Fore
from classes import Activity, ActivityType, Tag, VetroProject
from classes.classes import Task
from db.constants import USER_LOOKUP_FIELDS
from enums import ActivityTypes
logger = logging.getLogger(__name__)
@@ -102,8 +103,9 @@ class Database:
)
)
self.con.commit()
except sq.IntegrityError:
pass
except sq.IntegrityError as e:
self.con.rollback()
logger.error(f"Не удалось сохранить трудочасы по активности {act.id}: {e}")
def insert_tags(self, tags: list[Tag]):
@@ -238,8 +240,13 @@ class Database:
def get_user_by(self, by_field: str, value: str):
"""Получает пользователя из бд"""
if by_field not in USER_LOOKUP_FIELDS:
raise ValueError(f"Недопустимое поле поиска пользователя: {by_field}")
try:
user = self.cursor.execute(f"SELECT * FROM user WHERE {by_field} = ?", (value,)).fetchone()
if not user:
logger.error(f"Пользователь не найден: {by_field}={value}")
return None
return {
"id": user[0],
"first_name": user[1],