From 88e97faddbf0e68f72dc73b777230b5892222a29 Mon Sep 17 00:00:00 2001 From: Conrad Date: Thu, 10 Oct 2024 23:34:45 +0200 Subject: [PATCH] feat: added select delete --- app/routes/entry.py | 41 +++++++++++++++++++++++++++++++++++++---- app/test_main.py | 21 +++++++++++++++++++++ 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/app/routes/entry.py b/app/routes/entry.py index a072917..18efac9 100644 --- a/app/routes/entry.py +++ b/app/routes/entry.py @@ -8,6 +8,7 @@ from fastapi import APIRouter, Depends, Security, HTTPException from sqlalchemy.orm import Session from sqlalchemy import select +from sqlalchemy import delete from app.services.auth import verify from app.schema.entry import LogIN, LogOUT from app.models.entry import LogEntry @@ -17,6 +18,8 @@ from pydantic.json_schema import SkipJsonSchema from fastapi_filters import FilterValues, create_filters from fastapi_filters.ext.sqlalchemy import apply_filters +from app.models.entry import LogType, TransactionType +from datetime import datetime router = APIRouter(prefix="/log", tags=["logging"]) @@ -62,10 +65,6 @@ async def get_log( return LogOUT.model_validate(obj) -from app.models.entry import LogType, TransactionType -from datetime import datetime - - @router.get("/") async def get_logs( search: str | SkipJsonSchema[None] = None, @@ -94,3 +93,37 @@ async def get_logs( LogEntry.message.ilike(f"%{search}%") | LogEntry.author.ilike(f"%{search}%") ) return paginate(db, order_by_query(the_select)) + + +@router.delete("/", status_code=200) +async def delete_logs( + application: UUID, + environment: str | SkipJsonSchema[None] = None, + l_type: LogType | SkipJsonSchema[None] = None, + t_type: TransactionType | SkipJsonSchema[None] = None, + object_reference: str | SkipJsonSchema[None] = None, + author: str | SkipJsonSchema[None] = None, + sub: str = Security(verify), + db: Session = Depends(get_db), +) -> int: + filters = { + "application": application, + "created_by_id": sub, + } + + if environment is not None: + filters["environment"] = environment + if l_type is not None: + filters["l_type"] = l_type + if t_type is not None: + filters["t_type"] = t_type + if object_reference is not None: + filters["object_reference"] = object_reference + if author is not None: + filters["author"] = author + + query = db.query(LogEntry).filter_by(**filters) + the_impact = query.count() + query.delete(synchronize_session=False) + db.commit() + return the_impact diff --git a/app/test_main.py b/app/test_main.py index 8fcf5cb..45d58fd 100644 --- a/app/test_main.py +++ b/app/test_main.py @@ -239,3 +239,24 @@ def test_logging_filter(self): re = self.c.get("/log/?application=" + app_id + "&environment=prod") assert re["total"] == 2 assert len(re["results"]) == 2 + + def test_logging_delete(self): + with log_examples(self) as app_id: + re = self.c.delete("/log/?application=" + str(app_id) + "&environment=prod", r_code=200) + assert re == 2 + + re = self.c.get("/log/?application=" + str(app_id) + "&environment=prod") + assert re["total"] == 0 + + re = self.c.get("/log/?application=" + str(app_id) + "&environment=dev") + assert re["total"] == 3 + + # clear complete application + re = self.c.get("/log/?application=" + str(app_id)) + assert re["total"] == 3 + + re = self.c.delete("/log/?application=" + str(app_id), r_code=200) + assert re == 3 + + re = self.c.get("/log/?application=" + str(app_id)) + assert re["total"] == 0