"""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)