elmeg-demo/backend/routers/moderation.py

83 lines
2.8 KiB
Python

from typing import List
from fastapi import APIRouter, Depends, HTTPException
from sqlmodel import Session, select
from database import get_session
from models import Report, User, PerformanceNickname
from schemas import ReportCreate, ReportRead, PerformanceNicknameRead
from auth import get_current_user
from dependencies import RoleChecker
router = APIRouter(prefix="/moderation", tags=["moderation"])
allow_moderator = RoleChecker(["moderator", "admin"])
@router.post("/reports", response_model=ReportRead)
def create_report(
report: ReportCreate,
session: Session = Depends(get_session),
current_user: User = Depends(get_current_user)
):
db_report = Report.model_validate(report)
db_report.user_id = current_user.id
session.add(db_report)
session.commit()
session.refresh(db_report)
return db_report
@router.get("/queue/nicknames", response_model=List[PerformanceNicknameRead], dependencies=[Depends(allow_moderator)])
def get_pending_nicknames(session: Session = Depends(get_session)):
nicknames = session.exec(
select(PerformanceNickname).where(PerformanceNickname.status == "pending")
).all()
return nicknames
@router.put("/nicknames/{nickname_id}/{action}", response_model=PerformanceNicknameRead, dependencies=[Depends(allow_moderator)])
def moderate_nickname(
nickname_id: int,
action: str, # approve, reject
session: Session = Depends(get_session)
):
nickname = session.get(PerformanceNickname, nickname_id)
if not nickname:
raise HTTPException(status_code=404, detail="Nickname not found")
if action == "approve":
nickname.status = "approved"
elif action == "reject":
nickname.status = "rejected"
else:
raise HTTPException(status_code=400, detail="Invalid action")
session.add(nickname)
session.commit()
session.refresh(nickname)
return nickname
@router.get("/queue/reports", response_model=List[ReportRead], dependencies=[Depends(allow_moderator)])
def get_pending_reports(session: Session = Depends(get_session)):
reports = session.exec(
select(Report).where(Report.status == "pending")
).all()
return reports
@router.put("/reports/{report_id}/{action}", response_model=ReportRead, dependencies=[Depends(allow_moderator)])
def moderate_report(
report_id: int,
action: str, # resolve, dismiss
session: Session = Depends(get_session)
):
report = session.get(Report, report_id)
if not report:
raise HTTPException(status_code=404, detail="Report not found")
if action == "resolve":
report.status = "resolved"
elif action == "dismiss":
report.status = "dismissed"
else:
raise HTTPException(status_code=400, detail="Invalid action")
session.add(report)
session.commit()
session.refresh(report)
return report