65 lines
2.3 KiB
Python
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)
|