mirror of
https://github.com/TronoSfera/Law.git
synced 2026-05-18 18:13:46 +03:00
56 lines
2.2 KiB
Python
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": "удалено"}
|