Author SHA1 Message Date
Brian Bjarke Jensen 9e5e5b58c7 added env vars 2025-11-12 18:23:35 +01:00
6 changed files with 17 additions and 36 deletions
@@ -6,7 +6,7 @@ import logging
from baby_monitor.repositories.interfaces import ( from baby_monitor.repositories.interfaces import (
TokenRepositoryInterface, TokenRepositoryInterface,
) )
from baby_monitor.repositories.token import ( from baby_monitor.repositories.token.memory_token import (
InMemoryTokenRepository, InMemoryTokenRepository,
) )
@@ -43,7 +43,7 @@ def _initialize_token_repository() -> TokenRepositoryInterface:
) from e ) from e
try: try:
from baby_monitor.repositories.token import ( from baby_monitor.repositories.token.redis_token import (
RedisTokenRepository, RedisTokenRepository,
) )
@@ -1,11 +0,0 @@
"""Token repository implementations and configurations."""
from .default_ttl import DEFAULT_TTL
from .memory_token import InMemoryTokenRepository
from .redis_token import RedisTokenRepository
__all__ = [
"DEFAULT_TTL",
"InMemoryTokenRepository",
"RedisTokenRepository",
]
@@ -1,3 +0,0 @@
"""Definition of Token default TTL."""
DEFAULT_TTL = 28800 # seconds -> 8 hours
@@ -3,7 +3,6 @@
from datetime import datetime, timedelta, UTC from datetime import datetime, timedelta, UTC
from baby_monitor.repositories.interfaces import TokenRepositoryInterface from baby_monitor.repositories.interfaces import TokenRepositoryInterface
from baby_monitor.repositories.token import DEFAULT_TTL
class InMemoryTokenRepository(TokenRepositoryInterface): class InMemoryTokenRepository(TokenRepositoryInterface):
@@ -17,8 +16,9 @@ class InMemoryTokenRepository(TokenRepositoryInterface):
def __init__(self) -> None: def __init__(self) -> None:
# token -> (user_id, expiry_time) # token -> (user_id, expiry_time)
self._tokens: dict[str, tuple[int, datetime]] = {} self._tokens: dict[str, tuple[int, datetime]] = {}
self._default_ttl = 3600 # Store default TTL for sliding expiration
def store(self, token: str, user_id: int, ttl: int = DEFAULT_TTL) -> None: def store(self, token: str, user_id: int, ttl: int = 3600) -> None:
"""Store a token with TTL (time to live in seconds).""" """Store a token with TTL (time to live in seconds)."""
expiry = datetime.now(UTC) + timedelta(seconds=ttl) expiry = datetime.now(UTC) + timedelta(seconds=ttl)
self._tokens[token] = (user_id, expiry) self._tokens[token] = (user_id, expiry)
@@ -39,7 +39,7 @@ class InMemoryTokenRepository(TokenRepositoryInterface):
return None return None
# Sliding expiration: extend the token lifetime # Sliding expiration: extend the token lifetime
new_expiry = datetime.now(UTC) + timedelta(seconds=DEFAULT_TTL) new_expiry = datetime.now(UTC) + timedelta(seconds=self._default_ttl)
self._tokens[token] = (user_id, new_expiry) self._tokens[token] = (user_id, new_expiry)
return user_id return user_id
@@ -3,14 +3,14 @@
from typing import Any from typing import Any
from baby_monitor.repositories.interfaces import TokenRepositoryInterface from baby_monitor.repositories.interfaces import TokenRepositoryInterface
from baby_monitor.repositories.token import DEFAULT_TTL
class RedisTokenRepository(TokenRepositoryInterface): class RedisTokenRepository(TokenRepositoryInterface):
""" """
Redis-based token storage. Redis-based token storage.
This implementation uses Redis to store tokens with TTL. Implements sliding expiration. Requires redis package: pip install redis
Set REDIS_URI environment variable (e.g., redis://localhost:6379/0)
""" """
def __init__(self, redis_client: Any) -> None: def __init__(self, redis_client: Any) -> None:
@@ -21,8 +21,9 @@ class RedisTokenRepository(TokenRepositoryInterface):
redis_client: Redis client instance from redis.from_url() redis_client: Redis client instance from redis.from_url()
""" """
self.redis = redis_client self.redis = redis_client
self.default_ttl = 3600 # Store default TTL for sliding expiration
def store(self, token: str, user_id: int, ttl: int = DEFAULT_TTL) -> None: def store(self, token: str, user_id: int, ttl: int = 3600) -> None:
"""Store a token with TTL (time to live in seconds).""" """Store a token with TTL (time to live in seconds)."""
key = f"token:{token}" key = f"token:{token}"
self.redis.setex(key, ttl, str(user_id)) self.redis.setex(key, ttl, str(user_id))
@@ -36,7 +37,7 @@ class RedisTokenRepository(TokenRepositoryInterface):
user_id_str = self.redis.get(key) user_id_str = self.redis.get(key)
if user_id_str: if user_id_str:
# Sliding expiration: extend the token lifetime # Sliding expiration: extend the token lifetime
self.redis.expire(key, DEFAULT_TTL) self.redis.expire(key, self.default_ttl)
return int(user_id_str) return int(user_id_str)
return None return None
+7 -13
View File
@@ -345,16 +345,13 @@
} }
} }
function attachTimeRangeListener() { document
const timeRangeFilter = document.getElementById("timeRangeFilter"); .getElementById("timeRangeFilter")
if (timeRangeFilter) { .addEventListener("change", function () {
timeRangeFilter.addEventListener("change", function () { // Save selection to localStorage
// Save selection to localStorage localStorage.setItem("lastSleepTimeRange", this.value);
localStorage.setItem("lastSleepTimeRange", this.value); loadData();
renderCharts(); });
});
}
}
async function loadData() { async function loadData() {
try { try {
@@ -446,9 +443,6 @@
attachChildFilterListener(); attachChildFilterListener();
} }
// Always attach time range listener after recreating the controls
attachTimeRangeListener();
renderCharts(); renderCharts();
} catch (error) { } catch (error) {
console.error("Error loading data:", error); console.error("Error loading data:", error);