openvpn-endpoint-server/server/app/web/applications.py

157 lines
5.0 KiB
Python

"""Application template management web routes (Super Admin only)."""
from fastapi import APIRouter, Request, Depends, Form
from fastapi.responses import HTMLResponse, RedirectResponse
from sqlalchemy.orm import Session
from ..database import get_db
from ..models.user import User
from ..models.endpoint import ApplicationTemplate, Protocol
from .deps import require_super_admin_web, flash, get_flashed_messages
router = APIRouter()
@router.get("/applications", response_class=HTMLResponse)
async def list_applications(
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(require_super_admin_web)
):
"""List all application templates."""
applications = db.query(ApplicationTemplate).order_by(ApplicationTemplate.name).all()
return request.app.state.templates.TemplateResponse(
"applications/list.html",
{
"request": request,
"current_user": current_user,
"applications": applications,
"flash_messages": get_flashed_messages(request)
}
)
@router.get("/applications/new", response_class=HTMLResponse)
async def new_application_form(
request: Request,
db: Session = Depends(get_db),
current_user: User = Depends(require_super_admin_web)
):
"""New application template form."""
return request.app.state.templates.TemplateResponse(
"applications/form.html",
{
"request": request,
"current_user": current_user,
"application": None,
"flash_messages": get_flashed_messages(request)
}
)
@router.post("/applications/new")
async def create_application(
request: Request,
name: str = Form(...),
default_port: int = Form(...),
protocol: str = Form("tcp"),
description: str = Form(None),
icon: str = Form(None),
db: Session = Depends(get_db),
current_user: User = Depends(require_super_admin_web)
):
"""Create new application template."""
# Check if name exists
existing = db.query(ApplicationTemplate).filter(ApplicationTemplate.name == name).first()
if existing:
flash(request, "Anwendungsname bereits vergeben", "danger")
return RedirectResponse(url="/applications/new", status_code=303)
application = ApplicationTemplate(
name=name,
default_port=default_port,
protocol=Protocol(protocol),
description=description or None,
icon=icon or None
)
db.add(application)
db.commit()
flash(request, f"Anwendung '{name}' erstellt", "success")
return RedirectResponse(url="/applications", status_code=303)
@router.get("/applications/{app_id}/edit", response_class=HTMLResponse)
async def edit_application_form(
request: Request,
app_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(require_super_admin_web)
):
"""Edit application template form."""
application = db.query(ApplicationTemplate).filter(ApplicationTemplate.id == app_id).first()
if not application:
flash(request, "Anwendung nicht gefunden", "danger")
return RedirectResponse(url="/applications", status_code=303)
return request.app.state.templates.TemplateResponse(
"applications/form.html",
{
"request": request,
"current_user": current_user,
"application": application,
"flash_messages": get_flashed_messages(request)
}
)
@router.post("/applications/{app_id}/edit")
async def update_application(
request: Request,
app_id: int,
name: str = Form(...),
default_port: int = Form(...),
protocol: str = Form("tcp"),
description: str = Form(None),
icon: str = Form(None),
db: Session = Depends(get_db),
current_user: User = Depends(require_super_admin_web)
):
"""Update application template."""
application = db.query(ApplicationTemplate).filter(ApplicationTemplate.id == app_id).first()
if not application:
flash(request, "Anwendung nicht gefunden", "danger")
return RedirectResponse(url="/applications", status_code=303)
application.name = name
application.default_port = default_port
application.protocol = Protocol(protocol)
application.description = description or None
application.icon = icon or None
db.commit()
flash(request, "Anwendung aktualisiert", "success")
return RedirectResponse(url="/applications", status_code=303)
@router.post("/applications/{app_id}/delete")
async def delete_application(
request: Request,
app_id: int,
db: Session = Depends(get_db),
current_user: User = Depends(require_super_admin_web)
):
"""Delete application template."""
application = db.query(ApplicationTemplate).filter(ApplicationTemplate.id == app_id).first()
if not application:
flash(request, "Anwendung nicht gefunden", "danger")
return RedirectResponse(url="/applications", status_code=303)
db.delete(application)
db.commit()
flash(request, f"Anwendung '{application.name}' gelöscht", "warning")
return RedirectResponse(url="/applications", status_code=303)