diff --git a/src/baby_monitor/repositories/dependencies/get_token_repository.py b/src/baby_monitor/repositories/dependencies/get_token_repository.py index a90de0d..c3ba3e6 100644 --- a/src/baby_monitor/repositories/dependencies/get_token_repository.py +++ b/src/baby_monitor/repositories/dependencies/get_token_repository.py @@ -6,7 +6,7 @@ import logging from baby_monitor.repositories.interfaces import ( TokenRepositoryInterface, ) -from baby_monitor.repositories.token.memory_token import ( +from baby_monitor.repositories.token import ( InMemoryTokenRepository, ) @@ -43,7 +43,7 @@ def _initialize_token_repository() -> TokenRepositoryInterface: ) from e try: - from baby_monitor.repositories.token.redis_token import ( + from baby_monitor.repositories.token import ( RedisTokenRepository, ) diff --git a/src/baby_monitor/repositories/token/__init__.py b/src/baby_monitor/repositories/token/__init__.py new file mode 100644 index 0000000..4fdf8ff --- /dev/null +++ b/src/baby_monitor/repositories/token/__init__.py @@ -0,0 +1,11 @@ +"""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", +] diff --git a/src/baby_monitor/repositories/token/default_ttl.py b/src/baby_monitor/repositories/token/default_ttl.py new file mode 100644 index 0000000..6aa379d --- /dev/null +++ b/src/baby_monitor/repositories/token/default_ttl.py @@ -0,0 +1,3 @@ +"""Definition of Token default TTL.""" + +DEFAULT_TTL = 28800 # seconds -> 8 hours diff --git a/src/baby_monitor/repositories/token/memory_token.py b/src/baby_monitor/repositories/token/memory_token.py index 735ff4d..b45ac5e 100644 --- a/src/baby_monitor/repositories/token/memory_token.py +++ b/src/baby_monitor/repositories/token/memory_token.py @@ -3,6 +3,7 @@ from datetime import datetime, timedelta, UTC from baby_monitor.repositories.interfaces import TokenRepositoryInterface +from baby_monitor.repositories.token import DEFAULT_TTL class InMemoryTokenRepository(TokenRepositoryInterface): @@ -16,9 +17,8 @@ class InMemoryTokenRepository(TokenRepositoryInterface): def __init__(self) -> None: # token -> (user_id, expiry_time) 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 = 3600) -> None: + def store(self, token: str, user_id: int, ttl: int = DEFAULT_TTL) -> None: """Store a token with TTL (time to live in seconds).""" expiry = datetime.now(UTC) + timedelta(seconds=ttl) self._tokens[token] = (user_id, expiry) @@ -39,7 +39,7 @@ class InMemoryTokenRepository(TokenRepositoryInterface): return None # Sliding expiration: extend the token lifetime - new_expiry = datetime.now(UTC) + timedelta(seconds=self._default_ttl) + new_expiry = datetime.now(UTC) + timedelta(seconds=DEFAULT_TTL) self._tokens[token] = (user_id, new_expiry) return user_id diff --git a/src/baby_monitor/repositories/token/redis_token.py b/src/baby_monitor/repositories/token/redis_token.py index 044c8dd..0ae4b20 100644 --- a/src/baby_monitor/repositories/token/redis_token.py +++ b/src/baby_monitor/repositories/token/redis_token.py @@ -3,14 +3,14 @@ from typing import Any from baby_monitor.repositories.interfaces import TokenRepositoryInterface +from baby_monitor.repositories.token import DEFAULT_TTL class RedisTokenRepository(TokenRepositoryInterface): """ Redis-based token storage. - Requires redis package: pip install redis - Set REDIS_URI environment variable (e.g., redis://localhost:6379/0) + This implementation uses Redis to store tokens with TTL. Implements sliding expiration. """ def __init__(self, redis_client: Any) -> None: @@ -21,9 +21,8 @@ class RedisTokenRepository(TokenRepositoryInterface): redis_client: Redis client instance from redis.from_url() """ self.redis = redis_client - self.default_ttl = 3600 # Store default TTL for sliding expiration - def store(self, token: str, user_id: int, ttl: int = 3600) -> None: + def store(self, token: str, user_id: int, ttl: int = DEFAULT_TTL) -> None: """Store a token with TTL (time to live in seconds).""" key = f"token:{token}" self.redis.setex(key, ttl, str(user_id)) @@ -37,7 +36,7 @@ class RedisTokenRepository(TokenRepositoryInterface): user_id_str = self.redis.get(key) if user_id_str: # Sliding expiration: extend the token lifetime - self.redis.expire(key, self.default_ttl) + self.redis.expire(key, DEFAULT_TTL) return int(user_id_str) return None