summaryrefslogtreecommitdiffstats
path: root/management
diff options
context:
space:
mode:
authorGravatar Tom van der Lee <tom@vanderlee.io>2026-07-22 17:37:10 +0200
committerGravatar Tom van der Lee <tom@vanderlee.io>2026-07-22 17:37:10 +0200
commitf28781dd1dd718f45bf1cef82d1ce6eb4792b4ca (patch)
treeed5bd923bca11cc75e0568245ea3518a6713041b /management
parent498c79f434856aa68e9a883247ea69a22256fce6 (diff)
downloadserver-f28781dd1dd718f45bf1cef82d1ce6eb4792b4ca.tar.gz
server-f28781dd1dd718f45bf1cef82d1ce6eb4792b4ca.tar.bz2
server-f28781dd1dd718f45bf1cef82d1ce6eb4792b4ca.zip
Added management interface
Diffstat (limited to 'management')
-rw-r--r--management/__init__.py0
-rw-r--r--management/endpoints.py50
-rw-r--r--management/templates/base.html7
-rw-r--r--management/templates/dashboard.html9
-rw-r--r--management/templates/users.html11
5 files changed, 77 insertions, 0 deletions
diff --git a/management/__init__.py b/management/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/management/__init__.py
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 @@
1from fastapi import FastAPI, Request
2from sqlalchemy import func
3from sqlmodel import select
4from starlette.authentication import requires
5from starlette.middleware.authentication import AuthenticationMiddleware
6from starlette.middleware.sessions import SessionMiddleware
7from starlette.responses import RedirectResponse
8from starlette.templating import Jinja2Templates
9
10import conf
11from authentication.backend import SessionAuthBackend
12from db.models import User
13from db.session import get_session_context
14
15management = FastAPI()
16management.add_middleware(AuthenticationMiddleware, backend=SessionAuthBackend())
17management.add_middleware(SessionMiddleware, secret_key=conf.SECRET_KEY)
18
19templates = Jinja2Templates(directory=[
20 'templates',
21 'management/templates'
22])
23
24@management.get('/')
25async 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')
38async def dashboard(request: Request):
39 return templates.TemplateResponse(request, 'dashboard.html')
40
41@management.get('/users/')
42@requires(['authenticated', 'session'], redirect='get_login')
43async 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 })
diff --git a/management/templates/base.html b/management/templates/base.html
new file mode 100644
index 0000000..0b9da11
--- /dev/null
+++ b/management/templates/base.html
@@ -0,0 +1,7 @@
1{% extends 'global.html' %}
2{% block template %}
3 <nav>
4 <a href="/auth/logout/">Logout</a>
5 </nav>
6 {% block content %}{% endblock %}
7{% endblock %}
diff --git a/management/templates/dashboard.html b/management/templates/dashboard.html
new file mode 100644
index 0000000..201aa48
--- /dev/null
+++ b/management/templates/dashboard.html
@@ -0,0 +1,9 @@
1{% extends 'base.html' %}
2
3{% block content %}
4<div>
5 <ul>
6 <li><a href="/management/users/">Users</a></li>
7 </ul>
8</div>
9{% endblock %}
diff --git a/management/templates/users.html b/management/templates/users.html
new file mode 100644
index 0000000..272d2b4
--- /dev/null
+++ b/management/templates/users.html
@@ -0,0 +1,11 @@
1{% extends 'base.html' %}
2
3{% block content %}
4<div>
5 <ul>
6 {% for user in users %}
7 <li>{{ user.username }}</li>
8 {% endfor %}
9 </ul>
10</div>
11{% endblock %}