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.db import db
from lnbits.core.models import AuditEntry, AuditFilters from lnbits.core.models import AuditEntry, AuditFilters
from lnbits.core.models.audit import AuditCountStat
from lnbits.db import Connection, Filters, Page from lnbits.db import Connection, Filters, Page
@ -23,3 +24,25 @@ async def get_audit_entries(
filters=filters, filters=filters,
model=AuditEntry, 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 path: Optional[str] = None
request_method: Optional[str] = None request_method: Optional[str] = None
response_code: 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" label="Retention days"
hint="Number of days to keep the audit entry." hint="Number of days to keep the audit entry."
> >
</q-input> </q-input>
</div> </div>
</div> </div>

View File

@ -1,7 +1,8 @@
from fastapi import APIRouter, Depends 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 import AuditEntry, AuditFilters
from lnbits.core.models.audit import AuditStats
from lnbits.db import Filters, Page from lnbits.db import Filters, Page
from lnbits.decorators import check_admin, parse_filters from lnbits.decorators import check_admin, parse_filters
from lnbits.helpers import generate_filter_params_openapi from lnbits.helpers import generate_filter_params_openapi
@ -17,7 +18,20 @@ audit_router = APIRouter(
summary="Get paginated list audit entries", summary="Get paginated list audit entries",
openapi_extra=generate_filter_params_openapi(AuditFilters), openapi_extra=generate_filter_params_openapi(AuditFilters),
) )
async def api_get_users( async def api_get_audit(
filters: Filters = Depends(parse_filters(AuditFilters)), filters: Filters = Depends(parse_filters(AuditFilters)),
) -> Page[AuditEntry]: ) -> Page[AuditEntry]:
return await get_audit_entries(filters) 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)