# ================================================================ # DATA SERVICE CONFIGURATION # services/data/app/core/config.py # ================================================================ """ Data service configuration External data integration and management """ from shared.config.base import BaseServiceSettings import os class DataSettings(BaseServiceSettings): """Data service specific settings""" # Service Identity APP_NAME: str = "Data Service" SERVICE_NAME: str = "data-service" DESCRIPTION: str = "External data integration and management service" # Database Configuration DATABASE_URL: str = os.getenv("DATA_DATABASE_URL", "postgresql+asyncpg://data_user:data_pass123@data-db:5432/data_db") # Redis Database (dedicated for external data cache) REDIS_DB: int = 3 # External API Configuration AEMET_API_KEY: str = os.getenv("AEMET_API_KEY", "") AEMET_BASE_URL: str = "https://opendata.aemet.es/opendata" AEMET_TIMEOUT: int = int(os.getenv("AEMET_TIMEOUT", "30")) AEMET_RETRY_ATTEMPTS: int = int(os.getenv("AEMET_RETRY_ATTEMPTS", "3")) MADRID_OPENDATA_API_KEY: str = os.getenv("MADRID_OPENDATA_API_KEY", "") MADRID_OPENDATA_BASE_URL: str = "https://datos.madrid.es" MADRID_OPENDATA_TIMEOUT: int = int(os.getenv("MADRID_OPENDATA_TIMEOUT", "30")) # Data Collection Configuration WEATHER_COLLECTION_INTERVAL_HOURS: int = int(os.getenv("WEATHER_COLLECTION_INTERVAL_HOURS", "1")) TRAFFIC_COLLECTION_INTERVAL_HOURS: int = int(os.getenv("TRAFFIC_COLLECTION_INTERVAL_HOURS", "1")) EVENTS_COLLECTION_INTERVAL_HOURS: int = int(os.getenv("EVENTS_COLLECTION_INTERVAL_HOURS", "6")) # Cache TTL Configuration WEATHER_CACHE_TTL_HOURS: int = int(os.getenv("WEATHER_CACHE_TTL_HOURS", "1")) TRAFFIC_CACHE_TTL_HOURS: int = int(os.getenv("TRAFFIC_CACHE_TTL_HOURS", "1")) EVENTS_CACHE_TTL_HOURS: int = int(os.getenv("EVENTS_CACHE_TTL_HOURS", "6")) # Data Quality Configuration DATA_VALIDATION_ENABLED: bool = os.getenv("DATA_VALIDATION_ENABLED", "true").lower() == "true" OUTLIER_DETECTION_ENABLED: bool = os.getenv("OUTLIER_DETECTION_ENABLED", "true").lower() == "true" DATA_COMPLETENESS_THRESHOLD: float = float(os.getenv("DATA_COMPLETENESS_THRESHOLD", "0.8")) # Geolocation Settings (Madrid focus) DEFAULT_LATITUDE: float = float(os.getenv("DEFAULT_LATITUDE", "40.4168")) # Madrid DEFAULT_LONGITUDE: float = float(os.getenv("DEFAULT_LONGITUDE", "-3.7038")) # Madrid LOCATION_RADIUS_KM: float = float(os.getenv("LOCATION_RADIUS_KM", "50.0")) # Data Retention RAW_DATA_RETENTION_DAYS: int = int(os.getenv("RAW_DATA_RETENTION_DAYS", "90")) PROCESSED_DATA_RETENTION_DAYS: int = int(os.getenv("PROCESSED_DATA_RETENTION_DAYS", "365")) # Batch Processing BATCH_PROCESSING_ENABLED: bool = os.getenv("BATCH_PROCESSING_ENABLED", "true").lower() == "true" BATCH_SIZE: int = int(os.getenv("BATCH_SIZE", "1000")) PARALLEL_PROCESSING_WORKERS: int = int(os.getenv("PARALLEL_PROCESSING_WORKERS", "4")) settings = DataSettings()