From ea472e4df8af6fa25ef56f5689ec4c1f3173ab6f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jo=C3=A3o=20Vit=C3=B3ria=20Silva?=
Date: Thu, 11 Dec 2025 15:13:11 +0000
Subject: [PATCH] Bump version to 0.16.2 and improve sleep data parsing
Updated backend and frontend version numbers to 0.16.2. Improved robustness in Garmin sleep data parsing by handling None values before casting to int, preventing potential runtime errors. #439
---
backend/app/core/config.py | 2 +-
backend/app/garmin/health_utils.py | 42 +++++++++++++++----
backend/pyproject.toml | 2 +-
frontend/app/package-lock.json | 4 +-
frontend/app/package.json | 2 +-
.../app/src/components/FooterComponent.vue | 2 +-
6 files changed, 41 insertions(+), 13 deletions(-)
diff --git a/backend/app/core/config.py b/backend/app/core/config.py
index 669202adb..33b831e3e 100644
--- a/backend/app/core/config.py
+++ b/backend/app/core/config.py
@@ -7,7 +7,7 @@ from cryptography.fernet import Fernet
import core.logger as core_logger
# Constant related to version
-API_VERSION = "v0.16.1"
+API_VERSION = "v0.16.2"
LICENSE_NAME = "GNU Affero General Public License v3.0 or later"
LICENSE_IDENTIFIER = "AGPL-3.0-or-later"
LICENSE_URL = "https://spdx.org/licenses/AGPL-3.0-or-later.html"
diff --git a/backend/app/garmin/health_utils.py b/backend/app/garmin/health_utils.py
index 3e9cdac65..1ddaa12f2 100644
--- a/backend/app/garmin/health_utils.py
+++ b/backend/app/garmin/health_utils.py
@@ -339,16 +339,40 @@ def fetch_and_process_sleep_by_dates(
light_sleep_seconds=sleep_dto.get("lightSleepSeconds"),
rem_sleep_seconds=sleep_dto.get("remSleepSeconds"),
awake_sleep_seconds=sleep_dto.get("awakeSleepSeconds"),
- avg_heart_rate=int(sleep_dto.get("avgHeartRate")),
+ avg_heart_rate=(
+ int(sleep_dto.get("avgHeartRate"))
+ if sleep_dto.get("avgHeartRate") is not None
+ else None
+ ),
min_heart_rate=None,
max_heart_rate=None,
- avg_spo2=int(sleep_dto.get("averageSpO2Value")),
+ avg_spo2=(
+ int(sleep_dto.get("averageSpO2Value"))
+ if sleep_dto.get("averageSpO2Value") is not None
+ else None
+ ),
lowest_spo2=sleep_dto.get("lowestSpO2Value"),
highest_spo2=sleep_dto.get("highestSpO2Value"),
- avg_respiration=int(sleep_dto.get("averageRespirationValue")),
- lowest_respiration=int(sleep_dto.get("lowestRespirationValue")),
- highest_respiration=int(sleep_dto.get("highestRespirationValue")),
- avg_stress_level=int(sleep_dto.get("avgSleepStress")),
+ avg_respiration=(
+ int(sleep_dto.get("averageRespirationValue"))
+ if sleep_dto.get("averageRespirationValue") is not None
+ else None
+ ),
+ lowest_respiration=(
+ int(sleep_dto.get("lowestRespirationValue"))
+ if sleep_dto.get("lowestRespirationValue") is not None
+ else None
+ ),
+ highest_respiration=(
+ int(sleep_dto.get("highestRespirationValue"))
+ if sleep_dto.get("highestRespirationValue") is not None
+ else None
+ ),
+ avg_stress_level=(
+ int(sleep_dto.get("avgSleepStress"))
+ if sleep_dto.get("avgSleepStress") is not None
+ else None
+ ),
awake_count=sleep_dto.get("awakeCount"),
restless_moments_count=None,
sleep_score_overall=overall_score.get("value"),
@@ -398,7 +422,11 @@ def fetch_and_process_sleep_by_dates(
in health_sleep_schema.SleepScore._value2member_map_
else None
),
- avg_sleep_stress=int(sleep_dto.get("avgSleepStress")),
+ avg_sleep_stress=(
+ int(sleep_dto.get("avgSleepStress"))
+ if sleep_dto.get("avgSleepStress") is not None
+ else None
+ ),
sleep_stress_score=(
health_sleep_schema.SleepScore(sleep_stress_score.get("qualifierKey"))
if sleep_stress_score
diff --git a/backend/pyproject.toml b/backend/pyproject.toml
index 8d49494a7..c8f3cc1d3 100644
--- a/backend/pyproject.toml
+++ b/backend/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "endurain"
-version = "0.16.1"
+version = "0.16.2"
description = "Endurain API for the Endurain app"
authors = ["João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com>"]
readme = "README.md"
diff --git a/frontend/app/package-lock.json b/frontend/app/package-lock.json
index ca7cbf920..6d03797d4 100644
--- a/frontend/app/package-lock.json
+++ b/frontend/app/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "endurain",
- "version": "0.16.1",
+ "version": "0.16.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "endurain",
- "version": "0.16.1",
+ "version": "0.16.2",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.7.1",
"@fortawesome/free-brands-svg-icons": "^6.7.1",
diff --git a/frontend/app/package.json b/frontend/app/package.json
index 1359518f3..9d6aa4262 100644
--- a/frontend/app/package.json
+++ b/frontend/app/package.json
@@ -1,6 +1,6 @@
{
"name": "endurain",
- "version": "0.16.1",
+ "version": "0.16.2",
"private": true,
"type": "module",
"scripts": {
diff --git a/frontend/app/src/components/FooterComponent.vue b/frontend/app/src/components/FooterComponent.vue
index b5be126dd..c2664d0cb 100644
--- a/frontend/app/src/components/FooterComponent.vue
+++ b/frontend/app/src/components/FooterComponent.vue
@@ -23,7 +23,7 @@
- • v0.16.1
+ • v0.16.2