Law/app/api/admin/quotes.py
2026-02-23 15:20:00 +03:00

56 lines
2.2 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.core.deps import require_role
from app.schemas.universal import UniversalQuery
from app.schemas.admin import QuoteUpsert
from app.models.quote import Quote
from app.services.universal_query import apply_universal_query
router = APIRouter()
@router.post("/query")
def query_quotes(uq: UniversalQuery, db: Session = Depends(get_db), admin=Depends(require_role("ADMIN"))):
q = apply_universal_query(db.query(Quote), Quote, uq)
total = q.count()
rows = q.offset(uq.page.offset).limit(uq.page.limit).all()
return {
"rows": [
{
"id": str(r.id),
"author": r.author,
"text": r.text,
"source": r.source,
"is_active": r.is_active,
"sort_order": r.sort_order,
"created_at": r.created_at.isoformat() if r.created_at else None,
}
for r in rows
],
"total": total,
}
@router.post("", status_code=201)
def create_quote(payload: QuoteUpsert, db: Session = Depends(get_db), admin=Depends(require_role("ADMIN"))):
responsible = str(admin.get("email") or "").strip() or "Администратор системы"
q = Quote(**payload.model_dump(), responsible=responsible)
db.add(q); db.commit(); db.refresh(q)
return {"id": str(q.id)}
@router.patch("/{id}")
def update_quote(id: str, payload: QuoteUpsert, db: Session = Depends(get_db), admin=Depends(require_role("ADMIN"))):
q = db.query(Quote).filter(Quote.id == id).first()
if not q:
raise HTTPException(status_code=404, detail="Цитата не найдена")
for k, v in payload.model_dump().items():
setattr(q, k, v)
db.add(q); db.commit()
return {"status": "обновлено"}
@router.delete("/{id}")
def delete_quote(id: str, db: Session = Depends(get_db), admin=Depends(require_role("ADMIN"))):
q = db.query(Quote).filter(Quote.id == id).first()
if not q:
raise HTTPException(status_code=404, detail="Цитата не найдена")
db.delete(q); db.commit()
return {"status": "удалено"}