Source code for restapi.config

"""
Configuration variables set for the server instance
"""

from functools import lru_cache
from pathlib import Path

from glom import glom

from restapi.env import Env
from restapi.utilities.globals import mem

# ENDPOINTS bases
API_URL = "/api"
AUTH_URL = "/auth"

APP_MODE: str = Env.get("APP_MODE", "development")
FORCE_PRODUCTION_TESTS: bool = Env.get_bool("FORCE_PRODUCTION_TESTS")
TESTING: bool = APP_MODE == "test" or FORCE_PRODUCTION_TESTS
PRODUCTION: bool = APP_MODE == "production"
STACKTRACE: bool = False
REMOVE_DATA_AT_INIT_TIME: bool = False

HOSTNAME: str = Env.get("HOSTNAME", "backend-server")
# hostnames as defined in backend.yml

MAIN_SERVER_NAME = "REST_API"
BACKEND_HOSTNAME = "backend-server"
FLOWER_HOSTNAME = "flower"
CELERYBEAT_HOSTNAME = "celery-beat"
CELERY_HOSTNAME = "celery"
DOCS = "docs-generation"


[docs] def get_host_type(HOSTNAME: str) -> str: if HOSTNAME == DOCS: return DOCS if HOSTNAME == BACKEND_HOSTNAME: return BACKEND_HOSTNAME if HOSTNAME == FLOWER_HOSTNAME: return FLOWER_HOSTNAME if HOSTNAME == CELERYBEAT_HOSTNAME: return CELERYBEAT_HOSTNAME # Celery has not a fixed hostname return CELERY_HOSTNAME
HOST_TYPE = get_host_type(HOSTNAME) DEFAULT_HOST = "127.0.0.1" DEFAULT_PORT = "8080" DATA_PATH: Path = Path(Env.get("DATA_PATH", "/uploads")) IMPORT_PATH: Path = Path(Env.get("DATA_IMPORT_FOLDER", "/imports")) CODE_DIR: Path = Path(Env.get("CODE_DIR", "/code")) APP_SECRETS = Path(Env.get("APP_SECRETS", "/secrets")) JWT_SECRET_FILE = APP_SECRETS.joinpath("jwt_secret.key") TOTP_SECRET_FILE = APP_SECRETS.joinpath("totp_secret.key") SSL_CERTIFICATE = "/etc/letsencrypt/real/fullchain1.pem" SSL_SECRET = "/etc/letsencrypt/real/privkey1.pem" DOMAIN = Env.get("DOMAIN", "") PROXIED_CONNECTION: bool = Env.get_bool("PROXIED_CONNECTION") MODELS_DIR = "models" CONF_PATH = Path("confs") # Also configured in controller EXTENDED_PROJECT_DISABLED = "no_extended_project" BACKEND_PACKAGE = "restapi" # package inside rapydo-http CUSTOM_PACKAGE = Env.get("PROJECT_NAME", "custom") EXTENDED_PACKAGE = Env.get("EXTENDED_PACKAGE", EXTENDED_PROJECT_DISABLED) SENTRY_URL = Env.get("SENTRY_URL", "").strip() or None ABS_RESTAPI_PATH = Path(__file__).resolve().parent GZIP_ENABLE = Env.get_bool("GZIP_COMPRESSION_ENABLE") GZIP_THRESHOLD = max(0, Env.get_int("GZIP_COMPRESSION_THRESHOLD")) GZIP_LEVEL = max(1, min(9, Env.get_int("GZIP_COMPRESSION_LEVEL")))
[docs] @lru_cache def get_project_configuration(key: str, default: str) -> str: return glom(mem.configuration, key, default=default)
[docs] @lru_cache def get_backend_url() -> str: BACKEND_URL = Env.get("BACKEND_URL", "") if BACKEND_URL: return BACKEND_URL BACKEND_PREFIX = Env.get("BACKEND_PREFIX", "").strip("/") if BACKEND_PREFIX: BACKEND_PREFIX = f"/{BACKEND_PREFIX}" if PRODUCTION: return f"https://{DOMAIN}{BACKEND_PREFIX}" port = Env.get("FLASK_PORT", "8080") return f"http://{DOMAIN}{BACKEND_PREFIX}:{port}"
[docs] @lru_cache def get_frontend_url() -> str: FRONTEND_URL = Env.get("FRONTEND_URL", "") if FRONTEND_URL: return FRONTEND_URL FRONTEND_PREFIX = Env.get("FRONTEND_PREFIX", "").strip("/") if FRONTEND_PREFIX: FRONTEND_PREFIX = f"/{FRONTEND_PREFIX}" protocol = "https" if PRODUCTION else "http" return f"{protocol}://{DOMAIN}{FRONTEND_PREFIX}"