File size: 2,876 Bytes
6d12932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
from typing import List, Optional
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import Field
import os
import logging

logger = logging.getLogger(__name__)

class Settings(BaseSettings):
    """

    Application configuration via environment variables.

    """
    model_config = SettingsConfigDict(
        env_file=".env",
        env_file_encoding="utf-8",
        extra="ignore"
    )

    # Application
    APP_ENV: str = Field(default="development")
    LOG_LEVEL: str = Field(default="INFO")
    LOG_FILE: str = Field(default="/tmp/nursing_validator.log")

    # Security / Users
    # IMPORTANT: In production, these must be set via env vars.
    # Default values are provided for development convenience only.
    ADMIN_PASSWORD: str = Field(default="change_me_admin")
    NURSE_PASSWORD: str = Field(default="change_me_nurse")
    CLINICIAN_PASSWORD: str = Field(default="change_me_clinician")

    # Database
    USE_DATABASE: bool = Field(default=True)
    DB_TYPE: str = Field(default="sqlite")  # postgres or sqlite
    SQLITE_DB_PATH: str = Field(default="nursing_validator.db")
    
    # Postgres Settings
    DB_HOST: str = Field(default="localhost")
    DB_PORT: str = Field(default="5432")
    DB_NAME: str = Field(default="nursing_validator")
    DB_USER: str = Field(default="nursing_admin")
    DB_PASSWORD: str = Field(default="nursing_password")
    DB_POOL_MIN: int = Field(default=2)
    DB_POOL_MAX: int = Field(default=20)

    # Vector Database
    VECTOR_DB_PATH: str = Field(default="chroma_db_fons")
    LOCAL_DB_PATH: str = Field(default="/tmp/chroma_db_fons_fast")
    EMBEDDING_MODEL: str = Field(default="text-embedding-ada-002")

    # Azure OpenAI
    AZURE_OPENAI_ENDPOINT: Optional[str] = Field(default=None)
    AZURE_OPENAI_API_KEY: Optional[str] = Field(default=None)
    AZURE_OPENAI_API_VERSION: Optional[str] = Field(default="2023-05-15")
    AZURE_OPENAI_DEPLOYMENT: Optional[str] = Field(default=None)

    # Streamlit Specific
    STREAMLIT_SERVER_HEADLESS: bool = Field(default=True)
    STREAMLIT_SERVER_ENABLE_CORS: bool = Field(default=False)

    def is_production(self) -> bool:
        return self.APP_ENV.lower() == "production"

    def check_security(self):
        """Warn if using default insecure passwords."""
        defaults = ["change_me_admin", "change_me_nurse", "change_me_clinician"]
        if self.ADMIN_PASSWORD in defaults or \
           self.NURSE_PASSWORD in defaults or \
           self.CLINICIAN_PASSWORD in defaults:
            logger.warning(
                "SECURITY WARNING: Default passwords are in use. "
                "Set ADMIN_PASSWORD, NURSE_PASSWORD, and CLINICIAN_PASSWORD in .env."
            )

# Create a global instance
settings = Settings()
settings.check_security()