Add filters in statistics view
This commit is contained in:
@@ -1,21 +1,45 @@
|
||||
from fastapi import APIRouter, Depends
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from core.database import GateAccessLog, get_db
|
||||
from core.dependencies import require_manager
|
||||
from core.schemas import AccessLogResponse
|
||||
from core.schemas import StatsPage
|
||||
|
||||
router = APIRouter(prefix="/api/admin/stats", tags=["admin-stats"])
|
||||
|
||||
|
||||
@router.get("", response_model=list[AccessLogResponse])
|
||||
@router.get("", response_model=StatsPage)
|
||||
async def get_stats(
|
||||
db: Session = Depends(get_db),
|
||||
_: dict = Depends(require_manager),
|
||||
gate_id: Optional[int] = Query(None),
|
||||
keypass_code: Optional[str] = Query(None),
|
||||
success: Optional[bool] = Query(None),
|
||||
date_from: Optional[datetime] = Query(None),
|
||||
date_to: Optional[datetime] = Query(None),
|
||||
page: int = Query(1, ge=1),
|
||||
page_size: int = Query(50, ge=1, le=200),
|
||||
):
|
||||
return (
|
||||
db.query(GateAccessLog)
|
||||
.order_by(GateAccessLog.timestamp.desc())
|
||||
.limit(500)
|
||||
q = db.query(GateAccessLog)
|
||||
if gate_id is not None:
|
||||
q = q.filter(GateAccessLog.gate_id == gate_id)
|
||||
if keypass_code:
|
||||
q = q.filter(GateAccessLog.keypass_code.ilike(f"%{keypass_code}%"))
|
||||
if success is not None:
|
||||
q = q.filter(GateAccessLog.success == success)
|
||||
if date_from is not None:
|
||||
q = q.filter(GateAccessLog.timestamp >= date_from)
|
||||
if date_to is not None:
|
||||
q = q.filter(GateAccessLog.timestamp <= date_to)
|
||||
|
||||
total = q.count()
|
||||
items = (
|
||||
q.order_by(GateAccessLog.timestamp.desc())
|
||||
.offset((page - 1) * page_size)
|
||||
.limit(page_size)
|
||||
.all()
|
||||
)
|
||||
return StatsPage(total=total, page=page, page_size=page_size, items=items)
|
||||
|
||||
Reference in New Issue
Block a user