from fastapi import FastAPI from starlette.middleware.sessions import SessionMiddleware from app.core.settings import get_settings from app.core.middleware.context import ContextResolveMiddleware from app.core.middleware.domain_resolver import DomainResolverMiddleware from app.core.middleware.security_headers import SecurityHeadersMiddleware from app.core.startup import on_startup from app.core.api import api_router from app.ui.app import mount_ui def create_app() -> FastAPI: s = get_settings() app = FastAPI(title=s.APP_NAME, debug=s.DEBUG) app.add_middleware(SecurityHeadersMiddleware) app.add_middleware(ContextResolveMiddleware) # Phase 7T.2: added after context so it resolves the request host before # context-aware middleware/routes need tenant/branch/domain state. app.add_middleware(DomainResolverMiddleware) # SessionMiddleware is added last so it is available to downstream # middleware/routes in Starlette's middleware execution order. app.add_middleware( SessionMiddleware, secret_key=s.SECRET_KEY, session_cookie=s.COOKIE_SESSION_NAME, same_site=s.COOKIE_SAMESITE, https_only=s.COOKIE_SECURE, ) app.add_event_handler("startup", lambda: on_startup(app)) app.include_router(api_router, prefix="/api") mount_ui(app) return app app = create_app()