diff options
Diffstat (limited to 'management/endpoints.py')
| -rw-r--r-- | management/endpoints.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/management/endpoints.py b/management/endpoints.py new file mode 100644 index 0000000..47602d6 --- /dev/null +++ b/management/endpoints.py | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | from fastapi import FastAPI, Request | ||
| 2 | from sqlalchemy import func | ||
| 3 | from sqlmodel import select | ||
| 4 | from starlette.authentication import requires | ||
| 5 | from starlette.middleware.authentication import AuthenticationMiddleware | ||
| 6 | from starlette.middleware.sessions import SessionMiddleware | ||
| 7 | from starlette.responses import RedirectResponse | ||
| 8 | from starlette.templating import Jinja2Templates | ||
| 9 | |||
| 10 | import conf | ||
| 11 | from authentication.backend import SessionAuthBackend | ||
| 12 | from db.models import User | ||
| 13 | from db.session import get_session_context | ||
| 14 | |||
| 15 | management = FastAPI() | ||
| 16 | management.add_middleware(AuthenticationMiddleware, backend=SessionAuthBackend()) | ||
| 17 | management.add_middleware(SessionMiddleware, secret_key=conf.SECRET_KEY) | ||
| 18 | |||
| 19 | templates = Jinja2Templates(directory=[ | ||
| 20 | 'templates', | ||
| 21 | 'management/templates' | ||
| 22 | ]) | ||
| 23 | |||
| 24 | @management.get('/') | ||
| 25 | async def index(request: Request): | ||
| 26 | with get_session_context() as session: | ||
| 27 | query = select(func.count(User.id)) | ||
| 28 | user_count = session.exec(query) | ||
| 29 | |||
| 30 | if user_count.first() == 0: | ||
| 31 | return RedirectResponse('/auth/register/?next=/management/dashboard/', status_code=303) | ||
| 32 | |||
| 33 | return RedirectResponse('/management/dashboard/', status_code=303) | ||
| 34 | |||
| 35 | |||
| 36 | @management.get('/dashboard/') | ||
| 37 | @requires(['authenticated', 'session'], redirect='get_login') | ||
| 38 | async def dashboard(request: Request): | ||
| 39 | return templates.TemplateResponse(request, 'dashboard.html') | ||
| 40 | |||
| 41 | @management.get('/users/') | ||
| 42 | @requires(['authenticated', 'session'], redirect='get_login') | ||
| 43 | async def users(request: Request): | ||
| 44 | with get_session_context() as session: | ||
| 45 | query = select(User) | ||
| 46 | users = session.exec(query).all() | ||
| 47 | |||
| 48 | return templates.TemplateResponse(request, 'users.html', context={ | ||
| 49 | 'users': users | ||
| 50 | }) | ||
