89 lines
2.2 KiB
Python

"""
Routes API pour la gestion des logs.
"""
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import delete
from app.core.dependencies import get_db, verify_api_key
from app.crud.log import LogRepository
from app.services import ws_manager
router = APIRouter()
@router.get("")
async def get_logs(
limit: int = 50,
offset: int = 0,
level: Optional[str] = None,
source: Optional[str] = None,
api_key_valid: bool = Depends(verify_api_key),
db_session: AsyncSession = Depends(get_db),
):
"""Récupère les logs récents avec filtrage optionnel."""
repo = LogRepository(db_session)
logs = await repo.list(limit=limit, offset=offset, level=level, source=source)
return [
{
"id": log.id,
"timestamp": log.created_at,
"level": log.level,
"message": log.message,
"source": log.source,
"host": log.host_id,
}
for log in logs
]
@router.post("")
async def create_log(
level: str,
message: str,
source: Optional[str] = None,
host_id: Optional[str] = None,
api_key_valid: bool = Depends(verify_api_key),
db_session: AsyncSession = Depends(get_db),
):
"""Ajoute une nouvelle entrée de log."""
repo = LogRepository(db_session)
log = await repo.create(
level=level.upper(),
message=message,
source=source,
host_id=host_id,
)
await db_session.commit()
response_data = {
"id": log.id,
"timestamp": log.created_at,
"level": log.level,
"message": log.message,
"source": log.source,
"host": log.host_id,
}
await ws_manager.broadcast({
"type": "new_log",
"data": response_data
})
return response_data
@router.delete("")
async def clear_logs(
api_key_valid: bool = Depends(verify_api_key),
db_session: AsyncSession = Depends(get_db),
):
"""Efface tous les logs (attention: opération destructive)."""
from app.models.log import Log as LogModel
await db_session.execute(delete(LogModel))
await db_session.commit()
return {"message": "Tous les logs ont été supprimés"}