"""App entrypoint.""" import logging from fastapi import FastAPI, Request from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from starlette.exceptions import HTTPException from starlette.middleware.sessions import SessionMiddleware from members_lumbung_space.config import ( APP_LOG_LEVEL, APP_SECRET_KEY, APP_THEME, STATIC_DIR, TEMPLATE_DIR, ) from members_lumbung_space.exceptions import RequiresLoginException from members_lumbung_space.keycloak import init_keycloak from members_lumbung_space.nextcloud import init_resource_map from members_lumbung_space.oidc import init_oidc from members_lumbung_space.redis import Redis, init_redis from members_lumbung_space.routes import ( health, invite, oidc, register, resource, root, ) log = logging.getLogger("uvicorn") log.setLevel(APP_LOG_LEVEL) app = FastAPI(docs_url=None, redoc_url=None) @app.exception_handler(RequiresLoginException) async def requires_login(request, exception): return RedirectResponse(request.url_for("login")) @app.exception_handler(HTTPException) async def http_exception_handler(request, exc): home = request.url_for("login") return HTMLResponse(f"

{exc.detail} (home)

") @app.on_event("startup") async def startup_event(): await init_redis(app) log.info("Initialised redis connection") @app.on_event("shutdown") async def shutdown_event(): await app.state.redis.close() app.add_middleware(SessionMiddleware, secret_key=APP_SECRET_KEY) app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") app.state.oidc = init_oidc() log.info("Initialised OpenID Connect client (for Keycloak logins)") app.state.keycloak = init_keycloak() log.info("Initialised Keycloak admin client (for Keycloak REST API)") app.state.templates = Jinja2Templates(directory=TEMPLATE_DIR) app.state.theme = APP_THEME app.state.log = log app.include_router(invite.router) app.include_router(oidc.router) app.include_router(register.router) app.include_router(root.router) app.include_router(health.router) app.include_router(resource.router)