89 lines
2.2 KiB
Python
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"}
|