повысил надежность обработки 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

View File

@@ -33,12 +33,16 @@ class ClockifyAPI(ClockifyConfig):
page-size: int - Размер страницы (по умолчанию 50)
"""
time_entries_url = self.time_entries_url
activities = requests.get(
resp = requests.get(
self.base_url + time_entries_url,
params=kwargs,
headers={"X-API-KEY": self.token},
timeout=REQUEST_TIMEOUT,
).json()
)
if not resp.ok:
logger.error(f"Ошибка ClockifyAPI: {resp.text} {resp.status_code}")
resp.raise_for_status()
activities = resp.json()
if not activities:
return []
logger.info(f"Получено задач: {len(activities)}")
@@ -84,6 +88,9 @@ class ClockifyAPI(ClockifyConfig):
task_id = parse_task_id(tag.title)
author = db.get_user_by("clockify_user_id", activity["userId"])
if not author:
logger.error(f"Не найден автор активности {activity['id']}")
continue
result.append(
Activity(
@@ -124,12 +131,16 @@ class ClockifyAPI(ClockifyConfig):
**kwargs,
"page": page
}
tags = requests.get(
resp = requests.get(
self.base_url + self.tags_url,
params=params,
headers={"X-API-KEY": self.token},
timeout=REQUEST_TIMEOUT,
).json()
)
if not resp.ok:
logger.error(f"Ошибка ClockifyAPI: {resp.text} {resp.status_code}")
resp.raise_for_status()
tags = resp.json()
for tag in tags:
clockify_tag = Tag(
@@ -156,18 +167,26 @@ class ClockifyAPI(ClockifyConfig):
"""
Получает с сервера Clockify Проекты (ДО) Ветро
"""
projects = requests.get(
resp = requests.get(
self.base_url + self.projects_url,
headers={"X-API-KEY": self.token},
timeout=REQUEST_TIMEOUT,
).json()
)
if not resp.ok:
logger.error(f"Ошибка ClockifyAPI: {resp.text} {resp.status_code}")
resp.raise_for_status()
projects = resp.json()
for project in projects:
if not project.get("archived"):
vetro_projects = requests.get(
resp = requests.get(
self.base_url + self.tasks_url(project.get("id")),
headers={"X-API-KEY": self.token},
timeout=REQUEST_TIMEOUT,
).json()
)
if not resp.ok:
logger.error(f"Ошибка ClockifyAPI: {resp.text} {resp.status_code}")
resp.raise_for_status()
vetro_projects = resp.json()
return [VetroProject(
id=vetro_project["id"],
title=vetro_project["name"]
@@ -200,7 +219,7 @@ class ClockifyAPI(ClockifyConfig):
if config.is_debug or resp.ok:
logger.info(f"{Fore.GREEN}{activity}{Fore.RESET}".ljust(60) + "")
else:
logger.debug(resp.json())
logger.debug(resp.text)
logger.error(f"{Fore.RED}{activity}{Fore.RESET}".ljust(60) + "")
except Exception as e:
logger.error(e)
@@ -214,7 +233,7 @@ class ClockifyAPI(ClockifyConfig):
timeout=REQUEST_TIMEOUT,
)
if not resp.ok:
logger.error(resp.json())
logger.error(resp.text)
raise InvalidToken
resp = resp.json()
logger.debug({"id": resp["id"], "email": resp["email"], "name": resp["name"]})
@@ -228,7 +247,7 @@ class ClockifyAPI(ClockifyConfig):
timeout=REQUEST_TIMEOUT,
)
if not resp.ok:
logger.error(resp.json())
logger.error(resp.text)
raise requests.exceptions.RequestException(Fore.RED + "Ошибка запроса." + Fore.RESET)
json = resp.json()
return {