Refactor environment-specific configurations and data loading.

Refactored database and server configuration to handle environments (dev, test, prod) explicitly, including tailored database setup and SSL management. Separated slot and sample data loading for better control during initialization. Improved environment variable usage and error handling for production certificates.
This commit is contained in:
GotthardG
2024-12-17 13:11:26 +01:00
parent a3f85c6dda
commit 19c5d7f880
3 changed files with 124 additions and 82 deletions

View File

@ -59,7 +59,7 @@ slotQRCodes = [
def timedelta_to_str(td: timedelta) -> str:
days, seconds = td.days, td.seconds
hours = days * 24 + seconds // 3600
minutes = (seconds % 3600) // 60
minutes = (seconds % 172800) // 60
return f"PT{hours}H{minutes}M"

View File

@ -6,18 +6,31 @@ from sqlalchemy.orm import sessionmaker
from . import models
import os
# Get username and password from environment variables
db_username = os.getenv("DB_USERNAME")
db_password = os.getenv("DB_PASSWORD")
# Fetch the environment (default to "dev")
environment = os.getenv("ENVIRONMENT", "dev")
# Construct the database URL
SQLALCHEMY_DATABASE_URL = f"mysql://{db_username}:{db_password}@localhost:3306/aare_db"
# Configure database per environment
if environment == "prod":
db_username = os.getenv("DB_USERNAME", "prod_user")
db_password = os.getenv("DB_PASSWORD", "prod_password")
db_host = os.getenv("DB_HOST", "localhost")
db_name = os.getenv("DB_NAME", "aare_prod_db")
elif environment == "test":
db_username = os.getenv("DB_USERNAME", "test_user")
db_password = os.getenv("DB_PASSWORD", "test_password")
db_host = os.getenv("DB_HOST", "localhost")
db_name = os.getenv("DB_NAME", "aare_test_db")
else: # Default is dev
db_username = os.getenv("DB_USERNAME", "dev_user")
db_password = os.getenv("DB_PASSWORD", "dev_password")
db_host = os.getenv("DB_HOST", "localhost")
db_name = os.getenv("DB_NAME", "aare_dev_db")
# Remove the `connect_args` parameter
SQLALCHEMY_DATABASE_URL = f"mysql://{db_username}:{db_password}@{db_host}/{db_name}"
# Create engine and session
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
@ -30,12 +43,17 @@ def get_db():
db.close()
def init_db():
Base.metadata.create_all(bind=engine)
# Load only slots (minimal data)
def load_slots_data(session: Session):
from .data import slots
if not session.query(models.Slot).first(): # Load only if no slots exist
session.add_all(slots)
session.commit()
# Load full sample data (used in dev/test)
def load_sample_data(session: Session):
# Import models inside function to avoid circular dependency
from .data import (
contacts,
return_addresses,
@ -50,7 +68,7 @@ def load_sample_data(session: Session):
sample_events,
)
# If any data already exists, skip seeding
# If any data exists, don't reseed
if session.query(models.ContactPerson).first():
return