78 lines
1.9 KiB
Python
78 lines
1.9 KiB
Python
"""Repositorio para gestionar eventos."""
|
|
|
|
from typing import Optional, List
|
|
from datetime import datetime
|
|
from dataclasses import dataclass
|
|
from .database import db
|
|
|
|
|
|
@dataclass
|
|
class Event:
|
|
"""Modelo de Event."""
|
|
id: int
|
|
created_at: str
|
|
level: str
|
|
job_id: Optional[str]
|
|
message: str
|
|
|
|
|
|
class EventRepository:
|
|
"""Repositorio para operaciones con eventos."""
|
|
|
|
@staticmethod
|
|
def create(
|
|
level: str,
|
|
message: str,
|
|
job_id: Optional[str] = None
|
|
) -> int:
|
|
"""
|
|
Crea un nuevo evento.
|
|
|
|
Args:
|
|
level: Nivel del evento (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
message: Mensaje del evento
|
|
job_id: ID del job asociado (opcional)
|
|
|
|
Returns:
|
|
ID del evento creado
|
|
"""
|
|
now = datetime.utcnow().isoformat()
|
|
cursor = db.execute("""
|
|
INSERT INTO events (created_at, level, job_id, message)
|
|
VALUES (?, ?, ?, ?)
|
|
""", (now, level, job_id, message))
|
|
|
|
return cursor.lastrowid
|
|
|
|
@staticmethod
|
|
def get_all(
|
|
level: Optional[str] = None,
|
|
job_id: Optional[str] = None,
|
|
limit: int = 100
|
|
) -> List[Event]:
|
|
"""
|
|
Obtiene eventos con filtros opcionales.
|
|
|
|
Args:
|
|
level: Filtrar por nivel
|
|
job_id: Filtrar por job
|
|
limit: Límite de resultados
|
|
|
|
Returns:
|
|
Lista de eventos
|
|
"""
|
|
query = "SELECT * FROM events WHERE 1=1"
|
|
params = []
|
|
|
|
if level:
|
|
query += " AND level = ?"
|
|
params.append(level)
|
|
if job_id:
|
|
query += " AND job_id = ?"
|
|
params.append(job_id)
|
|
|
|
query += f" ORDER BY created_at DESC LIMIT {limit}"
|
|
|
|
rows = db.fetchall(query, tuple(params))
|
|
return [Event(**dict(row)) for row in rows]
|