Finance-Accounts/ar-aging-app/backend/app/config.py

65 lines
2.3 KiB
Python

"""Application configuration (env-overridable). No third-party data egress."""
from __future__ import annotations
import os
from pathlib import Path
from urllib.parse import quote_plus
from dotenv import load_dotenv
# Load ar-aging-app/.env (or cwd) before reading settings.
_APP_ROOT = Path(__file__).resolve().parent.parent.parent # .../ar-aging-app
load_dotenv(_APP_ROOT / ".env")
load_dotenv() # also allow cwd overrides
BASE_DIR = Path(__file__).resolve().parent.parent # .../backend
DATA_DIR = Path(os.environ.get("AR_DATA_DIR", str(BASE_DIR / "data")))
UPLOAD_DIR = DATA_DIR / "uploads"
EXPORT_DIR = DATA_DIR / "exports"
# MySQL (required)
MYSQL_HOST = os.environ.get("MYSQL_HOST", "")
MYSQL_PORT = int(os.environ.get("MYSQL_PORT", "3306"))
MYSQL_USER = os.environ.get("MYSQL_USER", "")
MYSQL_PASSWORD = os.environ.get("MYSQL_PASSWORD", "")
MYSQL_DATABASE = os.environ.get("MYSQL_DATABASE", "")
MYSQL_SLOW_QUERY_MS = int(os.environ.get("MYSQL_SLOW_QUERY_MS", "500"))
MYSQL_POOL_SIZE = int(os.environ.get("MYSQL_POOL_SIZE", "10"))
MYSQL_POOL_RECYCLE = int(os.environ.get("MYSQL_POOL_RECYCLE", "3600"))
def mysql_url() -> str:
if not all((MYSQL_HOST, MYSQL_USER, MYSQL_DATABASE)):
raise RuntimeError(
"MYSQL_HOST, MYSQL_USER, and MYSQL_DATABASE are required. "
"Copy example.env to .env and fill in credentials."
)
user = quote_plus(MYSQL_USER)
password = quote_plus(MYSQL_PASSWORD)
return (
f"mysql+pymysql://{user}:{password}"
f"@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
f"?charset=utf8mb4"
)
# Retention: temp uploads/exports older than this are purged (0 = keep forever).
RETENTION_DAYS = int(os.environ.get("AR_RETENTION_DAYS", "30"))
# Defaults
DEFAULT_CLEARING_LAG_DAYS = int(os.environ.get("AR_CLEARING_LAG_DAYS", "2"))
DEFAULT_TOLERANCE = float(os.environ.get("AR_TOLERANCE", "0.01"))
MAX_UPLOAD_BYTES = int(os.environ.get("AR_MAX_UPLOAD_BYTES", str(2 * 1024 * 1024 * 1024))) # 2 GB
ALLOWED_EXTENSIONS = {".xlsx", ".xls", ".csv"}
# CORS (frontend dev server)
CORS_ORIGINS = os.environ.get(
"AR_CORS_ORIGINS", "http://localhost:5173,http://127.0.0.1:5173"
).split(",")
def ensure_dirs() -> None:
for d in (DATA_DIR, UPLOAD_DIR, EXPORT_DIR):
d.mkdir(parents=True, exist_ok=True)