import os from dotenv import load_dotenv from fastapi import APIRouter, FastAPI from fastapi.middleware.cors import CORSMiddleware from fastapi.staticfiles import StaticFiles from starlette.middleware.authentication import AuthenticationMiddleware load_dotenv() from app.routers import ( auth_v1, chargepoint_v1, id_token_v1, me_v1, meter_value_v1, ocpp_v1, transaction_v1, user_v1 ) from app.security.websocket_auth_backend import BasicAuthBackend def create_app(): # Common app config title="LibreCharge" version="0.2.0" summary="Simple implementation of a basic OCPP 2.0.1 compliant central system (backend) for EV charging stations" responses={404: {"description": "Not found"}} # Root FastAPI app root_app = FastAPI( title=title, version=version, summary=summary, responses=responses, docs_url=None, redoc_url=None, ) # FastAPI app for OCPP handler ocpp_app = FastAPI( title=title, version=version, summary=summary, responses=responses, docs_url=None, redoc_url=None, ) ocpp_app.include_router(ocpp_v1.router) ocpp_app.add_middleware(AuthenticationMiddleware, backend=BasicAuthBackend()) root_app.mount(path="/v1/ocpp", app=ocpp_app) # FastAPI app for REST API api_app = FastAPI( title=title, version=version, summary=summary, responses=responses, ) api_v1_router = APIRouter( prefix="/v1" ) api_v1_router.include_router(auth_v1.router) api_v1_router.include_router(chargepoint_v1.router) api_v1_router.include_router(id_token_v1.router) api_v1_router.include_router(me_v1.router) api_v1_router.include_router(user_v1.router) api_v1_router.include_router(meter_value_v1.router) api_v1_router.include_router(transaction_v1.router) api_app.include_router(api_v1_router) root_app.mount(path="/api", app=api_app) # Serve static files if existent if os.path.isdir('static'): static_files = StaticFiles(directory="static", html=True) root_app.mount(path="/", app=static_files) return root_app app = create_app()