start
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response, status
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ...core.db import get_db
|
||||
from ...models.alert import Alert
|
||||
from ...models.user import User
|
||||
from ...schemas.alert import AlertOut
|
||||
from ..deps import get_current_user, require_role
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("", response_model=list[AlertOut])
|
||||
def list_alerts(
|
||||
only_unack: bool = False,
|
||||
limit: int = 200,
|
||||
db: Session = Depends(get_db),
|
||||
_: User = Depends(get_current_user),
|
||||
) -> list[Alert]:
|
||||
q = db.query(Alert)
|
||||
if only_unack:
|
||||
q = q.filter(Alert.acknowledged.is_(False))
|
||||
return q.order_by(Alert.created_at.desc()).limit(limit).all()
|
||||
|
||||
|
||||
@router.get("/unread-count")
|
||||
def unread_count(
|
||||
db: Session = Depends(get_db),
|
||||
_: User = Depends(get_current_user),
|
||||
) -> dict[str, int]:
|
||||
n = db.query(Alert).filter(Alert.acknowledged.is_(False)).count()
|
||||
return {"count": n}
|
||||
|
||||
|
||||
@router.post("/{alert_id}/ack", response_model=AlertOut)
|
||||
def acknowledge(
|
||||
alert_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
_: User = Depends(get_current_user),
|
||||
) -> Alert:
|
||||
a = db.get(Alert, alert_id)
|
||||
if not a:
|
||||
raise HTTPException(status.HTTP_404_NOT_FOUND, "alert not found")
|
||||
a.acknowledged = True
|
||||
db.commit()
|
||||
db.refresh(a)
|
||||
return a
|
||||
|
||||
|
||||
@router.post("/ack-all")
|
||||
def acknowledge_all(
|
||||
db: Session = Depends(get_db),
|
||||
_: User = Depends(get_current_user),
|
||||
) -> dict[str, int]:
|
||||
n = db.query(Alert).filter(Alert.acknowledged.is_(False)).update({"acknowledged": True})
|
||||
db.commit()
|
||||
return {"updated": n}
|
||||
|
||||
|
||||
@router.delete("/{alert_id}", status_code=status.HTTP_204_NO_CONTENT, response_class=Response)
|
||||
def delete_alert(
|
||||
alert_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
_: User = Depends(require_role("admin")),
|
||||
) -> Response:
|
||||
a = db.get(Alert, alert_id)
|
||||
if not a:
|
||||
raise HTTPException(status.HTTP_404_NOT_FOUND, "alert not found")
|
||||
db.delete(a)
|
||||
db.commit()
|
||||
return Response(status_code=status.HTTP_204_NO_CONTENT)
|
||||
|
||||
|
||||
@router.delete("")
|
||||
def purge_alerts(
|
||||
only_acked: bool = False,
|
||||
db: Session = Depends(get_db),
|
||||
_: User = Depends(require_role("admin")),
|
||||
) -> dict:
|
||||
"""Очистить лог алертов. По умолчанию удаляет всё; only_acked=true — только прочитанные."""
|
||||
q = db.query(Alert)
|
||||
if only_acked:
|
||||
q = q.filter(Alert.acknowledged == True) # noqa: E712
|
||||
n = q.delete(synchronize_session=False)
|
||||
db.commit()
|
||||
return {"deleted": int(n or 0)}
|
||||
Reference in New Issue
Block a user