from pydantic_settings import BaseSettings from typing import List, Dict, Any import json class Settings(BaseSettings): # Firebase firebase_service_account_path: str = "./firebase-service-account.json" firebase_storage_bucket: str = "" # JWT jwt_secret_key: str = "change-me-in-production" jwt_algorithm: str = "HS256" jwt_expiration_minutes: int = 480 # MQTT mqtt_broker_host: str = "localhost" mqtt_broker_port: int = 1883 mqtt_admin_username: str = "admin" mqtt_admin_password: str = "" mqtt_secret: str = "change-me-in-production" mosquitto_password_file: str = "/etc/mosquitto/passwd" mqtt_client_id: str = "bellsystems-admin-panel" # SQLite (local application database) sqlite_db_path: str = "./data/database.db" mqtt_data_retention_days: int = 90 # Local file storage built_melodies_storage_path: str = "./storage/built_melodies" firmware_storage_path: str = "./storage/firmware" # Email (Resend) resend_api_key: str = "re_placeholder_change_me" email_from: str = "noreply@yourdomain.com" # App backend_cors_origins: str = '["http://localhost:5173"]' debug: bool = True # Nextcloud WebDAV nextcloud_url: str = "" nextcloud_username: str = "" # WebDAV login & URL path username nextcloud_password: str = "" # Use an app password for better security nextcloud_dav_user: str = "" # Override URL path username if different from login nextcloud_base_path: str = "BellSystems" # IMAP/SMTP Email imap_host: str = "" imap_port: int = 993 imap_username: str = "" imap_password: str = "" imap_use_ssl: bool = True smtp_host: str = "" smtp_port: int = 587 smtp_username: str = "" smtp_password: str = "" smtp_use_tls: bool = True email_sync_interval_minutes: int = 15 # Multi-mailbox config (JSON array). If empty, legacy single-account IMAP/SMTP is used. # Example item: # {"key":"sales","label":"Sales","email":"sales@bellsystems.gr","imap_host":"...","imap_username":"...","imap_password":"...","smtp_host":"...","smtp_username":"...","smtp_password":"...","sync_inbound":true,"allow_send":true} mail_accounts_json: str = "[]" # Auto-deploy (Gitea webhook) deploy_secret: str = "" deploy_project_path: str = "/app" @property def cors_origins(self) -> List[str]: return json.loads(self.backend_cors_origins) @property def mail_accounts(self) -> List[Dict[str, Any]]: try: raw = json.loads(self.mail_accounts_json or "[]") return raw if isinstance(raw, list) else [] except Exception: return [] model_config = {"env_file": ".env", "extra": "ignore"} settings = Settings()