feat: added filters for logs

This commit is contained in:
2024-10-10 17:33:24 +02:00
parent 1a8e6e849e
commit 44e5448625
3 changed files with 68 additions and 7 deletions

View File

@@ -2,7 +2,7 @@ from creyPY.fastapi.crud import (
create_obj_from_data, create_obj_from_data,
) )
from creyPY.fastapi.order_by import order_by from creyPY.fastapi.order_by import order_by
from typing import Any, Callable from typing import Callable
from sqlalchemy.sql.selectable import Select from sqlalchemy.sql.selectable import Select
from creyPY.fastapi.db.session import get_db from creyPY.fastapi.db.session import get_db
from fastapi import APIRouter, Depends, Security, HTTPException from fastapi import APIRouter, Depends, Security, HTTPException
@@ -15,6 +15,8 @@ from fastapi_pagination.ext.sqlalchemy import paginate
from creyPY.fastapi.pagination import Page from creyPY.fastapi.pagination import Page
from uuid import UUID from uuid import UUID
from pydantic.json_schema import SkipJsonSchema from pydantic.json_schema import SkipJsonSchema
from fastapi_filters import FilterValues, create_filters
from fastapi_filters.ext.sqlalchemy import apply_filters
router = APIRouter(prefix="/log", tags=["logging"]) router = APIRouter(prefix="/log", tags=["logging"])
@@ -60,19 +62,32 @@ async def get_log(
return LogOUT.model_validate(obj) return LogOUT.model_validate(obj)
from app.models.entry import LogType, TransactionType
from datetime import datetime
@router.get("/") @router.get("/")
async def get_logs( async def get_logs(
search: str | SkipJsonSchema[None] = None, search: str | SkipJsonSchema[None] = None,
order_by_query: Callable[[Select], Select] = Depends(order_by), order_by_query: Callable[[Select], Select] = Depends(order_by),
filters: FilterValues = Depends(
create_filters(
created_by_id=str,
l_type=LogType,
t_type=TransactionType,
application=UUID,
object_reference=str,
author=str,
created_at=datetime,
)
),
sub: str = Security(verify), sub: str = Security(verify),
db: Session = Depends(get_db), db: Session = Depends(get_db),
) -> Page[LogOUT]: ) -> Page[LogOUT]:
""" """
Filter logs of your systems. Searching works only for author and message. Use filters for the rest. Filter logs of your systems. Searching works only for author and message. Use filters for the rest.
""" """
# add filters the_select = apply_filters(select(LogEntry).filter(LogEntry.created_by_id == sub), filters)
# add sorting
the_select = select(LogEntry).filter(LogEntry.created_by_id == sub)
if search: if search:
the_select = the_select.filter( the_select = the_select.filter(
LogEntry.message.ilike(f"%{search}%") | LogEntry.author.ilike(f"%{search}%") LogEntry.message.ilike(f"%{search}%") | LogEntry.author.ilike(f"%{search}%")

View File

@@ -41,7 +41,7 @@ def log_examples(self):
"object_reference": "1", "object_reference": "1",
"previous_object": {"name": "Unit 1"}, "previous_object": {"name": "Unit 1"},
}, },
{"l_type": "info", "t_type": "delete", "message": "User Max Mustermann deleted"}, {"l_type": "warning", "t_type": "delete", "message": "User Max Mustermann deleted"},
] ]
with app_context(self) as app_id: with app_context(self) as app_id:
for entry in LOG_EXAMPLES: for entry in LOG_EXAMPLES:
@@ -165,5 +165,49 @@ class TestAPI:
assert len(re["results"]) == 5 assert len(re["results"]) == 5
assert re["results"][0]["created_at"] > re["results"][1]["created_at"] assert re["results"][0]["created_at"] > re["results"][1]["created_at"]
# def test_logging_filter(self): def test_logging_filter(self):
# pass with log_examples(self) as app_id:
# API KEY
re = self.c.get("/log/?created_by_id=" + CURRENT_USER)
assert re["total"] == 5
assert len(re["results"]) == 5
# LogType
re = self.c.get("/log/?l_type=info")
assert re["total"] == 4
assert len(re["results"]) == 4
# TransactionType
re = self.c.get("/log/?t_type=create")
assert re["total"] == 2
assert len(re["results"]) == 2
# TransactipnType create and update
re = self.c.get("/log/?t_type%5Bin%5D=create,update")
assert re["total"] == 4
assert len(re["results"]) == 4
# Application
re = self.c.get("/log/?application=" + app_id)
assert re["total"] == 5
assert len(re["results"]) == 5
# Application not
re = self.c.get("/log/?application%5Bne%5D=" + app_id)
assert re["total"] == 0
assert len(re["results"]) == 0
# Object Reference
re = self.c.get("/log/?object_reference=1")
assert re["total"] == 2
assert len(re["results"]) == 2
# author
re = self.c.get("/log/?author=auth|max_muster")
assert re["total"] == 2
assert len(re["results"]) == 2
# not author
re = self.c.get("/log/?author%5Bne%5D=auth|max_muster")
assert re["total"] == 3
assert len(re["results"]) == 3

View File

@@ -32,3 +32,5 @@ iniconfig==2.0.0 # pytest
packaging==24.1 # pytest packaging==24.1 # pytest
pluggy==1.5.0 # pytest pluggy==1.5.0 # pytest
pytest==8.3.3 # pytest pytest==8.3.3 # pytest
fastapi-filters==0.2.9 # Filters