feat: basic stats endpoint

This commit is contained in:
Vlad Stan 2024-11-21 11:27:47 +02:00
parent bbe877e087
commit 2bb0d40244
4 changed files with 49 additions and 3 deletions

View File

@ -2,6 +2,7 @@ from typing import Optional
from lnbits.core.db import db
from lnbits.core.models import AuditEntry, AuditFilters
from lnbits.core.models.audit import AuditCountStat
from lnbits.db import Connection, Filters, Page
@ -23,3 +24,25 @@ async def get_audit_entries(
filters=filters,
model=AuditEntry,
)
async def get_audit_stats(
filters: Optional[Filters[AuditFilters]] = None,
conn: Optional[Connection] = None,
) -> list[AuditCountStat]:
if not filters:
filters = Filters()
clause = filters.where()
request_methods = await (conn or db).fetchall(
query=f"""
SELECT request_method as field, count(request_method) as total
FROM audit
{clause}
GROUP BY request_method
ORDER BY total DESC
""",
values=filters.values(),
model=AuditCountStat,
)
return request_methods

View File

@ -46,3 +46,13 @@ class AuditFilters(FilterModel):
path: Optional[str] = None
request_method: Optional[str] = None
response_code: Optional[str] = None
class AuditCountStat(BaseModel):
field: str
total: int
class AuditStats(BaseModel):
request_method: list[AuditCountStat] = []
response_code: list[AuditCountStat] = []

View File

@ -31,7 +31,6 @@
label="Retention days"
hint="Number of days to keep the audit entry."
>
</q-input>
</div>
</div>

View File

@ -1,7 +1,8 @@
from fastapi import APIRouter, Depends
from lnbits.core.crud.audit import get_audit_entries
from lnbits.core.crud.audit import get_audit_entries, get_audit_stats
from lnbits.core.models import AuditEntry, AuditFilters
from lnbits.core.models.audit import AuditStats
from lnbits.db import Filters, Page
from lnbits.decorators import check_admin, parse_filters
from lnbits.helpers import generate_filter_params_openapi
@ -17,7 +18,20 @@ audit_router = APIRouter(
summary="Get paginated list audit entries",
openapi_extra=generate_filter_params_openapi(AuditFilters),
)
async def api_get_users(
async def api_get_audit(
filters: Filters = Depends(parse_filters(AuditFilters)),
) -> Page[AuditEntry]:
return await get_audit_entries(filters)
@audit_router.get(
"/stats",
name="Get audit entries",
summary="Get paginated list audit entries",
openapi_extra=generate_filter_params_openapi(AuditFilters),
)
async def api_get_audit_stats(
filters: Filters = Depends(parse_filters(AuditFilters)),
) -> AuditStats:
request_mothod_stats = await get_audit_stats(filters)
return AuditStats(request_method=request_mothod_stats)