from fastapi import FastAPI, Request, Depends, Form, HTTPException from fastapi.responses import RedirectResponse, HTMLResponse from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from starlette.middleware.sessions import SessionMiddleware from db.models import Base, engine, get_db, User from auth.session import get_current_user from auth import oidc import uvicorn from sqlalchemy.orm import Session ADMIN_GROUP = "Fachschaft Admins" app = FastAPI() app.add_middleware(SessionMiddleware, secret_key="my_secret_key") app.include_router(oidc.router) app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="templates") # DB Base.metadata.create_all(bind=engine) @app.get("/", response_class=HTMLResponse) def home(request: Request, user: User = Depends(get_current_user), db: Session = Depends(get_db)): if not user: return RedirectResponse(url="/login", status_code=303) db_user = db.query(User).filter_by(username=user["preferred_username"]).first() if not db_user: raise HTTPException(status_code=404, detail="User nicht gefunden") users = None if ADMIN_GROUP in user["groups"]: users = db.query(User).all() return templates.TemplateResponse("index.html", {"request": request, "user": user, "users": users, "db_user": db_user}) @app.get("/login", response_class=HTMLResponse) def login_form(request: Request): return templates.TemplateResponse("login.html", {"request": request}) @app.post("/set_money") def set_money(request: Request, username: str = Form(...), money: float = Form(...), db: Session = Depends(get_db), user: User = Depends(get_current_user)): if not user or ADMIN_GROUP not in user["groups"]: raise HTTPException(status_code=403, detail="Nicht erlaubt") db_user = db.query(User).filter_by(username=username).first() if not db_user: raise HTTPException(status_code=404, detail="User nicht gefunden") db_user.money = money*100 db.commit() return RedirectResponse(url="/", status_code=303) @app.post("/drink") def drink(request: Request, db: Session = Depends(get_db), user: User = Depends(get_current_user)): if not user or ADMIN_GROUP not in user["groups"]: raise HTTPException(status_code=403, detail="Nicht erlaubt") db_user = db.query(User).filter_by(username=user["preferred_username"]).first() if not db_user: raise HTTPException(status_code=404, detail="User nicht gefunden") db_user.money -= 100 db.commit() return RedirectResponse(url="/", status_code=303) @app.post("/payup") def payup(request: Request, username: str = Form(...), money: float = Form(...), db: Session = Depends(get_db), user: User = Depends(get_current_user)): if not user or ADMIN_GROUP not in user["groups"]: raise HTTPException(status_code=403, detail="Nicht erlaubt") db_user = db.query(User).filter_by(username=username).first() if not db_user: raise HTTPException(status_code=404, detail="User nicht gefunden") db_user.money += money*100 current_user = db.query(User).filter_by(username=user["preferred_username"]).first() if not current_user: raise HTTPException(status_code=404, detail="Aktueller User nicht gefunden") current_user.money -= money*100 db.commit() return RedirectResponse(url="/", status_code=303) if __name__ == "__main__": uvicorn.run(app, host="0.0.0.0", port=8000)