Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9e5e5b58c7 |
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user