diff --git a/core/scripts/webpanel/app.py b/core/scripts/webpanel/app.py index a956359..cdd0e11 100644 --- a/core/scripts/webpanel/app.py +++ b/core/scripts/webpanel/app.py @@ -1,63 +1,65 @@ #!/usr/bin/env python3 import sys -import os -import secrets -from fastapi import FastAPI -from fastapi.templating import Jinja2Templates +from fastapi import FastAPI, Depends from fastapi import Request -from starlette.middleware.sessions import SessionMiddleware from starlette.staticfiles import StaticFiles +from fastapi.templating import Jinja2Templates + + +from config import CONFIGS # Loads the configuration from .env +from authentication.auth import AuthMiddleware # Defines authentication middleware +from dependency import get_templates, get_session_manager # Defines dependencies across routers +from exception_handler import setup_exception_handler # Defines exception handlers # Append directory of cli_api.py to be able to import it HYSTERIA_CORE_DIR = '/etc/hysteria/core/' sys.path.append(HYSTERIA_CORE_DIR) import routers # noqa: This import should be after the sys.path modification, because it imports cli_api -import cli_api # noqa - -# region Setup App -app = FastAPI(debug=True) -secret_key = os.getenv("SESSION_SECRET_KEY", secrets.token_urlsafe(32)) - -app.mount('/assets', StaticFiles(directory='assets'), name='assets') -templates = Jinja2Templates(directory='templates') - -app.add_middleware(SessionMiddleware, secret_key=secret_key) - -# endregion -# region Routers +def create_app() -> FastAPI: + ''' + Create FastAPI app. + ''' -# Add API version 1 router -app.include_router(routers.api.v1.api_v1_router, prefix='/api/v1', tags=['v1']) # Add API version 1 router -# Add user router -app.include_router(routers.user.router, prefix='/users', tags=['users']) + # Set up FastAPI + app = FastAPI( + title='Hysteria Webpanel', + description='Webpanel for Hysteria', + version='0.1.0', + debug=CONFIGS.DEBUG + ) -# Add basic routes + # Set up static files + app.mount('/assets', StaticFiles(directory='assets'), name='assets') + + # Set up exception handlers + setup_exception_handler(app) + + # Set up authentication middleware + app.add_middleware(AuthMiddleware, session_manager=get_session_manager(), api_token=CONFIGS.API_TOKEN) + + # Set up Routers + app.include_router(routers.login.router, prefix='', tags=['authentication']) # Add authentication router + app.include_router(routers.user.router, prefix='/users', tags=['users']) # Add user router + app.include_router(routers.api.v1.api_v1_router, prefix='/api/v1', tags=['v1']) # Add API version 1 router + + return app -@app.get('/login') -async def login(request: Request): - return templates.TemplateResponse('login.html', {'request': request}) +app: FastAPI = create_app() -@app.get('/logout') -async def logout(request: Request): - pass +@app.get('/') +async def index(request: Request, templates: Jinja2Templates = Depends(get_templates)): + return templates.TemplateResponse('index.html', {'request': request}) -@ app.get('/') -async def index(request: Request): - users = cli_api.list_users() - return templates.TemplateResponse('index.html', {'request': request, 'users': users}) - - -@ app.get('/home') +@app.get('/home') async def home(request: Request): return await index(request) -# endregion if __name__ == '__main__':