mirror of
https://github.com/creyD/apilog.git
synced 2026-04-12 19:30:29 +02:00
96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
from creyPY.fastapi.crud import (
|
|
create_obj_from_data,
|
|
)
|
|
from creyPY.fastapi.order_by import order_by
|
|
from typing import Callable
|
|
from sqlalchemy.sql.selectable import Select
|
|
from creyPY.fastapi.db.session import get_db
|
|
from fastapi import APIRouter, Depends, Security, HTTPException
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import select
|
|
from app.services.auth import verify
|
|
from app.schema.entry import LogIN, LogOUT
|
|
from app.models.entry import LogEntry
|
|
from fastapi_pagination.ext.sqlalchemy import paginate
|
|
from creyPY.fastapi.pagination import Page
|
|
from uuid import UUID
|
|
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.post("/", status_code=201)
|
|
async def create_log(
|
|
data: LogIN,
|
|
sub: str = Security(verify),
|
|
db: Session = Depends(get_db),
|
|
) -> LogOUT:
|
|
obj = create_obj_from_data(
|
|
data,
|
|
LogEntry,
|
|
db,
|
|
additonal_data={"created_by_id": sub},
|
|
)
|
|
return LogOUT.model_validate(obj)
|
|
|
|
|
|
@router.delete("/{log_id}", status_code=204)
|
|
async def delete_log(
|
|
log_id: UUID,
|
|
sub: str = Security(verify),
|
|
db: Session = Depends(get_db),
|
|
) -> None:
|
|
obj = db.query(LogEntry).filter_by(id=log_id, created_by_id=sub).one_or_none()
|
|
if obj is None:
|
|
raise HTTPException(status_code=404, detail="Item not found")
|
|
db.delete(obj)
|
|
db.commit()
|
|
return None
|
|
|
|
|
|
@router.get("/{log_id}")
|
|
async def get_log(
|
|
log_id: UUID,
|
|
sub: str = Security(verify),
|
|
db: Session = Depends(get_db),
|
|
) -> LogOUT:
|
|
obj = db.query(LogEntry).filter_by(id=log_id, created_by_id=sub).one_or_none()
|
|
if obj is None:
|
|
raise HTTPException(status_code=404, detail="Item not found")
|
|
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,
|
|
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),
|
|
db: Session = Depends(get_db),
|
|
) -> Page[LogOUT]:
|
|
"""
|
|
Filter logs of your systems. Searching works only for author and message. Use filters for the rest.
|
|
"""
|
|
the_select = apply_filters(select(LogEntry).filter(LogEntry.created_by_id == sub), filters)
|
|
if search:
|
|
the_select = the_select.filter(
|
|
LogEntry.message.ilike(f"%{search}%") | LogEntry.author.ilike(f"%{search}%")
|
|
)
|
|
return paginate(db, order_by_query(the_select))
|